IM920sを使ってみた

皆さんこんにちは!このコーナーでは色々なメーカーさんのチョット気になった製品を使ってみて「こうすれば使えるんだ」、「こういう機能があるんだ」と言う事を知って貰おうと思います。

今回は、インタープラン株式会社様の「IM920s」を取り上げたいと思います。
IM920sはサブギガ帯である920MHzの周波数を用いた無線機で、動的に経路を構成するアドホック・マルチホップネットワーク通信機能を内蔵しています。通常無線機は、送信側と受信側が1対1で通信しますが、IM920sは2台以上の無線機でネットワークを組む事ができ、1台から全体への通信(ブロードキャスト)や、特定の相手方に対しての通信(ユニキャスト)など、色々な形の通信が出来ます。送信側から直接電波が届かない所に有る受信側に対しても、間にIM920sが有れば中継もしてくれます。中継ルートもIM920sが自動的に探してくれますので、ユーザーが気にすることはありません。ユーザーは個々の無線機が隣同士で通信が出来るよう配置すれば結果的にグループ内の全ての無線機と通信が出来るようIM920sが経路を探してくれます。

この実験では単純マルチホップ(初期設定のネットワークモード)で、中継の実験を行いたいと思います。説明は、
 ・用意するもの
 ・事前設定
 ・実験
の順に進めて行きます。

準備

1.用意するもの

IM920s 3台(送信側、受信側、中継用)
この実験ではワイヤアンテナタイプのIM920sを使いました。

IM920s表面
IM920s表面
IM920s裏面
IM920s裏面

IM920c-ADP 1台(中継器の電源供給用)

IM920c-ADP表面
IM920c-ADP表面
IM920c-ADP裏面
IM920c-ADP裏面

・IM920-USB又はIM315-USB-RXIM920c-ADP 2台(送信側/受信側をPCと接続するため)*
*:IM920-USBの代わりにIM315-USB-RX(現在は生産終了)をお持ちの方はIM920c-ADPと組み合せる事によりIM920-USBと同等の機能になります。(以下の写真はIM315-USB-RX)

IM315-USB-RX表面
IM315-USB-RX表面

IM315-USB-RX裏面
IM315-USB-RX裏面

・USBケーブル 2本(PCとIM920-USBを接続するため)
IM920-USB側はMINIタイプのUSBです。

USBミニケーブル
USBケーブル

・単三型電池×2本用電池BOX 1個(中継器の電源)
・単三型電池×2本

電池BOX
電池BOX

電池BOXスイッチ部分
電池BOXスイッチ部分

電池BOXはスイッチ付きのものを使いました。

・PC 2台(送信側/受信側用)
・PC用ターミナルソフト(TeraTermなど)

2.事前設定

無線通信に用いるIM920sは、個体の識別にグループ番号とノード番号と言う2種類の番号を使います。グループ番号は名前のとおり、同一のグループに属しているかどうかを表すもので、通信は同一のグループ内で行われます。ノード番号は、グループの中の個々の無線機の識別のために使われます。

2-1.通信条件の設定
IM920sをIM920-USBと接続し、PCからTeraTermなどのターミナルソフト経由でコマンドを入力出来るようにしましょう。(前述のとおり、IM920-USBの代わりにIM315-USB-RXIM920c-ADPの組み合わせでも大丈夫です。)IM920-USB又はIM315-USB-RXをPCに接続するとUSBドライバが自動的にインストールされると思います。
IM920sとの通信条件は購入時の設定をいじっていない状態では

通信速度:19.2kbps
データ長:8ビット
ストップビット:1ビット
パリティビット:なし
と、なっています。

通信条件
通信条件

ちなみに、キーボードから打ち込んだコマンドのエコーバックは無いようですので、ターミナルソフト上でエコーバックをさせるため「ローカルエコー」の項目にチェックを入れ、有効にしています。

端末設定
端末設定

正しく通信が出来るかどうか、PCとIM920sを接続したら「SRST」コマンドを入力して確認しましょう。正しく通信が出来ていれば「IM920s」と、続いてソフトウェアバージョンが表示されます。

リセット後の表示
リセット後の表示

