MicroPythonの実行が可能なXBee3 ZigBeeモジュールでワイヤレス通信の実験を行ってみました。
XBee 3 ZigBee子機(下図・右側)の内蔵温度センサで測定した温度値をZigBee送信し、Raspberry Piに接続したXBee親機(下図・左側)で受信します。
親機(左側):Raspberry PiへXBeeを接続して製作する。子機で測定した温度情報を受信する。子機(右側):XBee3内蔵マイコン上で動作するMicroPythonスクリプトで温度を測定し、親機へ送信する。
目次
子機・XBee3 ZigBee の構成・MicroPythonスクリプトの書き込み方法
子機にはXBee3 ZigBeeモジュールを使用します。
MicroPythonのスクリプトを書き込むには、XBee USBエクスプローラとPCなどが必要です。スクリプト書き込み後は、電源を供給するだけで動かすことが出来ます(工作が得意な人であれば、XBee USBエクスプローラは1台だけでよい)。
使用可能なXBeeモジュール:XBee3 シリーズ必要な機器:XBee USBエクスプローラ (スクリプト書き込み時に必要)、PC(DiGi X-CTUに必要)必要なソフト:DiGi X-CTU(スクリプト書き込み時に必要)
サンプルスクリプトは、下記に公開しました。
XBee3 ZB用MicroPythonサンプル集温度送信用サンプル bas04_tx_temp.py
以下に、設定方法、書き込み方法を示します。
Digi MicroPython 設定方法
1. DIGI XCTU (最新版)の「Radio Modules」のアイコン[+](Add a radio Module)で使用するシリアルCOMポートを選択する。
2. シリアル接続したXBeeモジュールが画面左側のフレームに表示されるので、それを選択する。
3. 右フレーム「Radio Configuration」にXBee 設定画面が表示されるので、スクロールして、「AP APIEnabe」で[MicroPython REPL [4]]を選択する。
[Radio Configuration]
▼ UART Interface
AP APIEnabe
MicroPython REPL [4]
4. 右フレームの上部の鉛筆アイコン(Write)をクリックする。
5. XCTUの「Tool」メニューから[MicroPython Terminal]を選択し、接続アイコン(Open)をクリックする。(Tera Termを使用する場合は、通信設定=9600-8-N-1・フロー制御なし、改行コード=CR、ローカルエコー=無しなどを設定する。)サンプル・スクリプトの書き込み方法
1.サンプルスクリプトをメモ帳や秀丸エディタで開き、[Ctrl]+[A]の操作で全選択し、[Ctrl]+[C]でクリップボードにコピーします。
2.XCTU の MicroPython Terminal または TeraTermなどで、[Ctrl]+[F]を操作し、プログラムをXBee3 ZigBeeモジュールへ書き込むモードに設定します。
3.右クリック操作でペーストを行い、クリップボードに保持したサンプルスクリプトを転送します。
4.[Ctrl]+[D]を操作し、コンパイルを実行します。
5.「Automatically run」に対して[Y]を入力すると、起動時やリセット操作時に、自動起動させることが出来ます。
6.[Ctrl]+[R]でフラッシュメモリ内のプログラムを実行します。Automatically runを設定していた場合は、リセット操作[Ctrl]+[D]で実行することも出来ます。
親機 XBee ZigBee Coordinator の構成
親機は、Raspberry PiへXBee USBエクスプローラ経由でXBeeモジュールを接続して製作します。
XBeeモジュールには、最新のXBee3 ZigBeeシリーズ、従来のXBee ZB S2Cシリーズ、S2シリーズが利用できます。
使用可能なXBeeモジュール:XBee3 シリーズ、XBee ZB S2Cシリーズ、S2シリーズ必要な機器:Raspberry Piとその周辺機器、XBee USBエクスプローラ必要なソフト:後述(ダウンロード)構成: [Raspberry Pi]—-[XBee USB エクスプローラ]—-[親機XBee]- – – -[子機XBee3]
XBee3とS2Cシリーズの場合は、後述のZigBeeモード設定ツール「xbee_zb_mode」を使って、Coordinator APIモードに設定します。S2シリーズの場合は、X-CTUを使ってCoordinator API用のファームウェアを書き込みます。
また、筆者が作成したXBee テスト用ツール「xbee_test」を使って、子機が送信した温度情報を受信する実験を行います。
Raspberry Pi用のプログラムを下記のコマンドでダウンロードし、コンパイルしてください。
Raspberry Pi用プログラムのダウンロード
pi@raspberrypi:~ $ git clone -b raspi https://github.com/bokunimowakaru/xbeeCoord.gitpi@raspberrypi:~ $ cd xbeeCoord/tools/
pi@raspberrypi:~/xbeeCoord/tools $ make
ZigBeeモード設定ツール「xbee_zb_mode」を起動し、XBee Coordinator APIモードに設定して下さい。下記の実行例の引数「B0」は、XBee USBエクスプローラのUSBシリアルポートです。ポートが「/dev/ttyUSB0」の場合は「B0」、「ttyUSB1」の場合は「B1」といった具合に指定してください。(ttyUSBポートが不明な場合は、マウスやキーボード以外のUSB機器を外し、Raspberry Piを再起動してから、「~/xbeeCoord/tools/xbee_zb_mode」を入力してください。)
実行後、「10」と「Enter」を入力すれば、設定できます。設定時にエラーが出た場合は、やり直してください。
ZigBeeモード設定ツールxbee_zb_mode
pi@raspberrypi:~/xbeeCoord/tools $ ./xbee_zb_mode B0CONNECTED 0(0x00):176(0xB0)ZIGBEE Device Type Switcher for XBee ZB S2C / XBee3 Series
00:Coordinator AT, 01:Router AT, 02:End Devic
e AT
10:Coordinator API, 11:Router API, 12:End Device API
Mode =10
設定が完了したら、XBee テスト用ツール「xbee_test」を起動してください。末尾の「B0」は「ttyUSB0」の場合です。
XBee テスト用ツールxbee_testを起動する
pi@raspberrypi:~ $ cd ~/xbeeCoord/toolspi@raspberrypi:~/xbeeCoord/tools $ ./xbee_test B0
ここで重要な作業「ペアリング」を行います。
xbee_testは、XBeeモジュールを常時ペアリングが可能なモードに設定します。このため、通常は自動的にペアリングが行われ、xbee_testに「recieved IDNT」が表示されます。しかし、周囲に他のZigBeeが動作していた場合、他のネットワークに参加してしまうことがあります。この場合、子機のコミッショニングボタンを4回、押して、初期化して再実行する、または親機と同じPAN IDを子機に設定するなどが必要になることがあります。
ペアリング後に、子機XBee3から温度情報が送られてくると、「recieved UART」に続き、温度値と電源電圧値が表示されます。下記の例では、温度19.0℃、電源電圧3.302Vが得られました。
--------------------
recieved UART
--------------------
from :0013A200 xxxxxxxx
status :02 broadcast packet
length :10 (0x0A)
data : 19.0, 3.302AT>
XBee3 MicroPythonで受信する
受信用のMicroPythonサンプル・スクリプトも準備しました。
(受信の確認には、子機XBee3をX-CTUのMicroPython Terminalに接続しておく必要があります。)
データ受信用サンプル bas05_rx.pyデバイス検索用サンプル bas06_rx_disc.py
親機となるRaspberry Piから送信を行うにはXBee テスト用ツール「xbee_test」から「tx=HELLO」のように「tx=」に続いて文字列を入力してください。
ボクにもわかるXbee
https://bokunimo.net/xbee/
https://bokunimo.net/xbee/
「XBee3 ZigBee MicroPython 基本サンプル・スクリプトで無線通信実験」への17件の返信
ご回答ありがとうございます。
ご指摘いただいた様に書き直して実行してみましたところ、うまくいきました。
DIGIのPYTHON プログラミングガイドに書いてありましたね、ちゃんと見てなかったです
また何かありましたらよろしくお願いいたします。
度々失礼いたします。
pinの識別子の件は’d0’を’D0’に書き直す事で解決出来ました。
ところが…
cord.py
import machine
import xbee
xbee.atcmd(‘d0’, 2)
pin_adc = machine.Pin(‘D0′)
batt_v = machine.ADC(pin_adc)
val = batt_v.read_u16()
print(val)
上記の様なコードを実行すると、今度は’’ADC’ object has no attribute ‘read_u16’’
とエラーが出てしまいます。ADCの読み出し方がわかりません。
因みにxbeeのファームウエアーは’1006’です、ご教授お願い致します。
D1ポート、ファームウェア1007で確認してみました。
若干、条件が異なりますが「read_u16」を「read」に変更すれば動作すると思います。
>>> import machine
>>> import xbee
>>> xbee.atcmd(‘D1’,2)
>>> pin_adc = machine.Pin(‘D1’)
>>> batt_v = machine.ADC(pin_adc)
>>> batt_v.read()
312
>>>
ブログいつも拝見おります。
xbee3の件で又教えて頂きたい事があります。
ファームウエアーのアップデートでxbeeのmycropythonのmachineモジュールにpin class とadc classが追加されたので試してみたのですが…
cord.py
import machine
import xbee
xbee.atcmd(‘d0’, 2)
pin_adc = machine.Pin(‘d0’)
batt_v = machine.ADC(pin_adc)
print(batt_v)
上記のコードをxbeeのmycropythonで実行すると‘ValueError: pin ‘d0’ not a valid pin identifier’
の様なエラーが出ます。いろいろ試してみましたがpinの識別子がわかりません。
ご教授お願い致します。
情報、ありがとうございます。
同じように試してみました。
確かに、ポート名が小文字だとエラーが出ますね。
こんばんは、ご返信ありがとうございます。
もしかしたら、自分物凄い勘違いしているかもしれないです。TERATARMでXBEE3のMYCROPYTHONにコンパイルモードでコードをコピペしているだけです。
PCは自分もまだインストールしていません、もしかしたらPYCHARM使わないとコンパイルできないのでしょうか?
こんばんは。
失礼しました。貼り付けてコンパイルということですね。pyCharmは不要です。
ただ、残念ながらエラー内容は分からないです。
importされてないモジュールがあるのかもしれないです。
確実に動作するプログラムをコンパイルしてみるなど、原因を絞り込んでみてはいかがでしょう?
いつもお世話になっております。
あれから自分でもXBEE3でいろいろPYTHONでコードを書いて実験していました。
自分なりに結構使えそうなプログラムが書けたと思ったので、コンパイルモードでコンパイルしたのち、走らせてみたところ、BYTE CORD NOT IMPLEMENTEDというエラー吐き出してしまいます。
ペーストモードでは問題なく実行できます、何か考えられる原因があれば教えてください。
よろしくお願いいたします。
早いですね。早速、PyCharmを試されているのですね。
ボクはまだインストールすらしていないので、全く分からないです。
一般的な回答で申し訳ないですが、開発環境側のプラグインやターゲットの設定、必要なパッケージが入っていないとかでしょうか。
エラー内容をごっそりとGoogle検索してみると、分かるかもしれないです。
リセットの件ご回答ありがとうございました。コミッショニングボタンの4回押しマニュアルに書いてありましたね、見てなかったです。あとTSじゃなくSTでした失礼いたしました。ところでD0ピンをうっかりADCになどに設定した時でSTを極端に短くするとやはりXCTUではモジュールを見つけてもらえませんでした、XCTUにモジュールを認識させたあとならSTが1でもリセットすれば再設定できるんですが、新たにXCTUを起動してモジュールを認識させようとしてリセットボタンをおしても反応しないみたいです。因みに長押しもだめでした、XCTUの使い方に問題があるのでしょうか?何度もすみません
私も似たような不具合に遭遇することがありますが、対策方法は分からないです。ファームの更新で、ファームウェアを書き直すことで、復活させることもあります。
STに関しては、500ms(1f4)くらいにしておくと無難です。
500msでもXCTUとの接続に失敗して手間が増えることがあります。開発時のみの問題と考えて、実動作時と異なる設定で開発し、評価段階に入ってから本運用の設定を試すのが良いと思います。
こんばんは、お世話になっております。度々の質問で恐縮ですが、s2bでtsを短くすると再設定しにくくなっていましたがs2cではリセット長押しで工場出荷状態に戻せる様になってました、xbee3のマニュアルにはその様な強制リセットの記述をみつけらませんでしたがs2cと同じ仕様なのでしょうか?
STを短くしていても、リセットを押した状態で書き込を開始してからリセットを話せば、書き込めると思います。あとコミッショニングボタンの4回押しで、多くの設定が初期値に戻ると思います。
ご回答ありがとうございます。XBEE3安くなって便利になったので良かったのですが、ESP32みたいなかんじでXBEEもつかえるかなーと思っていたのですが今のところは、マイコン外付けするしかないですね。今度mbedの記事なども期待しています。
確かにXBee3のMicroPythonには出来ないことが多くて、MicroPythonが動く、から何も進んでいないです。
一方で、このメーカーは古くからPythonを推してきた経緯があるので、時間はかかるかもしれないですが、そのうち充実してくると期待しています。
mbedの件、ご提案ありがとうございます。実は、かなり前に、少しだけ使って見たことがあります。なかなか良いと思ったのですが、当時の反応は薄かったので、そのまま放ったらかしで、すでに忘れかけていました。ターゲットボードが良くなかったのかもしれないです。
https://bokunimo.net/xbee/xbee-nucleo.html
早速の回答ありがとうございます。MicroPythonのatcmd()ではピンの設定状態を知る事はできますが自ノードのdegital imput[3]に設定されたピンの状態やADC[2]のアナログ値の取得する方法がわかりませんISコマンドもサポートしてないみたいです。ご教授お願い致します。
#同じ内容こちらにも書きました。
失礼しました。現状、サポートされていないようです。
同じ質問がDigiのサポートに掲載されていました。
https://www.digi.com/support/forum/69188/how-to-read-digital-input-using-xbee