ATmegaとのシリアル通信~AVRLibの導入

ATMEGA88を使うことにしたのですが、シリアル制御を一から作るのも面倒くさい、ということで、ちょっと古いようですが、AVRLibを試してみることにしました。

まず、ZIPファイルをダウンロードしてきて、展開します。
環境変数AVRLIBに avrlib のディレクトリ位置を(avrlibの名前を)設定して、rprintf のサンプルディレクトリに移動。
makeすると、makeはされるのですが、ATmega163用にmakeされてしまいます。
今回のターゲットはATmega88なので修正を試みます。

現状の修正箇所は、

  1. サンプルプログラムの makefile の MCU の定義
    「MCU=atmega88」に書き直します。
  2. サンプルプログラムの makefile の AVRLIB の設定
    環境変数ではなく、ここで記述してみます。(未検証)
    AVRLIB = /(ほげほげ)/AVR-PROJ/avrlib
  3. サンプルプログラムの makefile の SRC の設定
    timer.c を使うとレジスタ定義が異なるので、timerx8.c に変更
  4. サンプルプログラムの makefile の終わりの方の依存関係(dependencies)の修正
    「timer.o : timer.c timer.h global.h」を「timer.o : timerx8.c timerx8.h global.h」に修正
  5. global.h の F_CPUの値の修正
    現状、7372800 が選択されているが、内蔵8MHzを使用するので、8000000に修正
    サンプルプログラムのプロジェクトディレクトリにも global.h がいるので、そちらも直す。
  6. 最近のGCCならCOFファイルはなくても大丈夫だったような気がするので、avrproj_make の「all :」の依存ファイルから $(TRG).cof を削除
  7. どうせなら書込みまでやってしまいたいので、avrproj_make の最後に

    ###### BLOCK 12) make instruction to delete created files ######prog: all
    avrdude $(WRITER) -p $(WRITER_MCU) -F -U flash:w:$(TRG).hex -U eeprom:w:$(TRG).eep -U efuse:w:$(EFUSE):m -U hfuse:w:$(HFUSE):m -U lfuse:w:$(LFUSE):m

    を追加。(このままだと拡張ヒューズビット無しのCPUに書くとき困るけど、とりあえずそのままで・・・)

  8. 同じくサンプルのmakefileに

    # FUSE BIT for ATMEGA88/168(default is E=0x01/H=0xDF/L=0x62)
    EFUSE = 0x01
    HFUSE = 0xDF
    # LHUSE = 0x62
    LHUSE = 0xe2# WRITER parameter
    WRITER = -c avrispmkII -P usb
    WRITER_MCU = m88

    を追加

とすることで、rprintfのテストを実施が通るようになりました。(サンプルプログラムの方の global.h を修正し忘れていて、通信速度がおかしく、しばらく悩んでしまいました・・・)

無事にシリアル通信が通るようになりました!

 

秋月ZigBeeモジュールの先にAVRをつなぐ

XBeeによって、リモートUARTの環境を構築、ループバック動作を確認できたので、その先のコントローラとして、AVRをつないでみることにしました。AVRにしたのは、Linux環境で閉じた開発ができるからということと、手持ちに ATmega88 が何個か転がっていた(PIC24FJ64も転がっていますが・・・)からです。

Zigbee子機をもう少し大きめのブレッドボードに移植し、ATmega88と同居させました。
・・・といっても、写真では見えないですね。書込みは AVRISPmkII で行っています。
ISP用の端子6本は写真右側に写っているブレッドボード用の自作アダプタを介してその下のATmega88につながっています。

その他、シリアル通信用の端子をXBeeとの間で接続しました。

このATmega88に対してシリアルでコマンド/ステータス通信をさせるようにしていきます。

LinuxでFTDIのFT232RLを使う(3) X-CTUをWINE経由で使う

