Lambdaカクテル

Common LISPが好きなWeb屋さんです 自宅サーバやフロントエンドもできます

Arduino FioとXBee S6BでWi-Fi経由のシリアル通信

f:id:Windymelt:20160828215034j:plain

さいきんIoTなものを作りたくて,作りたいうちに作っちゃえというわけで近所のマルツパーツ館に行ってきました.

今回はWi-Fiにつながるデバイスを作ろうかと思います.そのうちセンサを取り付けてデータをサーバに出力したいところですが,今回はひとまず試験信号を流すまでやります.技術的には,XBeeWi-Fiアクセスポイントに接続・TCP 9750番ポートで待機させ,入出力をFioに転送させます.Fioは,XBeeの設定と試験信号の送出を担当します.

部品

  • Arduino Fio
    • いきなりXBeeと接続でき,リチウムイオンバッテリーの充電もできるArduino
    • ロジックレベルはCMOS(3.3V).充電用の5VインターフェースもあるのでUSB給電が可能.
    • 買ったやつにはAtmega328Pが載っていた.
  • XBee S6B
    • いわゆるXBee wifi.今回はホイップアンテナ型です.Fioよりも高価.
    • Wi-Fi802.11b/g/nに対応するようだ.11n使えるのか・・・(驚愕)

その他必要なもの

  • リチウムイオンバッテリー(3.7V)
  • AVRISP mkII
    • FioのUSB-miniBソケットは充電用なので,別途プログラミング用のインターフェイスが必要.
  • ピンヘッダとピンソケット(14pinx1列を2つ,3pinx1列を2つ)
    • たまに忘れて後で泣くことになるので,ちゃんと買おう.14pinサイズが無かったので,10pinと4pinとを2つずつ買いました.
    • 3pinを2つ買っているのはFioへの書き込みに必要なISP端子の分です.

お好みで

  • タカチ SW130S
    • プラケース.FioとXBeeとバッテリーがだいたい収まって,とにかく丁度良い.アンテナは収まらないので潔く穴を開けよう.
  • 穴を開ける任意の工具
    • プラケースに穴を開けるのに必要
  • サンハヤトバイルケース用Mini基板(UB-FSK01WH)
    • プラケースにちょうどいいサイズ.もともとはFRISKのケースに収まることを想定しているらしい.買ったけど使わなかった.
  • 各種はんだ工具
    • ふつう持ってるよね.

動作確認やスケッチの書き込みには,Mac OSX El Capitan(10.11.6)を使いました.

f:id:Windymelt:20160828164327j:plain

組み立てる

部品を買ってきたのでとにかく組み立てましょう.とはいってもはんだを付けて組み立てるだけです.

ピンヘッダをはんだ付けする

ピンヘッダの端っこのピンだけまずはんだ付けして,垂直にすっぽり差し込まれているかを確認してから全部はんだ付けすると失敗しないです.

基板の白くパーツの形がプリントされている側に部品を実装していきます. 僕はおっちょこちょいなので,逆面に実装して泣いた経験が何度もあります.

XBeeを取り付ける

基板にそれっぽいプリントがあるので,その方向に従って差し込みます.いきなり片足を全部差し込むとピンが曲がって悲しいことになります.様子を見ながら差し込みましょう.

写真のように,台形のシルエットがシルクプリントされています.

f:id:Windymelt:20160828215429j:plain

バッテリーを取り付ける

Fioの電源スイッチをOFFにしてから,バッテリープラグをソケットの向きに合わせて差し込みます.向きは間違えないはず.

電源に接続する

USB-miniBソケットに適当な方法で電源を接続します.黄色い充電LEDが点燈します.

最近miniB端子あまり見ませんね.僕はmicro端子は小さすぎてあまり好きではありません.

ケースに入れる

ケースに入れてニヤニヤします.一通りニヤニヤしたら,ケースから取り出します.

コーディング(XBee S6Bの設定)

組み立てが終わりました.FioがXBeeを介してデータを出力できるようにコーディングをしていきます.

XBeeの設定

