2017年3月17日金曜日

IM920をArduinoで利用する[Arduino]

春休みになってからセンサーの読み取りやら保存やらのプログラムを書かされている今日このごろです.
ただ書かされるのも癪なので,ブログの肥やしにしてやります.

1.概要

IM920cという920MHz帯の無線モジュールをArduinoで使う機会があったので,IM920を利用するまでの一連の流れと,その際に参考にしたサイトや注意点,書いたライブラリのコード,IM920のコマンドなどについてをココに書きます.

2.ペアリング

使用するためにはIM920同士をペアリングする必要があります.これについては公式からも割りと豊富な情報が出ています.

無線モジュール・アプリケーションノートペアリングの方法
 公式が出しているPDFです.
IM920同士のペアリング | みやかわのあしあと
 コチラは個人のブログですが,具体的にどう配線してよいかなどはこちらを参考にしたほうが良いかと思います.

余談ですが私はPCとの通信用のインターフェイスを持ち合わせていなかったので,Arduino Pro Miniのシリアル通信モジュールを3.3Vに設定した状態で,以下のように利用しましたが問題なく動作しました.
まずペアリングの方法は,PCとim920を接続した状態でTeraTermを開きます.開く際の設定はデフォルトでは19200 bpsです.
TeraTermではコマンドをコピーした状態でAlt+Rで貼り付けてコマンドを実行します.これはコマンドの終わりには<CR><LF>(復帰記号と改行記号,"\r\n")を付ける必要があるためです.

ペアリングする際にはまず製品ごとに与えられた固有IDを必要とします.im920cでは製品に書かれた6桁の10進数の数字がそれですが,コマンドからも固有IDを読み取ることができます.

「RDID」をコピーした状態で,Alt+Rでコマンド送信すると次のような16進数の数字が返ってきます.
この16進数表記された値が接続しているim920の固有IDです.受信側のim920には,送信側の固有IDを登録する必要があります.登録については次のようなコマンドになります.
ENWR
SRID FFFF
DSWR
FFFFを送信側(相手)のim920の固有ID(16進数表記)にすることで登録が終わります.ちゃんと登録されたかどうかはRRIDコマンドで確認できます.

コマンドの意味などは次の通りです.コマンド一覧はim920のソフトウェアマニュアルで確認できます.
コマンド説明
ENWR不揮発メモリを書込み許可
DSWR不揮発メモリを書込み禁止
SRID FFFF他のID(FFFF,16進数)を登録
RRID登録されたID一覧を確認
ERID登録されたIDを全削除
RDID固有IDの読み出し

登録IDの全削除は
ENWR
ERID
DSWR

3.Arduinoとの配線

配線についてですがコチラも部ブログで紹介されていましたのでそちらを参考にしてもらっても問題ないと思います.

IM920cをArduinoで使う | みやかわのあしあと
IM920cをArduinoで使う – AutumnColor.com

 私の場合はArduino Pro Mini 328 5V 16MHzを利用しています.IM920は3.3V駆動なので5VのICを利用する際には何かしらの方法でレベル変換をさせたほうが良いと思います.

ピンの接続先は以下のとおりです.今回HardwareSerialを使わずにSoftwareSerialを利用します.10pinをRX,11pinをTXとします.

ArduinoIM920 board
3.3vVCC
GNDGND
10(RX)TX
11(TX)RX
見づらいですがim920の端子はこんな感じです.詳細はデータシートとか見てください.

4.プログラム

先ほど紹介したサイトで基本的な入力は可能なのでそちらを利用しても良いとは思いますが,ArduinoのSoftwareSerialは一行ずつ読み取ることが面倒なのでライブラリを作りました.
 以下は私のライブラリを利用してシリアル通信する例です.
 
 まずこのライブラリのGitHubリポジトリからファイルをダウンロードしてArduinoのフォルダ内のlibrariesに追加します.追加後Arduino IDEを再起動してください.

