XCTUアプリケーションを使用してセンサノードをテストし、データを観察します。センサネットワークを構築する前に、センサの読み取りだけをテストする、という手順で進めます。このように、センサネットワークにつなぐ前にセンサノードごとに動作テストを行う方法をお勧めします。いきなりたくさんのノードが同じネットワーク上で動作する状態を作ってしまうと、動作確認や不具合の修正に膨大な時間と労力がかかってしまいます。
このセクションでは、片方のXBeeモジュールで読み取った温度センサの値を、ネットワーク上のもう一方のXBeeモジュールに渡す、ということを試みます。
センサノードの設定
センサノードとして使用するXBeeモジュールは、APIファームウェアを書き込み、ルーターかエンドデバイスに設定します。
XBeeモジュールをUSBアダプタでPCに接続し、XCTUアプリケーションからモジュールを追加します。必要があれば、ファームウェアの書き込みを行ってください。
モジュールが見つかったら設定タブを開き、いくつかの設定を変更し、XBeeモジュールがセンサを読めるようにしていきます。
具体的には、①DIO3の電圧をADCで読み取り、②XBeeモジュールの電源電圧を含めて、③15秒(15,000ミリ秒)ごとにデータ送信するように設定します。
表1のように設定します。検索ボックスに設定値コードを入力して検索すると、設定値を素早く見つけられます。設定値はすべて16進数で入力します。
設定値を変更したら、「Write」ボタンをクリックしてXBeeモジュールに設定値を保存するのを忘れないようにしてください。
設定値コード | 設定地の名前 | 説明 | 設定値 |
D3 | DIO3/AD3 | DIO3ピンの設定 | ADC [2] |
ID | PAN ID | ネットワークのID | 8088 |
IR | IO Sampling Rate | データ読み込みの時間間隔 (ミリ秒単位で指定) | 3A98 (=15,000) |
NI | ノード識別子 | ノードの名前 | sensor_node |
V+ | 電源電圧しきい値 | 電源電圧がこの電圧を下回ると、データと一緒に電源電圧を送信する。 | FFFF (=常時送信する) |
コーディネーターの設定
センサノードの設定が終わったXBeeモジュールを取り外してブレッドボード上のXBee Explorerにセットします。
もう一つのXBeeモジュールをUSBアダプタにセットし、コーディネーターとして動作するように設定した後、表4-2のように設定します。
設定値コード | 設定地の名前 | 説明 | 設定値 |
ID | PAN ID | ネットワークのID | 8088 |
NI | ノード識別子 | ノードの名前 | Coordinator |
これでセンサノードのテストの準備が整いました。
センサノードのテスト
まず、コーディネーターとして設定したXBeeモジュールをUSBアダプタに取り付け、PCのUSBコネクタに差し込んで電源を入れます。コーディネーター側のXBeeモジュールを先に電源を入れることがポイントです。XCTUアプリケーションを起動してXBeeモジュールを検出し、ターミナルを開いておきます。
続いて、センサノードに電源を入れます。センサノード側のXBeeモジュールがコーディネーター側のモジュールと接続してネットワークに参加するまでには時間がかかることもあります。
コーディネーターがデータを受信すると、図1のようにターミナル上にコーディネーターが受信した「IOデータサンプルRXインジケータ」データが表示されます。
図1 コーディネーターが受信したデータが表示された
しばらく待ってもデータが受信できない場合は、センサノードの電源をいったん切り、再度入れなおします。この時コーディネーターは電源を入れたままにしておきます。それでもデータが受信できない場合は、コーディネーター・センサノードそれぞれの設定をもう一度見直してみてください。
下記のデータのように、受信データの最初が「7E」で始まっているでしょうか。この「7E」がデータパケットの先頭を表す区切り文字で、続いて16進数の値の羅列としてデータが送られてきています。
データの例:
7E 00 14 92 00 13 A2 00 41 CB C2 FA 17 D2 01 01 00 00 88 02 68 0A BC 23
ZigBeeパケットではデータのフォーマットやレイアウトが決まっています。表2に、「IOデータサンプルRXインジケータ」パケットのレイアウトを示します。
値(例) | フィールド名 | 説明 | |||
---|---|---|---|---|---|
7E | スタートデリミタ | パケットの先頭 | |||
00 | 14 | パケットの長さ | |||
92 | フレームタイプ | IOデータサンプルRXインジケータ | |||
00 | 13 | A2 | 00 | 64ビットアドレス | センサノードのアドレス |
41 | CB | C2 | FA | ||
17 | D2 | 16ビットアドレス | |||
01 | 受信オプション | ||||
01 | サンプル数 | 1データサンプル | |||
00 | 00 | デジタルマスク | デジタル入力設定されているピン | ||
88 | アナログマスク | アナログ入力設定されているピン | |||
02 | 68 | データ | センサ読み取り値 | ||
0A | BC | 電源電圧 | |||
23 | チェックサム |
今回は、15秒ごとにAD3/DIO3ピンの電圧をAD変換したデータと、電源電圧を送信するよう、センサノード側のXBeeモジュールを設定しました。
アナログマスク部分は「88」と送られてきていますが、2進数で表すと「1000 1000」となります。1桁目の1は電源電圧を送信していること、5桁目の1がAD3/DIO3ピンのデータを送信していることを表しています。もしもAD2/DIO2ピンを使用していれば6桁目、AD1/DIO1ピンを使用していれば7桁目、AD0/DIO0ピンを使用していれば7桁目がそれぞれ1に変化します。
センサの読み取り値として、「02 68」というデータが送られてきています。16進数なので、まず10進数に変換して、「616」になります。ここから実際の温度を求めてみましょう。
XBeeモジュールのAD変換では0Vを「0」、1.25Vを「1023」として表現しています。なので、
$$ Vout = \frac{Data × 1250}{1023} …①$$
という変換式でまずは電圧に変換します。
$$ Vout = \frac{Data × 1250}{1023} = \frac{616 × 1250}{1023} = 753 [mV] = 0.753 [V]$$
センサからは0.753Vの電圧が出力されていることが分かりました。
次に、使用した温度センサTMP36のデータシートを基に、出力電圧を温度に換算します。TMP36の出力電圧は、
$$ T = 100 × Vout – 50 …② $$
という式で求められます。
$$ T = 100 × Vout – 50 = 100 × 0.753 – 50 = 25.3 [℃] $$
となり、温度は2.5℃ということが分かります。
同様に、電源電圧も①の式で計算してみます。受信したデータは16進数で「0A BC」なので、10進数では「2748」です。
$$ Vout = \frac{Data × 1250}{1023} = \frac{2748 × 1250}{1023} = 3358 [mV] = 3.36 [V]$$
3.36Vの電圧が供給されていることが分かりました。センサノードをバッテリーや電池で運用している場合、この数値を見ればバッテリーの交換や充電の時期を判断できるでしょう。
センサノードからのデータが受信できているとわかったら、ある程度動作させて温度の変化を観察してみてください。あるいは、手でセンサを温めてみたり、息を吹きかけてみたりすると温度変化が観察できるはずです。
温度の変化がデータの変化として受信できれば、正常に動作しているとみていいでしょう。
コメントを残す