2-2.ノード番号の設定
ノード番号は「STNN」コマンドで設定できます。但し、これをFlashROMに記憶させるためには「STNN」コマンドに先立って「ENWR」コマンドを実行してFlashROMへの記憶を許可しておく必要があります。「STNN」コマンドで許可されているノード番号は16進数の4桁で0001~FFEFまでです。ノード番号として0001を設定するには「STNN 0001」を入力し、エンターキーを押します。(以下エンターキーを入力する記述は省略します)
グループの中の1台はノード番号を「0001」とし、その他のノードは先の範囲内の任意の番号に設定してください。グループ内で「0001」を設定した無線機を親機、その他の番号を設定した無線機を子機と呼びます。

ノード番号1を設定した例
ノード番号1を設定した例

2-3.グループ番号の設定
次にグループ番号を設定します。グループ番号は任意の番号が設定出来るわけではなく、ノード番号が「0001」の無線機の固有ID(製造時に決定され、ユーザーは変更出来ません)がグループ番号になります。ノード番号「0001」の無線機(親機)に「STGN」コマンドを入力すると、自身の固有IDをグループ番号として登録すると共に、無線にてグループ番号の設定パケットを送信します。これはIM920sにリセットをかけるまで出続けます。
*固有IDは「RDID」コマンドで読み出す事が出来ます。
グループ番号の設定コマンド「STGN」では、親機の場合は「SRST」コマンドで復帰しますが、子機側は電源入れ直し(又はハードリセット)をしないと「SRST」コマンドでは復帰しないようです。但し、「STGN」コマンドを実行したが、実際に登録されなかった場合は「SRST」コマンドで復帰するようです。

グループ番号の設定例
グループ番号の設定例(親機)

固有ID「00000C8F」、現在のグループ番号「00000C8D」、現在のノード番号「0055」のIM920sにSTNNコマンドでノード番号「0001」を設定し、「STGN」コマンドでグループ番号を設定した例。
(最後の「RDGN」コマンドを実行する前に一旦電源OFF→ONを行っています。)

ノード番号を「0001」以外に設定した無線機では、ノード番号「0001」の無線機が設定パケットを送信中に「STGN」コマンドを実行しますが、グループ番号の設定に先立って「ENWR」コマンドを実行し、FlashROMへの書き込みを許可しておきます。(許可しないで「STGN」コマンドを入力するとNGが帰ってきます。)「ENWR」コマンドを実行後、「STGN」コマンドを実行するとターミナルソフトの画面上に「GRNOREGD」と言うメッセージが出ます。このメッセージが出たら無線機をリセットしてください。

グループ番号の設定例(子機)

ノード番号「0010」、グループ番号「00000C8D」の無線機に対して「STGN」コマンドで先の無線機のグループに登録した例。「GRNOREGD」の表示が出た後に一旦電源OFF→ONを行い、「RDGN」コマンドでグループ番号を読み出し、先の無線機のグループ番号「00000C8F」が登録された事が確認出来た。

