前回に続いて、XBeeモジュール上でMicroPythonスクリプトを動作させて温度センサTMP36から温度を読み取り、ネットワーク上の別のXBeeモジュールにデータを送信してみます。センサの読み取り用と、データを受信用に計2つ、XBeeモジュールを使用します。
この例では、センサノードにはシリーズ3のXBeeモジュールが必要です。コーディネーターは前セクションで設定したXBeeモジュールがそのまま使えます。
センサノードの設定
センサノードとして使用するXBeeモジュールは、APIファームウェアが書き込まれた、エンドデバイスかルーターで、MicroPythonが実行できるよう設定して使用します。
表1のように設定します。先ほどと同様、設定値はすべて16進数で入力し、設定値を変更したら、「Write」ボタンをクリックしてXBeeモジュールに設定値を保存するのを忘れないようにしてください。
設定値コード | 設定地の名前 | 説明 | 設定値 |
AP | API Enble | APIモードの設定 | MicroPython REPL [4] |
BD | UART Baud Rate | シリアル通信速度 | 115200 [7] |
D3 | DIO3/AD3 | DIO3ピンの設定 | ADC [2] |
ID | PAN ID | ネットワークのID | 8088 |
NI | ノード識別子 | ノードの名前 | sensor_node |
PS | MicroPython Auto Start | MicroPythonを自動実行 | Enable [1] |
コーディネーター側のXBeeモジュールは、前セクションでコーディネーターに設定したモジュールがそのまま使えます。
センサノードのプログラミング
XBeeモジュール上でMicroPythonを使用する方法として、スクリプトを対話的に描いてファイルに保存する方法と、ファイルを作成してモジュールにアップロードする方法がありました。ここでは、対話型モードを試してみましょう。
図1に示すように、XCTUのメニューからMicroPythonターミナルを起動します。
MicroPythonターミナルを開いたら、「Open」ボタンをクリックして接続すると、プロンプト「>>>」が表示されます。表示されない場合は、すでにMicroPythonスクリプトが実行されているかもしれません。その場合は、キーボードからCtrl+Cを入力してスクリプトを止めます。
次に、Ctrl+Fを入力し、MicroPythonスクリプトの書き込みモードにし、下記示したコードを入力します。
入力は下記のコピー&ペーストで結構ですが、6行目の「TARGET_64BIT_ADDR」は使用するコーディネーターの64ビットアドレスに置き換えてください。2文字ごとに区切って、「/x」をそれぞれの先頭に付け加えます。
入力が終わったら、Ctrl+Dを入力してMicroPythonスクリプトを書き込みます。
「Automatically run this code at startup?(XBeeモジュール起動時にこのスクリプトを自動で実行しますか?)」と尋ねられるので、キーボードから「y」を入力して、自動で実行するように設定します。
from machine import ADC from time import sleep import xbee # データ送信先アドレス TARGET_64BIT_ADDR = b'\x00\x13\xA2\x00\x41\xC1\x99\xCA' wait_time = 15 #測定間隔 cycle = 10 # 繰り返し回数 for x in range(cycle): # 温度値を読み込んでデバッグ用に表示 temp_pin = ADC("D3") temp_raw = temp_pin.read() print("raw data: %d, " % temp_raw) # 温度を適切な単位に変換する temp_c = (float(temp_raw) * (1250.0/4096.0)) * 100 / 1000 - 50 print("Temp: %.2f C" % temp_c) temp_f = (temp_c * 9.0 / 5.0) + 32.0 print("Temp: %.2f F" % temp_f) # コーディネーターにデータを送る message = "raw: %d, C: %.2f, F: %.2f" % (temp_raw, temp_c, temp_f) print("Sending: %s" % message) try: xbee.transmit(TARGET_64BIT_ADDR, message) print("Data sent Successfully") except Exception as e: print("Data sent Fail: %s" %str(e)) # サイクル間の待ち時間 sleep(wait_time)
下記に、コードのコピー&ペーストと書き込みまでの流れを示します。
flash compile mode; Ctrl-C to cancel, Ctrl-D to finish 1^^^ from machine import ADC 2^^^ from time import sleep 3^^^ import xbee 4^^^ 5^^^ # ?????????? 6^^^ TARGET_64BIT_ADDR = b'\x00\x13\xA2\x00\x41\xC7\x53\x02' 7^^^ wait_time = 15 #???? 8^^^ cycle = 10 # ?????? 9^^^ 10^^^ for x in range(cycle): 11^^^ # ????????????????? 12^^^ temp_pin = ADC("D3") 13^^^ temp_raw = temp_pin.read() 14^^^ print("raw data: %d, " % temp_raw) 15^^^ 16^^^ # ????????????? 17^^^ temp_c = (float(temp_raw) * (1250.0/4096.0)) * 100 / 1000 - 50 18^^^ print("Temp: %.2f C" % temp_c) 19^^^ 20^^^ temp_f = (temp_c * 9.0 / 5.0) + 32.0 21^^^ print("Temp: %.2f F" % temp_f) 22^^^ 23^^^ # ??????????????? 24^^^ message = "raw: %d, C: %.2f, F: %.2f" % (temp_raw, temp_c, temp_f) 25^^^ print("Sending: %s" % message) 26^^^ 27^^^ 28^^^ try: 29^^^ xbee.transmit(TARGET_64BIT_ADDR, message) 30^^^ print("Data sent Successfully") 31^^^ except Exception as e: 32^^^ print("Data sent Fail: %s" %str(e)) 33^^^ 34^^^ # ?????????? 35^^^ sleep(wait_time) 36^^^ 37^^^ Erasing /flash/main.mpy... Compiling 788 bytes of code... Saved compiled code to /flash/main.mpy (564 bytes). Automatically run this code at startup [Y/n]? Y Stored code will run at startup. Press CTRL-R in the REPL to run the code at any time. MicroPython v1.12-1548-gfc68e2a on 2020-09-01; XBee3 Zigbee with EFR32MG Type "help()" for more information. >>>
スクリプトを保存したら、Ctrl+Rを押してスクリプトを実行してみましょう。
下記のように表示され、温度センサの値(まだセンサを取り付けていないのでおかしな値になるはずです)が15秒おきに表示されたでしょうか。動作が確認出来たら、Ctrl+Cを押してスクリプトを停止させます。
Loading /flash/main.mpy... Running bytecode... raw data: 4095, Temp: 74.97 C Temp: 166.95 F Sending: raw: 4095, C: 74.97, F: 166.95 Data sent Successfully raw data: 4095, Temp: 74.97 C Temp: 166.95 F Sending: raw: 4095, C: 74.97, F: 166.95 Data sent Successfully Traceback (most recent call last): File "<stdin>", line 35, in <module> KeyboardInterrupt: >>>
プログラムの13~17行目で温度センサの読み取り電圧から摂氏の温度への換算を行っています。
先ほどのMicroPythonを使用しない例と、AD変換の読み取りの最大値が1023から4095に変わっています。MicroPythonのAD変換では0Vを「0」、1.25Vを「4095」として表現しているためです。
スクリプトが正常に動作していることが分かったら、MicroPython Terminalを閉じてXBeeモジュールを取り外し、ブレッドボード上のXBee Explorerにセットします。
続いてコーディネーターの設定を行います。
コーディネーターの設定
コーディネーターとして使用するXBeeモジュールをUSBアダプタにセットし、コーディネーターとして動作するように設定した後、表4-5のように設定します。
設定値コード | 設定地の名前 | 説明 | 設定値 |
ID | PAN ID | ネットワークのID | 8088 |
NI | ノード識別子 | ノードの名前 | Coordinator |
AO | API出力モード | 1 |
設定が終わったら、センサノードの電源を入れてネットワークを確認してみましょう。図2にネットワークの表示例を示します。XCTU上でコーディネーターとなるXBeeモジュールを選択して、右上のアイコンからネットワークモードに入り、「Scan」をクリックするとセンサノードを探して接続する様子が観察できます。うまく接続できない場合は、各設定値を再度見直してみてください。
これでセンサノードのテストの準備が整いました。
センサノードのテスト
まず、コーディネーターとして設定したXBeeモジュールをUSBアダプタに取り付け、PCのUSBコネクタに差し込んで電源を入れます。コーディネーター側のXBeeモジュールを先に電源を入れることがポイントです。XCTUアプリケーションを起動してXBeeモジュールを検出し、ターミナルを開いておきます。
続いて、センサノードに電源を入れます。センサノード側のXBeeモジュールがコーディネーター側のモジュールと接続してネットワークに参加するまでには時間がかかることもあります。コーディネーターがデータを受信すると、図3のように受信したデータが「Explicit RX Indicator」データとして表示されます。
パケットの中身を見てみると、先ほどと同様にデータの先頭は区切り文字「7E」で始まっているはずです。受信したパケットの中身は次のような、16進数の値の羅列です。
7E 00 2F 91 00 13 A2 00 41 CB C2 FA 17 D2 E8 E8 00 11 C1 05 01 72 61 77 3A 20 32 34 38 34 2C 20 43 3A 20 32 35 2E 38 31 2C 20 46 3A 20 37 38 2E 34 35 11
MicroPythonスクリプトで送信したデータはパケットの最後の方に含まれています。この例では、
72 61 77 3A 20 32 34 38 34 2C 20 43 3A 20 32 35 2E 38 31 2C 20 46 3A 20 37 38 2E 34 35
の部分です。
これら16進数の値を米国情報交換標準コード(ASCIIコード)に変換すると、このようなメッセージが表示されます。
raw: 2484, C: 25.81, F: 78.45
続いて、パケットの中身を詳しく見ていきましょう。表3に「Explicit RX インジケータ」パケットのレイアウトを示します。
値(例) | フィールド名 | 説明 | |||
---|---|---|---|---|---|
7E | スタートデリミタ | パケットの先頭 | |||
00 | 2F | パケットの長さ | |||
91 | フレームタイプ | Explicit RXインジケータ | |||
00 | 13 | A2 | 00 | 64ビットアドレス | センサノードのアドレス |
41 | CB | C2 | FA | ||
17 | D2 | 16ビットアドレス | |||
E8 | ソース エンドポイント | ||||
E8 | ディスティネーションエンドポイント | ||||
00 | 11 | クラスタID | |||
C1 | 05 | プロファイルID | |||
01 | 受信オプション | ||||
72 | 61 | 77 | … | データ | 受信したデータ |
… | 2E | 34 | 35 | ||
11 | チェックサム |
こちらも同様に、センサノードからのデータが受信できているとわかったら、ある程度動作させて温度の変化を観察してみてください。あるいは、手でセンサを温めてみたり、息を吹きかけてみたりすると温度変化が観察できるはずです。
温度の変化がデータの変化として受信できれば、正常に動作しているとみていいでしょう。
コメントを残す