ただ書かされるのも癪なので,ブログの肥やしにしてやります.
1.概要
IM920cという920MHz帯の無線モジュールをArduinoで使う機会があったので,IM920を利用するまでの一連の流れと,その際に参考にしたサイトや注意点,書いたライブラリのコード,IM920のコマンドなどについてをココに書きます.2.ペアリング
使用するためにはIM920同士をペアリングする必要があります.これについては公式からも割りと豊富な情報が出ています.・無線モジュール・アプリケーションノートペアリングの方法
公式が出しているPDFです.
余談ですが私は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で使う – AutumnColor.com
私の場合はArduino Pro Mini 328 5V 16MHzを利用しています.IM920は3.3V駆動なので5VのICを利用する際には何かしらの方法でレベル変換をさせたほうが良いと思います.
ピンの接続先は以下のとおりです.今回HardwareSerialを使わずにSoftwareSerialを利用します.10pinをRX,11pinをTXとします.
Arduino | IM920 board |
---|---|
3.3v | VCC |
GND | GND |
10(RX) | TX |
11(TX) | RX |
見づらいですがim920の端子はこんな感じです.詳細はデータシートとか見てください.
4.プログラム
先ほど紹介したサイトで基本的な入力は可能なのでそちらを利用しても良いとは思いますが,ArduinoのSoftwareSerialは一行ずつ読み取ることが面倒なのでライブラリを作りました.以下は私のライブラリを利用してシリアル通信する例です.
まずこのライブラリのGitHubリポジトリからファイルをダウンロードしてArduinoのフォルダ内のlibrariesに追加します.追加後Arduino IDEを再起動してください.
・GitHubリポジトリ (https://github.com/TonyMooori/IM920Driver)
ライブラリを追加した後,以下のコードが書き込めるはずです.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <SoftwareSerial.h> | |
#include "IM920Driver.h" | |
// シリアル通信に使うRX,TXピン | |
#define IM920_RX_PIN 10 | |
#define IM920_TX_PIN 11 | |
SoftwareSerial IM920Serial(IM920_RX_PIN, IM920_TX_PIN); | |
// SoftwareSerialのポインタを与える | |
IM920Driver im920(&IM920Serial); | |
void setup() { | |
IM920Serial.begin(19200); // デフォルトでは19200bps(設定で変更可) | |
Serial.begin(19200); | |
// ECIOモードにする(デフォルトでDCIO) | |
// im920.send("ECIO"); | |
// DCIOモードにする(デフォルトでDCIO) | |
// im920.send("DCIO"); | |
delay(1000); | |
} | |
void loop() { | |
char buff[IM920_BUFFER_SIZE]; | |
int n; | |
while (im920.available()) { | |
// ひたすらreadする | |
im920.read(); | |
// 改行が認識された場合 | |
if ( im920.get_line_changed() ) { | |
// その1行を受け取る | |
im920.get_last_line(buff); | |
// "OK"や"NG"でなければ表示する | |
if ( strcmp(buff, "OK\r\n") != 0 && strcmp(buff, "NG\r\n") != 0) { | |
Serial.println("New line >>"); | |
Serial.println(buff); | |
// 通信相手にデータを送る | |
im920.send("TXDA 54455354"); | |
} | |
} | |
} | |
delay(50); | |
} |
Tera Termから「TXDA 5555」(TXDAはIM920のコマンドで,後述します)のようにデータを送ると以下のようにArduinoが返事をします.
一行ずつ読み込みますので自分で文字列を解析するプログラムを実装する場合はコチラのほうが利用しやすいと思います……?
5.IM920のデータ通信形式について
先の画像から分かる通り,IM920は独自コマンドで動作します.コマンドについてはIM920シリーズのソフトウェアマニュアルが公式から出ているのでそちらが参考になります.・IM920ハードウェア取扱説明書
ただ普段利用する際に利用するコマンドについては限られているので代表的なものを示します.
・TXDTコマンド
8バイト(アスキーコードで8文字)のデータを送信するコマンドです.後述のECIOモードとDCIOモードで動作が異なります.先のPDFに良い表があったので引用します(一部ミスが有ったので修正しました).
コマンド | 送信側 | 受信側 |
設定 | DCIO | DCIO |
データ(例) | TXDT4142 | aa,bbbb,cc:41,42,00,00,00,00,00,00 |
設定 | DCIO | ECIO |
データ(例) | TXDT4142 | aa,bbbb,cc:AB |
設定 | ECIO | ECIO |
データ(例) | TXDT4142 | aa,bbbb,cc:4142 |
設定 | ECIO | DCIO |
データ(例) | TXDT4142 | aa,bbbb,cc:34,31,34,32,00,00,00,00 |
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の説明スライド.開発元が書いてるので信頼できそう.
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