もっとダイレクトにX-CTUをWINEで使っている方がいるようなので、試してみました。

  1. X-CTUのインストーラに実行権限を付ける
  2. X-CTUのインストーラをWINE経由で実行させ、インストールを行う。
  3. WINEに仮想COMポートを認識させるため、デバイスファイルへのシンボリックリンクを貼る
    「 ln -s /dev/ttyUSB1 /home/tom/.wine/dosdevices/com11」として、Windowsから見たCOM11を作成する。
  4. X-CTUを起動する。
  5. Windowsであれば、全てのCOMポートを勝手に検出してくれますが、WINEでは上手くいきません。そこで、X-CTUの「PC Setting」の項目で、「Add User Com Port」のところにポート番号(上記のCOM11の場合は「11」)を入れて、「Add」を押してポートの存在を教えてやります。
  6. 『Test/Query』を実行する

で接続確認ができます。しかし、残念ながら、Modem Configuration のタブはファームウェアが見つからないとかで、ダウンロードを試みるのですが、それでもみつからないということで、動作しませんでした。ま、ターミナルが動くだけでもずいぶん助かりますので、よしとします。

LinuxでFTDIのFT232RLを使う(2) ターミナルソフト編

続いて、通信ターミナルです。
通信ターミナルは、Minicomを使ってみることにしました。例によってSynapticからインストールします。
Minicomはモデムでの通信用のソフトなので、そのまま起動するとモデムを初期化しようとします。
そこで、minicom -s で設定画面に入り、モデム初期化文字列を全て消去します。
その後、設定ファイルを保存するのですが、/etc/minicom の下に保存しようとするため、このディレクトリのパーミッションを開けておきます。保存されたファイルを以下に示します。

$ cat minirc.dfl
# Machine-generated file – use “minicom -s” to change parameters.
pu port /dev/ttyUSB1
pu baudrate 9600
pu minit
pu mreset
pu mdialpre
pu mdialsuf
pu mdialpre2
pu mdialsuf2
pu mdialpre3
pu mdialsuf3
pu mconnect
pu mnocon1
pu mnocon2
pu mnocon3
pu mnocon4 VOICE
pu localecho Yes
$

ただ、ポートは場合によって変わるので、dmesgなどで確認した後変更が必要です。

これで一応、XBeeをコントロールすることはできるのですが、改行の処理は今ひとつ上手くいきません。
まあ、動作しているかどうかの確認くらいはできますが・・・。

LinuxでFTDIのFT232RLを使う(1) ドライバ編

ZigBeeモジュールであるXBeeが動き始めたのですが、できればこれをLinuxマシンに接続して動かしたいと思っています。すなわち、秋月のFT232RLモジュールをLinuxで使いたいのです。

早速、FTDIのサイトを見てみると、Linux版のドライバも存在しています。そのコメント欄を見ると、「Included in 2.6.31 kernel and later」と書かれています。つまり、2.6.31以降のカーネルであれば初めから入っていそうです。

そこで、コンソールを開いて見てみると、

>$ uname -a
Linux atom 2.6.32-26-generic #48-Ubuntu SMP Wed Nov 24 09:00:03 UTC 2010 i686 GNU/Linux

ということで、2.6.32なので大丈夫そうです。
おそるおそる、Linuxマシンに挿してみると、

$ dmesg
[56118.520287] usb 1-7.3: new full speed USB device using ehci_hcd and address 4
[56118.618644] usb 1-7.3: configuration #1 chosen from 1 choice
[56119.069612] USB Serial support registered for FTDI USB Serial Device
[56119.069790] ftdi_sio 1-7.3:1.0: FTDI USB Serial Device converter detected
[56119.069853] usb 1-7.3: Detected FT232RL
[56119.069858] usb 1-7.3: Number of endpoints 2
[56119.069864] usb 1-7.3: Endpoint 1 MaxPacketSize 64
[56119.069869] usb 1-7.3: Endpoint 2 MaxPacketSize 64
[56119.069873] usb 1-7.3: Setting MaxPacketSize 64
[56119.070318] usb 1-7.3: FTDI USB Serial Device converter now attached to ttyUSB1
[56119.070362] usbcore: registered new interface driver ftdi_sio
[56119.070367] ftdi_sio: v1.5.0:USB FTDI Serial Converters Driver
$