XBeeはUSBアダプタに接続して,X-CTUというツールを使って設定するのが巷ではメジャーなやり方ですが,僕はうっかりアダプタを買い忘れてしまいました. とはいえ,XBeeの設定インターフェイスは古式ゆかしいシリアルATコマンドです.PCからUSB経由で設定しようと,Fioからシリアル経由で設定しようと同じです*1.そういうわけでFioにXBeeの設定もやってもらいましょう.

FioからXBeeの設定を行う手順は以下の通りです:

  1. XBeeの設定を行うためのATコマンドを用意する.
  2. ATコマンド群をシリアルに書き出すためのArduinoスケッチを用意する.
  3. ArduinoスケッチをAVRISP mkiiでFioに書き込む.
  4. FioはXBeeを自動設定してWi-Fiに接続してくる.

XBeeのATコマンドは別段難しくありません.さっそく設定していきましょう.

ATコマンド

XBee S6BのATコマンドはdigi.comのデータシートを参照すると読むことができます.ここでは必要最小限に説明を行います.ATコマンドは,コマンドの頭にATが前置されます.

必要なATコマンドは以下の通りです:

  • +++
    • XBeeをConfiguration Modeに移行させるコマンドです.
  • ID
    • 接続するアクセスポイントのSSIDを設定するコマンドです.
  • EE
    • Wi-Fiの暗号化モードを設定するコマンドです.
    • 引数に1を与えるとWPAで,2を与えるとWPA2で接続しようとします.03とはそれぞれ非暗号化オプションとWEPですが,いまどき使わないほうが良いでしょう.
  • PK
  • IP
    • UDPTCPかのどちらを使用するかを設定するコマンドです.
    • 引数に0を与えるとUDPで,1を与えるとTCPで通信しようとします.
  • AC
    • 設定を反映するコマンドです.
  • (WR)
    • 不揮発メモリに設定を書き込み,永続化させるコマンドです.今回は使いませんでした.
  • CN
    • Configuration Modeから脱出するコマンドです.

XBeeの設定は,

  1. XBeeをConfiguration Modeに移行させる
  2. 設定を送信する
  3. 設定を反映させる
  4. XBeeをConfiguration Modeから脱出させる

という流れで行います.

Configuration Mode

XBeeをConfiguration Modeに移行するには,一定の手順が必要です.

  1. 何もせず1秒待つ
  2. +++を送信する(改行は送信しない)
  3. さらに1秒待つ

この手順を破るとXBeeは通常モードに抜けてしまいます. したがってFioに書き込むコードにもこの手順を守ってもらうことにします.

また,各コマンドの反映には少し時間がかかることが予想されるので,コマンドの送信後に一定時間の待ちを行うことにします.

コード

最終的に送信するATコマンドは以下のようになります.XBeeのConfiguration Modeでは,改行にCR(復帰文字)を使います(例中では\rとした). 今回はWPA2による暗号化を設定し,TCP通信をさせています.

+++
atid 接続したいSSID\r
atee 2\r
atpk パスフレーズ\r
atip 1\r
atac\r
atcn\r
スケッチ

前述のATコマンドを送信するためのスケッチは以下の通りです:

Arduino FioとXBee S6B(Wi-Fi)で,XBeeを設定しTCP経由でテスト信号を送 ...

内容はそのまんまなので,特段の説明は行いません.

スケッチを転送する

今回はAVRISP mkiiを使いますが,他のライタでも動くと思います.

まずFioとAVRISP mkiiを接続します.FioのISPピンヘッダとAVRISP mkiiのピンソケットとにそれぞれ目印があるので,これが合わさるようにします.

写真の青色で強調した部分が,それぞれの目印です.Fio基板には目印としてピンヘッダのシルク印刷に傍線が引かれています.AVRISP mkiiはソケットに三角形の目印を備えています.

f:id:Windymelt:20160828222100j:plain

f:id:Windymelt:20160828222116j:plain

Arduino IDEの[スケッチ]→[書込装置を使って書き込む]を選択すると,あっさり書き込まれるはずです.

