2013/05/31

シェルスクリプトの if 文のおぼえがき

とりあえずよく忘れるものだけ。

ファイルの更新日時を比較

if [ file1.c -nt file2.c ]; then
    echo "file1 is new"
else
    echo "file1 is old"
fi

-nt は newer than です。 -ot では older than になります。

ファイルの内容を比較

if [ "`cmp file1.c file2.c`" ]; then
    echo "differ"
else
    echo "equal"
fi

条件式の中をダブルクォートで囲まないと、-bash: [: too many arguments といわれます。

ファイルの存在をしらべる

if [ -e file1.c ]; then
    echo "exist"
fi

if ! [ -e file1.c ]; then
    echo "NOT exist"
fi

Eagle のコマンドバーで線を引く

EDAのEagleでコマンドバーで座標を指定して線を引く方法です。

たとえば、部品登録する際にパッケージを描きますが、それの外形線を引くときなどに便利です。

下記のような外形線を引きたいとします。

まず、原点を部品の中央として、4スミの座標を求めます。下のような絵をチラシの裏にでも描くことになるでしょう。

さて座標が決まれば、あとは実際に線を引いていけばいいのですが、せっかく座標がわかっているのに、描画エリアを拡大/縮小しながらマウスでポチポチクリックしていくのはバカバカしいです。ですので、Eagleのウィンドウの上の方にあるコマンドバーに座標を打ち込んでいきます。

たとえば、先ほどの絵で左上の座標から時計回りに入力していく場合は、コマンドバーに下記のように入力します。

wire
(-6.7 12.8)
(6.7 12.8)
(6.7 -12.8)
(-6.7 -12.8)
(-6.7 12.8)

1行目の wire は線を引くコマンドです。2行目以降が座標で、(x y)の形式で指定します。それぞれの行末でEnterキーを入力し、すべての座標を入力し終えたら、ESCキーを押せば wire コマンドから抜けます。なお、コマンドバーでは矢印キーの上下で入力履歴が使えます。

スルーホールやSMDパッドも同様の座標指示で配置できます。

ちなみに、外形線のレイヤと線幅は下記のようにするとよいと思います。

  • レイヤは tPlace か bPlace
  • 線幅はシルクの線幅(例:Olimexでは10mil = 0.254mm)

これらは、changeコマンドや右クリックメニューのPropertiesで変更できます。

2013/05/30

Google日本語入力のユーザ辞書登録

特になんてことはないのですが、Macで Google日本語入力(Google Japanese Input)のユーザ辞書登録をするやり方です。

メニューバーの右の方にある もしくは A というアイコンを右クリックし、Dictionary Tool ...を選択。

そして、 Add ボタンを押して、 Readingに入力語句、Wordに変換後の語句を入れます。

2013/05/29

AVRのタイマー割込みサンプル

1秒ごとにLEDが点滅するサンプルです。

2013/05/27

AVRのSW入力とLED点灯のサンプル

タクトSWを押すとLEDが光るサンプルを置いておきます。

  • LEDはPB0: LO で 点灯
  • SWはPB1: LO で ON

です。

ごく単純なものですが、組込みにおけるHello world!的なものなので、一生のうち何度も書くです。

2013/05/25

C言語の二次元配列の要素数

比較的最近のGCCで二次元配列の初期化をする話しです。

char arr[][] = {{1, 2, 3, 4}, {6, 7, 8, 9}};

などと書くと、コンパイラから次のように文句を言われます。

Error 2 array type has incomplete element type

Warning ではなく Error です。エラーメッセージにはelement typeとあるので、型がおかしいように思えますがそうではなく、単純に要素数を明示してないのが原因です。ですんで、

char arr[2][4] = {{1, 2, 3, 4}, {6, 7, 8, 9}};

といういうふうに、要素数を明記してやれば回避できます。一次元配列では要素数は省略できますが、多次元では省略不可のようです。

GCCの仕様変更によるものらしいです。

RN-42-EK HID接続テスト(キーボード編)

前回のつづきです。

今度はキーボードとして認識させてみます。

RN-42の設定は以下のとおり。

  • S~,6 # HID
  • SH,0200 # キーボード
  • SM,6 # Pairing Mode (キーボードでは必須)
  • SR,BC9A78xxxxxx # 接続先PCのアドレス(必須ではない)

コマンドモードで上記を設定した後に RN-42 の電源を切/入し、PCのBluetooth管理でキーボードとして認識させます。

あとはマウスの時と同様にTeraTerm からレポートを送信してテストします。

キーボード用のレポートは1つにつき11バイトで構成されますが、キーボードの場合は通常、押す/離すでレポートを2つ送信することが多いです。

FD 09 01 04 00 0B 00 00 00 00 00   ; Alt+h
FD 09 01 00 00 00 00 00 00 00 00   ; release all

ここでは2列で書いていますが、バイナリファイルにする場合は下記のように連続して書き、22バイトとします。

無事レポートが届けば、RN-42が Alt+hを押してくれるので、下記のようにTeraTermのヘルプメニューがプルダウンします。

2013/05/24

RN-42-EK HID接続テスト(マウス編)

遅ればせながら、Bluetoothモジュール RN-42 の評価基板をテストしています。

HIDマウスとしての動作を確認できたので、その記念動画です。

この状態ではまだマイコン等は接続しておらず、Mac --> (USB SERIAL) --> RN-42-EK --> (Bluetooth) --> Mac というループバック環境です。

MacでのBluetoothの接続状態は下のような感じです。

FireFly-XXXX として認識されています。これが Connected(緑色)なら接続は正常です。この状態で、RN-42 の UART(RxD) に対して マウス用のレポートを送信すれば、マウスとして動作します。

レポートは(テストなので)Macからシリアル通信で送ります。

Mac > Parallels Desktop > Win XP > COM4(USB Serial) > TeraTerm > ファイル > ファイル送信 > バイナリファイル で送信。

マウスのレポート用のバイナリファイルは下記のような7バイトです。

FD 05 02 00 0A 00 00

この例では0AがX座標の移動量です。これを送信した瞬間に、マウスポインタが右に43ピクセルほど移動します。レポートの移動量と画面上の移動量が一致していませんが、これはおいおい調べることにします。

以下は RN-42 の設定です。

  • S~,6 # HID
  • SH,0220 # マウス
  • SM,6 # Pairing Mode (必須ではない)
  • SR,BC9A78xxxxxx # 接続先PCのアドレス(必須ではない)

以下、メモ書きです。

  • レポート送信用のボーレートは9600, 115200 bps で正常動作を確認済み
  • HIDとして接続中は $$$ によるコマンドモードには入れない
  • コマンドモードに入るには PCのBluetooth管理でFireFly-XXXXを削除(disconnect ではなく、remove)した後に、Teraterm から $$$を入力する
  • さらに、RN-42 のTXD/RXD をオープンになっていないと、Teraterm から $$$ が届かない模様
  • ほかのHIDデバイス(キーボードなど)に切り替えるときは、コマンドモードで SH,0200 としたあと、RN-42 の電源を切/入し、PCのBluetooth管理でキーボードとして認識させる

2013/05/16

AVRのUARTのサンプルその2

以前のこれのつづきです。

割り込みによる送受信とリングバッファを追加したものです。

若干納得が行かないところもありますが、とりあえず使えます。

リングバッファモジュール

前回のコレをモジュール化しました。

動きは同じです。

リングバッファのサンプル

通信などに用いるリングバッファのサンプルです。

このサンプルでは、バッファの状態をグラフィカル(笑)に表示するので動きがわかりやすいかもしれません。

バッファに書き込むライトポインタとバッファから読み出すリードポインタがあり、ライトポインタはリードポインタを追い越しません。

これにより、まだ読み出されていないデータは上書きされることはありませんが、書こうとしていたデータは捨てられます。

それを防ぐためには、書込み/読出しの頻度差(通信速度差ともいえます)に見合ったバッファサイズに調整する必要があるでしょう。

AVR シリアル通信サンプル その1

UARTのもっとも単純なサンプルを置いておきます。

デバイスはATMEGA88P、クロックは工場出荷状態の内蔵RCオシレータで9600bpsです。

このままでは実用的でないです。

とくに受信部分は割り込み処理とバッファが別途必要ですがそれはまた後日。

2013/05/08

AVR Dragon の debugWIRE 使用上の注意

AVR Studio と AVR Dragon の組み合わせで debugWIRE を使ってデバッグをする方法について書きます。

debugWIRE は 6ピンのISPコネクタで接続するので、結線自体はふつうにISP書き込みするのと同じです。

ただ、debugWIRE を使うには、事前に AVR のフューズビット DWEN を 1 にしておく必要があります。フューズ操作は、デバイスによっては ISP接続ではできないものもあり、 AVR Dragon でそのようなデバイスのフューズを操作するには、ISPコネクタでの接続ではなく HVPP ソケットを使わなければなりません。

ですが、買ったままの AVR Dragon は HVPPソケットはスルーホールパターンのみでソケットは実装されていないので、HVPP を使いたいときは、事前に別途 ZIFソケット等をハンダ付けしておく必要があります。

これらのことは特に、新しい環境だったり初物のマイコンだったりすると割とハマリやすいので、以下に手順を残します。


まずは AVRマイコンの DWEN ビットを ON します。

  1. AVR Studio を起動し AVR Dragon と PC をUSBケーブルでつなぐ。

  2. AVR Dragon の HVPP ソケットに AVRマイコンを差し込む。

  3. AVR Studio > Tools > Device Programming

  4. Interface = HVPP > Apply

  5. 左ペインの Fuses を選択し、 DWEN をチェック。 Program を押す。


次に HVPPソケットから AVRマイコンを外してターゲット基板に実装し、ISPコネクタと接続します。

debugWIRE でデバッグするのに最低限必要な結線を下図に示します。

ここで、ターゲット基板に専用の電源回路がある場合(ふつうはこれ)は、ISPコネクタの 2番ピン(VTG)は接続しません。

ターゲット基板に電源回路がない場合は、しかたないので接続します。ただし、その場合は AVR Dragon から+5Vを供給することになるので、ターゲット回路の電源系は+5Vとなります。もし 3.3V系のICなどが接続されている場合は壊れる可能性があるので注意が必要です。


結線ができたら、あとはふつうにデバッグを始められます。

  1. ターゲット基板の電源を入れます。

  2. Alt + F7 を押して プロジェクトのプロパティを開き、左ペイン > Tool > Selected debugger/programmer = AVR Dragon, Interface = debugWIRE

  3. ソースにブレークポイントを仕掛けて、F5(Continue)します。
    実行中は AVR Dragon の赤LEDは点灯せず、緑が点灯/点滅しています。もし、赤が点灯している場合は何かがおかしいです。

デバッグまでの手順は以上です。


余談その1

上の結線図にもありますが、ISPコネクタの2番(VTG)はターゲット基板に接続する必要はありません。このピンは AVR Dragon から 5V が出力されており、これをターゲット基板の電源として使うこともできますが、単純なブレッドボード上での評価用と割り切ったほうがいいと思います。特にターゲット回路の電源が5Vより低い場合(3.3V系など)はターゲット回路を壊す可能性があるため、このピンはオープンのままのほうが無難です。

余談その2

ブレークポイントを仕掛けても止まらないとか、ローカル変数がウォッチできない場合は、コンパイル時の最適化が効いていることが原因かもしれません。その場合、次のようにして最適化を無効にします。

Alt + F7 を押して プロジェクトのプロパティを開き、左ペイン > Toolchain > AVR/GNU C Compiler > Optimization > Optimization Level = None(-O0)

最適化OFF

余談その3

AVR Dragon のマニュアルによると、大きい方のLED が黄色に光っているときは、AVR Dragon のファームウェアがコンフリクト(?)しているらしいので、ファームウェアをアップデートする必要があります。

余談その4

ISPコネクタでの接続した状態で AVR Studio > Tools > Device Programming > Interface = ISP とした時は Device Signature, Fuses, Lock Bits はどれも読めず、下記のようなダイアログが出ます。

Unable to enter programming mode.

Please verify device selection, interface settings, target power and connections to the target device.

しかし、この動作は正常です。最初に書いたとおり、AVR Dragon でフューズビット等をR/Wするには、ISPコネクタではなく HVPPでの接続でしかできません。つまり AVR Dragon でこの手の操作を行うには、AVR Studio > Tools > Device Programming > Interface = HVPP として、HVPPソケットにAVRマイコンを挿しこんで行います。ダイアログのメッセージを読むと、一見、結線や電源を見なおせばISP接続でも Device Signature 等が読み取れそうに思えますが、この場合はそうではないです。

以下環境です。

  • Mac mini 2011 (OS X 10.8.3 / Mountain Lion)
  • Parallels Desktop 8
  • Windows XP Home SP 3 / Windows 7 Home x64
  • AVR Studio (Atmel Studio) 6.1 / 5.1
  • AVR Dragon

2013/05/07

Parallels Desktop に入れた Windows で、なぜか日本語キーボードになる件

英語キーボードをつないだMacなのに、Parallels Desktop に入れた Windows XP ではなぜか日本語配列になってしまうのを治す方法です。

要はキーボードのドライバを入れなおせば解決するのですが、ちょっと煩雑なのでおぼえがきとして残しておきます。

  1. Windows > スタートボタン > コントロールパネル > キーボード

  2. 「ハードウェア」タブ > 「101/102 英語キーボードまたは …」を選択 > 「プロパティ」ボタン > 「ドライバ」タブ > 「ドライバの更新」ボタン

  3. 「いいえ、今回は接続しません」をチェックして「次へ」 > 「一覧または特定の場所からインストール」をチェックして「次へ」 > 「検索しないで、インストールするドライバを選択する」をチェックして「次へ」 > 「101/102 英語キーボードまたは …」が選択された状態で「次へ」 > 上書きしてもいいか聞いてくるので、「はい」 > 「完了」ボタン

  4. Windows を再起動

これで直るはずです。

下記は、参考までにこちらの環境です。

  • Parallels Desktop 8
  • Windows XP Home/Pro

2013/05/04

Mac でCOMポート

COMポートに何かをつないで通信したいときは、Windows PC の場合は TeraTerm Pro を使うのが定番です。

Macの場合は TeraTerm Pro の代わりに CoolTerm が紹介されていることが多いですが、実は無くてもできてしまいます。

COMポートは /dev/tty.xxxxxxx という名前で列挙されています。このデバイス名さえ分かれば、下記のように screen コマンドを使うことで手軽に通信することができます。

$screen /dev/tty.usbserial-A101XXXX 115200

上記は、FTDIの仮想COMポートに 115200 bps で接続する例です。