ということで、ttyUSB1として認識されているようです。ただし、

$ ls -la /dev/ttyUSB*
crw-rw—- 1 root dialout 188, 0 2010-12-08 07:31 /dev/ttyUSB0
crw-rw—- 1 root dialout 188, 1 2010-12-08 23:06 /dev/ttyUSB1
$

となっているので、dialoutグループに自分のユーザ名が入っていないといけないようです。

ZigBeeモジュール通信テスト

秋月電子で買ってきたZigBeeモジュール(XBee)ですが、ようやく通信テストにこぎつけました。

まず、子機(写真では下側のXBee)に電源を供給するため、ニッケル水素電池から3.3Vを供給する子基板(写真では縦になっていてわかりにくいですが、スイッチと3.3Vのロードロップレギュレータとコンデンサ、ポリスイッチが載っているだけです)を作りました。そして以下のように接続しています。

  • XBeeの1ピンに3.3Vを供給
  • XBeeの2ピンと3ピンを接続(ループバック状態)
  • XBeeの10ピンをGNDに接続
  • XBeeの15ピンをLEDに接続
  • XBeeの20ピンはハーネスを挿してあるだけ(必要に応じてGNDにチョンチョン、とつなぐ)

親機(写真では上側のXBee)は単体でのテストから少し変えて、XBeeの13ピンをLEDに接続していたのを15ピンに変更することで、XBeeの動作状態が多少でもわかるようにしています。

20ピンは、こちらのページに記載のあった
  • プッシュスイッチ1回でネットワークへの参加。他のXBeeモジュールのLEDが1秒間高速点滅。
  • プッシュスイッチ4回で他のネットワークへ参加してしまった場合にネットワーク設定を消去してソフトリセットする。
のに使っています。
設定は、X-CTUを使って以下の設定を行いました。
  • 親機側のFunction Setを「ZIGBEE CORDINATOR AT」に変更して「WRITE」
    (これはネットワーク内に1台必要なのだそうです)
  • 両方のDH/DLパラメータを相手のシリアルナンバー(SH/DL)に変更して「WRITE」
これで、以降は電源ONでつながるようになりました。この状態なら、1対1接続であれば以降はXBeeの存在を意識することなく使えることになります。
さらに、X-CTUのRangeTestを使って、到達距離を確認してみました。当方は鉄筋コンクリートのマンション住まい(いわゆる3LDKのごく普通の間取りです)で、PCのある部屋は共用通路側です。XBeeはベランダにおいて、太陽電池動作で温度や湿度、気圧などを遠隔で測ってみたい、と思って購入しましたので、まずベランダに子機側を置いて試してみました。間にあるものと言えば、専有部の壁、水回り(洗面所、風呂場)、和室の押入れ和室の窓などで、距離にして15メートルくらいでしょうか。結果としては、まったく通信できませんでした。
距離を短くして、リビングルームの近い側に置いたのですが、通る確率は10%くらいでやはりダメ。廊下を挟んで反対側の寝室のベッドの上では概ね通信できるのですが、それでもエラーが発生するような状態でした。この時の状態は、距離にして5メートルくらい。専有部内の壁〔おそらく薄いスチール+石膏ボードだったと思う〕が2枚ある感じです。親機側はPCがそばにあったり、LCDモニタが2枚すぐまん前にあったりして状態がよくないのですが、それにしても鉄筋コンクリート環境ではかなり通信距離は短いようです。
今度秋月電子に出かけたときには、送信出力の大きいXBeeProを入手したいと思います。
≪参考にしたページ≫
  • ボクにもわかる地上デジタル – 地デジ方式編 – ZigBee無線リモコン –

秋月ZigBeeモジュールとの接続テスト

なんとかブレッドボードに載るようになったXBeeですが、X-CTUを使ってモジュールとの接続テストを実施しました。

右側のXBeeはまだ何もつないでいません