2-4.キャラクターモードの設定
初期状態では「DCIO」モードに設定されており、データは16進数で表現します。(例えば”A”を送るなら”41”と書くと”A”を送れます。「ECIO」モードではキャラクタをそのまま送ることが出来ます。マイコン等で0~255のデータを処理するにはDCIOモードの方が便利でしょうが、人が目で見て判りやすいのはECIOモードでしょう。 今回は送信側/受信側共にECIOモードに設定しておきましょう

ECIOモードに設定

実験

1.送信側から受信側への単純な通信


設定が済んだら実際に通信させてみましょう。ここでは「ユニキャスト送信」を使って実験を行います。ユニキャスト送信は、宛先のノード番号を指定して行う通信で、受信側でデータが取れなければ最大10回迄の再送信を自動で行ってくれます。(初期設定のENAK状態で。)
この実験で用いた送信側のノード番号は「0012」、受信側のノード番号は「0010」に設定してあります。
送信側から「TXDU0010,Hello!」と打ち込むと受信側から「00,0012,XX:Hello!」(XXはRSSIと言われる電波の強さを表す数字ですので環境に依存します。実験例では”C5”になっています。)と出力されたと思います。

送信側表示

受信側表示

ターミナルソフトにTeraTermを使っている場合、以下のマクロを実行すると10秒間隔で送信を続けます。
---マクロ開始ーーー
:loop
send ‘TXDU0010,Hello!’ $0D $0A
pause 10
goto loop
---マクロここまで---

マクロを使った通信例(送信側)
マクロを使った通信例(送信側)
マクロを使った通信例(受信側)
マクロを使った通信例(受信側)

マクロ内の「pause 10」の数字を変えれば送信間隔を変える事が出来ますが、以下の点で注意が必要です。
ユニキャスト送信の場合、受信側が見つからない場合は再送を10回繰り返すモードが有りますが(ACKありモード、コマンド「ENAK」)再送には約7秒間かかる様です。それ以下に送信間隔を設定すると無線機からBUSY信号が出ているにも関わらず送信コマンドを送り込む事になりますので、無視されます。ご注意ください。実行している マクロを終了させるには、マクロのダイアログボックスの「終了」をクリックしてください。

2.出力調整

初期設定のままですと、送信出力が10mWに設定されていますので、少しぐらい距離が離れても通信が途切れる事は無いと思います。しかし、中継の実験をするには電波が飛びすぎると都合が悪いので送信出力を下げましょう。IM920sはコマンド設定で送信出力を10mWと1.1mWのどちらかに設定する事が出来ます。(初期設定は10mW)
1.1mWに設定するには「STPO 1」と打ち込みます。FlashROMに記憶させたいのであれば、このコマンドの実行に先立って「ENWR」コマンドを実行することを忘れないでください。

送信電力設定例
送信電力設定例

送信電力が10mWに設定されていたものを1.1mWに設定しなおした例

送信側の出力を下げ、先のマクロを実行したまま受信側を離して行くと何処かで通信が途絶えると思います。と、言ってもIM920sは内蔵アンテナ版でも10mWの出力で1kmほどの通信距離が確保出来ますので、出力を約1/10の1.1mWにしても見通しでは300mぐらいの通達距離が有ると思われます。障害物が沢山あるちょっと大きな建物内なら端から端まで使えば通信が途切れるかも知れませんが、実験している場所の関係で目一杯距離を離しても通信が途切れない事の方が多いかと思います。実際に私たちが実験している環境でも仕事場の端から端まで使ってもRSSIが余り落ちず、通信が途切れる事は有りませんでした。

仕事場の端でのRSSIレベル
仕事場の端でのRSSIレベル

受信側を仕事場の端まで持って行きましたが、RSSIは”AB”迄しか落ちませんでした。

表示されているRSSI値は、インタープラン様の仕様書によると符号付きの16進数で、読み値がそのまま受信電力になるとの事ですので、”AB”は-85dBmに相当する事になります。
ちなみに近距離で通信の実験を行ったときの値は”D0″でしたので、この時の受信電力は-48dBmと言う事になります。距離を離す事により電力を約40dB下げる事が出来ましたが、通信が出来なくなるまで下げる事は出来ませんでした。ちなみにRSSIが40dB下がったと言う事は電力比で一万分の一まで下げた事になります。(でもマダマダ安定して通信出来るレベルです。-100dBm近くにならないと通信NGにはならないでしょう。)
実験場所の端から端まで使いましたが残念ながら通信が途切れる事が有りませんでしたので、このままでは中継器の実験が出来ません!

3.受信レベルの調整

でも、こんな場合は”奥の手”が有ります。IM920sには「STTH」コマンドと言う特殊なコマンドが有り、信号(RSSIで判断する)が小さいデータを無視する機能が有ります。
例えば、「STTH C0」と、コマンドを打つとRSSI値が”C0″より小さいデータは受信出来ていても、あたかも無かった事の様に扱います。この機能を使って中継の実験を行ってみましょう。先ずは受信側に「STTH」コマンドを使って無視するRSSI値を設定します。 先ほどの実験結果から、実験場所の端でのRSSI値が”AB”でしたので、ちょっと余裕を持って設定値を”C0”にしておきます

STTHコマンド実行例
STTHコマンドで受信制限をかけた例

「STTH」コマンドを使って一定のRSSI値以下のデータを無効にする設定を行った例

4.「STTH」コマンドを使っての中継実験

「STTH」コマンドを使って”C0″より小さい電波を受信出来ない状態にして、先のマクロを使って送信しながら受信機を離して行った時の受信結果をTeraTermの時刻付きのログで取得しましたので以下に示します。前受信との間隔は、生データの中から時刻部分を抜き出し、計算したものです。

データ番号         生データ前受信との間隔
1[Fri Jan 15 17:20:54.327 2021] 00,0012,DA:Hello!  -
2[Fri Jan 15 17:21:04.371 2021] 00,0012,DB:Hello!00:10.044
3[Fri Jan 15 17:21:14.950 2021] 00,0012,DB:Hello!00:10.579
4[Fri Jan 15 17:21:24.647 2021] 00,0012,DB:Hello!00:09.697
5[Fri Jan 15 17:21:34.765 2021] 00,0012,DB:Hello!00:10.118
6[Fri Jan 15 17:21:45.419 2021] 00,0012,DB:Hello!00:10.654
7[Fri Jan 15 17:21:55.006 2021] 00,0012,DB:Hello!00:09.587
8[Fri Jan 15 17:22:05.169 2021] 00,0012,DB:Hello!00:10.163
9[Fri Jan 15 17:22:15.284 2021] 00,0012,DB:Hello!00:10.115
10[Fri Jan 15 17:22:25.974 2021] 00,0012,DB:Hello!00:10.690
11[Fri Jan 15 17:22:35.588 2021] 00,0012,DB:Hello!00:09.614
12[Fri Jan 15 17:22:45.746 2021] 00,0012,DC:Hello!00:10.158
13[Fri Jan 15 17:22:55.830 2021] 00,0012,DB:Hello!00:10.084
14[Fri Jan 15 17:23:06.434 2021] 00,0012,DB:Hello!00:10.604
15[Fri Jan 15 17:23:16.090 2021] 00,0012,DB:Hello!00:09.656
16[Fri Jan 15 17:23:26.229 2021] 00,0012,CE:Hello!00:10.139
17[Fri Jan 15 17:23:36.985 2021] 00,0012,CA:Hello!00:10.756
18[Fri Jan 15 17:23:46.636 2021] 00,0012,C5:Hello!00:09.651
19[Fri Jan 15 17:23:56.761 2021] 00,0012,C7:Hello!00:10.125
20[Fri Jan 15 17:24:12.310 2021] 00,0012,C0:Hello!00:15.549
21[Fri Jan 15 17:24:17.979 2021] 00,0012,C3:Hello!00:05.669
22[Fri Jan 15 17:24:26.951 2021] 00,0012,C0:Hello!00:08.972
23[Fri Jan 15 17:24:37.742 2021] 00,0012,C0:Hello!00:10.791
24[Fri Jan 15 17:26:38.927 2021] 00,0012,DB:Hello!02:01.185
25[Fri Jan 15 17:26:48.452 2021] 00,0012,DA:Hello!00:09.525
26[Fri Jan 15 17:26:58.502 2021] 00,0012,DC:Hello!00:10.050
27[Fri Jan 15 17:27:08.612 2021] 00,0012,DC:Hello!00:10.110
28[Fri Jan 15 17:27:19.231 2021] 00,0012,DB:Hello!00:10.619
29[Fri Jan 15 17:27:28.801 2021] 00,0012,DB:Hello!00:09.570
30[Fri Jan 15 17:27:38.977 2021] 00,0012,DB:Hello!00:10.176
31[Fri Jan 15 17:27:51.392 2021] 00,0012,DB:Hello!00:12.415
32[Fri Jan 15 17:27:59.398 2021] 00,0012,DB:Hello!00:08.006
33[Fri Jan 15 17:28:09.451 2021] 00,0012,DB:Hello!00:10.053
34[Fri Jan 15 17:28:19.643 2021] 00,0012,DB:Hello!00:10.192
35[Fri Jan 15 17:28:30.210 2021] 00,0012,DB:Hello!00:10.567
36[Fri Jan 15 17:28:39.790 2021] 00,0012,DB:Hello!00:09.580
IM920sの受信履歴


データ番号15迄は送信側と受信側を近づけた状態で通信させています。そのため生データに含まれているRSSI値が”DA”、”DB”など、強い値になっています。
15番を受信した後に受信機を徐々に送信機から遠ざけています。データ番号19番迄は受信間隔が大体10秒ですので、何とか再送なしで受信出来ているようですが、20番の受信は前のデータを受信してから15.5秒経っていますので、データの自動再送により何とか受信出来たものと考えられます。
次の21番目のデータですが、これは20番のデータを受信してから5.6秒で受信しています。20番のデータが再送により受信タイミングが遅くなったのに対して21番は再送なしで届いている為、前の受信との間隔が短くなっていると考えられます。
電波は弱い物の、23番のデータ迄は何とか大体10秒間隔を保ちながら受信しましたが、それ以上距離を離したら全く受信できなくなりました。(と、言っても「STTH」コマンドで見かけ上受信出来なくしているだけですが。)受信出来ない状態が2分近く続きましたので、そこで中継器を受信側の近くに設置して電源を入れたところ安定して受信が出来るようになりました。(24番以降のデータ)

受信側IM920sと中継器
中継用IM920s(左側)と受信用IM920s(右側)

左側の写真の様に受信用IM920sの近くに中継用のIM920sを置くだけで安定した通信が出来るようになります。
中継用のIM920sIM920c-ADPに載せ、電池ボックスを接続しています。(単三型アルカリ電池×2本)

このように、同一のグループ番号に設定した無線機を間に配置するだけで、特に何の設定をしなくても自動的に電波を中継し、通信を安定させてくれることが確認出来ました。システムによっては電波を中継させるために中継元や中継先、中継器の識別番号の設定をしなくてはならない物も多数有る中、インタープラン様のIM920sは自動で経路の探索等をしてくれるので非常に便利です。

5.実際に電波を弱くしての通信実験

先に行った実験では、十分強い電波が届いているにも関わらず、「STTH」コマンドで無視しているだけで、実際に電波が弱くなって通信が出来なくなった訳では有りません。上の写真を見ても中継器用と受信用のIM920sが並んだ状態で配置してあり、本当は中継器だけでなく、受信側の無線機にも電波が届いているはずです。やはり本当に電波が弱くなった時にも中継が出来るのか、試してみたいです。送信側の電波は「STPO」コマンドを用いて既に小さく設定して有りますので、他の方法で電波を弱くしなくてはなりません。勿論送信側と受信側の距離が十分離せれば申し分有りませんが、残念ながらそのような環境が無いので送信側を「シールド」することで対応してみます。
ご存じのとおり、電波は金属で遮られます。予備的な実験として送信側のIM920sを金属の缶に入れたり、アルミホイルで巻き付けてみたりしました。

缶入り送信機
缶入り送信機

絶縁した送信側無線機を金属製の缶に入れてみました。

アルミホイルを巻いた送信機
アルミホイルでぐるぐる巻き

アルミホイルでぐるぐる巻きにしてみました。(こちらも送信機はショートしないよう、絶縁してあります。)

しかし、残念ながら電波はしぶとくて我々の仕事場の範囲では「安定して」受信出来なくすることは出来ませんでした。どうしても無線機に繋がっているUSBケーブルから電波が漏れてしまい、本体をシールドするだけでは通信を遮る事が出来ませんでした。
最後の手段として、送信データを生成するマイコン部、無線機(IM920s)、電池全てを缶の中に入れてしまう事を考えました。
データの生成部はMbedのマイコンボードを使い、電源は単三型アルカリ電池4本(6V)で回路を動かしています。用いたMbedのマイコンボードはSTマイクロ社製の「NUCLEO-F303K8」です。このボードは外部電源から5V、3.3Vを生成するレギュレーターを内蔵していますので、IM920s(=3.3Vで動作させている)の電源を取り出すにも便利なので用いました。この送信機の詳しい資料はこちら
折角マイコンを使ってデータを作るので同じデータを繰り返し送信するのではなく、データを送信する度にデータの番号(Tx No.とします)を一つずつ上げてゆき、00~99でループするように作りました。これによりどのくらいのデータが抜けたのかが判りやすくなると思います。以下に製作した送信機と、蓋を開けた状態にして近くで受信した場合のデータを示します。

缶入りデータ送信機
缶入りデータ送信機
隙間は有りません
フタで密閉されています
缶入り送信機からデータ受信結果
受信データの見本

缶の蓋をして通信可能距離を探った結果、送信側の出力を1.1mWに設定したままだと通信可能な距離は1m程度でした。そこで送信側と受信側の距離を2m程度離し、この状態ではデータが受信できない事を確認し、その上で送信側から50cm程度の場所に中継器を配置したところ、安定してデータを受信することが出来ました。以下に実験の結果を示します。

データ番号         生データ前受信との間隔
1[Fri Jan 15 20:22:58.427 2021] 00,0012,A3:Tx No.= 03
2[Fri Jan 15 20:23:06.788 2021] 00,0012,A2:Tx No.= 0400:08.361
3[Fri Jan 15 20:23:16.818 2021] 00,0012,A3:Tx No.= 0500:10.030
4[Fri Jan 15 20:23:26.826 2021] 00,0012,A3:Tx No.= 0600:10.008
5[Fri Jan 15 20:24:00.162 2021] 00,0012,A3:Tx No.= 0900:33.336
6[Fri Jan 15 20:24:21.805 2021] 00,0012,9F:Tx No.= 1100:21.643
7[Fri Jan 15 20:24:40.230 2021] 00,0012,A3:Tx No.= 1300:18.425
8[Fri Jan 15 20:25:50.316 2021] 00,0012,A2:Tx No.= 2001:10.086
9[Fri Jan 15 20:26:49.893 2021] 00,0012,D6:Tx No.= 2600:59.577
10[Fri Jan 15 20:26:57.715 2021] 00,0012,D0:Tx No.= 2700:07.822
11[Fri Jan 15 20:27:07.178 2021] 00,0012,CF:Tx No.= 2800:09.463
12[Fri Jan 15 20:27:17.209 2021] 00,0012,CF:Tx No.= 2900:10.031
13[Fri Jan 15 20:27:27.748 2021] 00,0012,C6:Tx No.= 3000:10.539
14[Fri Jan 15 20:27:37.238 2021] 00,0012,C9:Tx No.= 3100:09.490
15[Fri Jan 15 20:27:47.256 2021] 00,0012,C9:Tx No.= 3200:10.018
16[Fri Jan 15 20:27:57.284 2021] 00,0012,CA:Tx No.= 3300:10.028

データ番号7番までは受信機から1m弱の所に送信機を配置しており、所々抜けながらもデータ通信が可能となっています。(Tx No.が1個~2個歯抜けになりながら通信をしています。この時、RSSIの最低値は”9F”となっていて電力換算だと「-97dBm」相当だと思われます。)データ番号7番の送信後、1.5m程度の所に送信機を配置したところデータが全く受信出来なくなりました。中継器を設置する前に確実に通信が出来なくなるようにするため、距離を2m程度まで広げましたが、この際送信機を移動させるために持ち上げたところ、人体を経由してデータ通信が行われてしまいました。(データ番号8番)これ以降は距離を2mまで離してありますので、中継器を設置するまで(Tx No.20~26の間)確実に通信が出来なくなっています。その後は中継器が設置されていますので安定して通信が行われています。
缶入り送信機での実験の結果、「STTH」コマンドで受信制限をかけた場合と同様な結果が得られる事が確認出来ました。この様に、IM920sはユーザー側が特に難しい設定をしなくてもお互いの無線機が電波の届く範囲に居てくれさえすれば、グループの端から端まで通信が出来るように設計されています。IoT機器導入の際は設置・設定の利便性なども考慮する必要が有りますので参考にしてください。
ご不明な点はこちらのリンクからお問い合わせください。→IM920sに関して問い合わせる
無線モジュール.comでは無線モジュールを利用した様々な提案・開発を行っております。是非開発実績もご覧になってください。

次の記事

IM920を使ってみた