・GitHubリポジトリ (https://github.com/TonyMooori/IM920Driver)

ライブラリを追加した後,以下のコードが書き込めるはずです.

このプログラムは何かしらのデータを受け取ると54,45,53,54(アスキーコードでtest)を返すプログラムです.

Tera Termから「TXDA 5555」(TXDAはIM920のコマンドで,後述します)のようにデータを送ると以下のようにArduinoが返事をします.


一行ずつ読み込みますので自分で文字列を解析するプログラムを実装する場合はコチラのほうが利用しやすいと思います……?

5.IM920のデータ通信形式について

先の画像から分かる通り,IM920は独自コマンドで動作します.コマンドについてはIM920シリーズのソフトウェアマニュアルが公式から出ているのでそちらが参考になります.
IM920ハードウェア取扱説明書

ただ普段利用する際に利用するコマンドについては限られているので代表的なものを示します.

・TXDTコマンド
 8バイト(アスキーコードで8文字)のデータを送信するコマンドです.後述のECIOモードとDCIOモードで動作が異なります.先のPDFに良い表があったので引用します(一部ミスが有ったので修正しました).


コマンド送信側受信側
設定DCIODCIO
データ(例)TXDT4142aa,bbbb,cc:41,42,00,00,00,00,00,00
設定DCIOECIO
データ(例)TXDT4142aa,bbbb,cc:AB
設定ECIOECIO
データ(例)TXDT4142aa,bbbb,cc:4142
設定ECIODCIO
データ(例)TXDT4142aa,bbbb,cc:34,31,34,32,00,00,00,00
(aa,bb,cc:はPDF参照)

DCIOモードでは16進数表記でデータを送ります.
送信側がDCIOモードで「TXDT4142」と入力すると「41,42」というデータが送られます.

受信側は「41,42」というデータを受け取った後,
受信側がDCIOモードならそのまま16進数で「41,42」を表示します,
受信側がECIOモードなら,「41,42」に対応するアスキーコードである文字列"AB"を表示します.

ECIOモードでは文字列形式でデータを送ります.
送信側がECIOモードで「TXDT4142」と入力すると"4142"という文字列として捉えられ,対応するアスキーコードである「34,31,34,32」というデータが送られます.

受信側は「34,31,34,32」というデータを受け取った後,
受信側がDCIOモードなら16進数で「34,31,34,32」を表示します,
受信側がECIOモードなら,「34,31,34,32」に対応するアスキーコードである"4142"を表示します.

・TXDAコマンド
 TXDAコマンドは64バイトまでのデータを送信するためのコマンドです.利用の仕方は上に書いたTXDTコマンドと大して変わりません.

・DCIOコマンド
 DCIOモードに変更するコマンドです.DCIOと打ち込むとDCIOモードになります.デフォルトではDCIOモードです.

・ECIOコマンド
 ECIOモードに変更するコマンドです.ECIOと打ち込むとECIOモードになります.デフォルトではDCIOモードです.

6.注意点など

6.1 連続送信できない

920MHz帯では法律によって送信時間が決められているらしく,一度送信すると50ms程度通信できなくなるそうです.

私はこの通信モジュールを用いてテレメトリシステム+遠隔操作を行うプログラムを書いたのですが,円滑に遠隔操作をするためには1秒に1回程度で通信しないと送信/受信データを取りこぼす場合がありました.

6.2 SoftwareSerialについて

コチラはArduinoの話ですが,SoftwareSerialは2個以上同時に受信状態になれないそうです(参考サイト).したがってGPSとIM920を同時に利用する場合はどちらかをHardwareSerialで通信する必要があります.

7.リンク集

参考にしたサイトです.

・im920のArduinoから利用する方法が書かれたページ
  http://www.miyakawa.link/?p=273
・im920のペアリングについて書かれたページ
  http://www.miyakawa.link/?p=520
・im920の説明スライド.開発元が書いてるので信頼できそう.
  http://www.interplan.co.jp/support/solution/IM315/catalog/IM920_intro.pdf
・私が作ったライブラリのページ
  https://github.com/TonyMooori/IM920Driver
・im920の紹介ページ
  http://www.interplan.co.jp/solution/wireless/im920.php
・im920cの紹介ページ
  http://www.interplan.co.jp/solution/wireless/im920c.php
・im920のハードウェアマニュアル
  http://www.interplan.co.jp/support/solution/IM315/manual/IM920_HW_manual.pdf
・im920cのハードウェアマニュアル   http://www.interplan.co.jp/support/solution/IM315/manual/IM920c_HW_manual.pdf
・im920シリーズののソフトウェアマニュアル  http://www.interplan.co.jp/support/solution/IM315/manual/IM920_SW_manual.pdf