XBeeの電源は3.3Vの50mA以下ですので、秋月電子のFT232RLモジュールから供給させることにしました。接続は以下の通りです。

  • XBeeの1ピン(VCC)とAE-UM232RLの19ピン(3V3)
  • XBeeの2ピン(DOUT)とAE-UM232RLの5ピン(RXD)
  • XBeeの3ピン(DIN)とAE-UM232RLの1ピン(TXD)
  • XBeeの10ピン(GND)とAE-UM232RLの24ピン(GND)
  • XBeeの12ピン(CTS#/out)とAE-UM232RLの10ピン(CTS#/in)
  • XBeeの13ピン(ON)を抵抗・LEDを通してGNDへ
  • XBeeの16ピン(RTS#/in)とAE-UM232RLの3ピン(RTS#/out)
  • XBeeの1ピン(VCC)とAE-UM232RLの24ピン(GND)

WindowsXPマシンにFT232RLのドライバは元々入っていましたので、PCに接続し、COMポートを確認して、Modem ConfigurationのタブでReadを押すと、以下のように設定情報を読み取ることができました。

このままモジュール間の接続テストを行いたいところですが、FT232RLの供給可能な電流は50mA、XBeeの消費電流は最大45mAです。電流容量が不足しており、1つのFT232RLから供給することはできませんので、ここまでとしました。

秋月でZigBeeモジュールを買ってきた!

土曜日に秋月電子に行ってきたので、先日から気になっていたXBeeモジュールを買ってきました。

通信相手がいなければ意味がないので2個買ってきました。
写真では見えないですが、2ミリピッチのコネクタも付いています。

XBeeとXBeeProの両方があったのでちょっと焦りましたが、送信出力の差のようですので、今回はProではないZigBeeの方を選択しました。
すでに調べていた通り、このモジュールは2ミリピッチのコネクタで外部と接続しますので、通常のユニバーサル基板やブレッドボードに搭載するには何らかの工夫が必要になります。定番は、スイッチサイエンスのピッチ変換基板なのでしょうが、実験は横着して直接半田付けしてしまうつもりでいました。
・・・が、秋月店内を見回していたら、2ミリピッチのユニバーサルボードがありました。そこでこれを使って、こんなものを作ってみました。

ガラスエポキシ基板どうしなので、2液混合のエポキシ系接着剤でガッチリ
固定できます。元の基板と変わらないくらいの強度が出ます。

見たまんまですが、2.54ミリピッチのユニバーサル基板を細く切り出し、半分に切った2ミリピッチのユニバーサルボードとエポキシ系の2液混合タイプの接着剤で接着しました。
そして2.54ミリピッチの部分にはピンヘッダを、2ミリピッチの部分にはZigBeeに同梱されているソケットを半田付けし、その間を1対1で接続してあります。

今日のところは疲れたのでここまでです。

JPEGのEXIFデータ編集をUbuntuでやってみる

今作っているものの写真をアップロードしようかと思っているのだが、JPEGにはEXIFデータという撮影日時やGPSに基づく撮影場所などが併せて記録されていて、注意しないと自宅の場所を全世界に大公開、ということになってしまう。

そこで、Linux(Ubuntu)でEXIFデータの編集方法を調べてみると、jhead というのが比較的一般的なようである。例によって Synapticパッケージマネージャで検索すると、パッケージとして存在しているので、インストール指定をすると、依存するlibjpeg-progsというのも併せてインストールするか聞いてきたので、チェックマークをつけて、インストールを行う。インストールはあっという間に終わる。

コンソールを開いて、

$ jhead -h

とすると、簡単な使い方が出てくる。
自分が狙う使い方は、

$ jhead [options] files

で自分が使いそうなオプションとしては、

  • -mkexif
    新しい最小限のEXIFセクションを作成する(既存のEXIFは上書きされる)
  • -purejpg
    全ての不要なデータをJPEGから削除する
    (ここで言っているJPEGがEXIFを含まないJPEG規格そのものを指しているのだろうか??)

だけだろう。

早速、試してみることにする。まず、適用前の写真のうちの1枚のEXIFは以下のようになっている。(ファイルブラウザを右クリックしてプロパティを表示した)

ごらんの通り、デジカメはDSC-HX5Vで2010年9月21日に撮影したということがわかる。画像のサイズは、撮影時は最大解像度で撮影しているのだが、写真を探したりPCで見たりする場合には大きすぎて遅いので、irfanviewで一括解像度変換をかけて縦横の長辺が1200画素になるようにしてある。ツールによってはこの時にEXIFデータが落ちるものもあるようだが、irfanviewはEXIFデータはGPSデータを含めて保存されるので、GoogleEarthなどで撮影場所などの表示ができて自分で楽しむ分には非常に楽しい。一方で、余計な情報を含んでいるので、このままWebに使うには危険なのである。

そこで、写真が保存されているディレクトリにて、

$ jhead -mkexif *

とすると、フォルダ内の画像ファイルの余計なEXIFをすべて初期化してくれる。消去後の同じファイルの情報を確認すると以下のようにすっきりしたものになっていることが確認できる。

ただ、すべて消えるのかと思っていたが、それでも撮影日時だけは残っている。
そこで、

$ jhead -purejpg *

とすると、

となって、日付情報もなくなった。これで安心してアップロードができる。
アップロードするファイルが集めてある素材候補のフォルダがあれば、上位ディレクトリなどで、

$ jhead -purejpg */*
などとすると、一つ下の階層のディレクトリのJPEGファイルが一気に処理できるので楽ちん。

 

EagleCAD設計メモ ~そんなに甘くなかった~

EagleCADでの設計&OLIMEXへの発注を目指しているのだが、ライブラリについてはそんなに甘くなかったようである。ライブラリを選別して、そこから基板を設計すればいいかと思っていたのだが、いろいろと落とし穴があるようである。

まず、ULPの statistic-brd.ulp にパターンをかけると設計したボードの統計情報がとれるようなのだが、いろいろと問題がありそうである。うーむ、と思って調べてみたところ、皆さんいろいろ苦労しているようなのである。

「DRILL/HOLE」のシートを見ると、使用しているドリルが、0.6mm、0.8mm、1.0mm、1.1mmの4種類になってしまった。OLIMEXの標準は0.7mm、0.9mm、1.0mm、1.1mm、1.3mm、1.5mm、2.1mm、3.3mmだけなので、0.6mmと0.8mmは非標準である。

「BOARD」のシートを見ると、

・0.2540 - Wire width < 0.3000
・0.2540 - Pad Restring < 0.3000
・0.2032 - Via Restring < 0.3000
・0.2540 - Clearance < 0.3000
・0.0000 - Isolate Polygon < 0.3000
のところに黄色い「!」マークがついている。DRCでは10milsでOKになっているにも関わらず、3番目のVia Restringの部分が 8mils となっているので、実働15日コースになってしまう。

また、使用しているレイヤーは、

1 Top
16 Bottom
17 Pads
18 Vias
20 Dimension
21 tPlace
23 tOrigins
24 bOrigins
25 tNames
26 bNames
27 tValues
28 bValues
29 tStop
30 bStop
32 bCream
36 bGlue
40 bKeepout
44 Drills
51 tDocu

52 bDocu
となっている。赤字はこちらのページで紹介されているOLIMEX標準レイヤである。(OLIMEXのページで見つけられなかった・・・と思ったら、このページの真ん中辺りに、「IMPORTANT! When you send Eagle .BRD files for processing please note that we process only with EAGLE’s DEFAULT post-processor setings: TOP: Layers 1, 17, 18; BOTTOM: Layers 16, 17, 18; SILK: Layers 20, 21, 25; TOPMASK: Layer 29; BOTTOM MASK: Layer 30 If you put information on other layers please post-process the BRD file by yourself and switch ON the layers you are using, then send us the Gerbers and NC drills for manufacturing.」という記載がありました。)

ライブラリは実際に使うものを一点一点確認しながら集めるしかないのかも。

≪参考にしたページ≫
OLIMEXで基板を作る
EAGLE and OLIMEX