うまくいかないときは,[スケッチ]→[コンパイルしたバイナリを出力]を選択し,スケッチファイルと同じディレクトリに出力されたHEXファイルをavrdudeなどのツールを使って手動で書き込みます.

書き込みが終わったことを確認したら,ISPコネクタからAVRISP mkiiを取り外してFioのリセットスイッチを押します.

通信確認

XBeeのUSBアダプタがないので,いまのところどのIPアドレスXBeeが待機しているかを知る術がありません. 幸運にもXBeeの裏にはMACアドレスが印刷されているので,Fioが停止している時と起動している時とでそれぞれping broadcastを行い,IPアドレスの目星を付けることにします.目星が付いたら,arpコマンドでMACアドレスを確認します(例ではMACアドレスは隠しています).

写真の青で強調している部分にMACアドレスが印刷されています.

f:id:Windymelt:20160828221709j:plain

$ ping 255.255.255.255
...
64 bytes from 192.168.0.34: icmp_seq=0 ttl=64 time=54.522 ms
...
^C

$ arp 192.168.0.34
? (192.168.0.34) at xx:xx:xx:xx:xx:xx on en1 ifscope [ethernet]

IPアドレスが分かったら,telnetで接続してみましょう.VVVが1秒おきに表示されるはずです. 気が済むまでVVVを眺めたら,Ctrl-]を送信してtelnetのプロンプトに移行し,closeコマンドで切断します.

# XBee S6Bのデフォルトポートは9750
$ telnet 192.168.0.34 9750
Trying 192.168.0.34...
Connected to 192.168.0.34.
Escape character is '^]'.
VVV
VVV
VVV
VVV
^]
telnet> close
Connection closed.

まとめ

Arduino FioとXBee S6Bを使って,指定したSSIDWi-Fiネットワークに接続することができました. また,FioとPCとがXBeeを介してシリアル通信を行うことができました.

今後は,各種センサの入力をシリアルコンソールに出力したり,PCから任意の入力をFioに渡してサーボモータなどを動かすことができそうです. また,Fioが通信を待ち受けるだけでなく,任意のサーバに自ら接続してデータを投稿できるようになるでしょう.

qiita.com

Fioへの書き込み時にXBeeを外しておく,という流派もあるようです.書き込みがうまくいかないときは試してみてください.

ちなみに9000円強かかりました.XBeeもうちょっと安くなってほしい.

実験失敗したこと

linux - Create a virtual serial port connection over TCP - Stack Overflow によれば,socatコマンドにより任意のTCP接続を擬似的にシリアルポートとして認識させられるようです.これをうまく使えば遠隔スケッチ書き込みができるのではないかと画策したのですが,見事失敗しました.スケッチの書き込みにはリセット信号を送信する必要があるようです.

ギャラリー

f:id:Windymelt:20160828170942j:plain

↑横から見た.

f:id:Windymelt:20160828215007j:plain

↑センサがないから使わなかったなあ.

f:id:Windymelt:20160828215107j:plain

↑裏から.なんともマヌケな絵ですね.

f:id:Windymelt:20160828215157j:plain

↑この子がAVRISP mkii.持っておくと便利.

参考文献

XBee S6B データシート funnel.cc | Hardware / FIO XBee Wi-Fi 接続の設定までやってみた Chick Lab TETRASTYLE-dev-BLOG: Arduino Fio (導入篇)

今すぐ買おう

君も今からIoTマスターだ.

XBee WiFi(S6B) / ワイヤアンテナ型

XBee WiFi(S6B) / ワイヤアンテナ型

Fio v3 - ATmega32U4

Fio v3 - ATmega32U4

↑USBから充電だけでなくスケッチ書き込みもできるモデル.

タカチ電機工業 SW型プラスチックケース SW-130S

タカチ電機工業 SW型プラスチックケース SW-130S

*1:XBeeによってはちゃんとX-CTUを使わないといけないモデルもあるようです.とにかく,XBee S6Bでは設定できます.