XBee3の新機能を試す。(MicroPython:REPL編1)

〔マイコンのトップに戻る〕
[Xbeeの実験] [FileSystem]   [REPL 2] [PyCharm導入] [PyCharmの操作] [PyCharmで開発]


前のページで、XBee3の”OTAファイルシステム”について記事にしました。
今度は、”MicroPython”が乗せて有る様なのであんばいをいじってみます。
尚、詳しい内容は、”Digi MicroPython Programming Guide”はこちらを参照しましょう。
又、”MicroPython ライブラリ”なるサイトが在ります、日本語なので何かと参考になるかもぉ。

MicroPython(マイクロパイソン)は、Python 3 標準ライブラリに基づいてマイクロコントローラ用に
最適化されたオープンソースプログラミング言語で、C言語ぽい言語体系です。
構文や機能はほとんど同じですが、XBee3 Zigbee RFモジュールなど、
ハードウェアリソースが限られている小型デバイスに適合するように変更されています。

※ XBee3を1個しか持っていません、なので相手が親機の場合は"S2Cコーディネーター"を
  相手が子機の場合は"S2ルーター"を使う事にします、勿論S2C/S2共にAPIモードです。
※ このページの記事は、”Digi MicroPython Programming Guide”を元に作成しています。

《XCTUを使ってMicroPython環境に入る》

@ ここまでの操作でこちらの"《パソコンと繋いでみる》"までの操作を終了していて、
  XBee3の「Configuration設定画面」が表示されているものとして説明します。
  尚、XCTUバージョンはV.6.4.3での説明となります。

(注) MicroPythonが入力に確実に反応する様にする為に、XBee3 UARTボーレートを115200ボーに
   設定する事を推奨します。
   UARTボーレートを設定するには、BDフィールドで "115200 [7]" を選択してWriteボタンを
   クリックしてください。
   特に大量のコードやテキストを貼付ける場合は、データの損失を防ぐ為にハードウェアフロー制御を
   使用する事を強くお勧めします。詳しくは、UARTフロー制御を参照して下さい。
   とデータシートに書いてはあります。

A 9600bpsでも動作はするけど115200bpsが早くて良いでしょう、設定しましょう。

BDフィールド


B XBee 3 Zigbee RFモジュールをMicroPythonモードにするには、
  APフィールドで "MicroPython REPL [4]" を選択してWriteボタンをクリックします。

APフィールド


C XCTUメニューバーから[Tools]→[MicroPython Terminal]を順にクリックして、
  [MicroPythonターミナル]ダイアログボックスを開きます。

D [MicroPythonターミナル]画面の[Open]アイコンをクリックし接続します。
  ("Open"すると"Close"アイコンに変わります)
  接続されたら、「ENTER」キーを押しましょう。
  >>>プロンプトが表示されたら、正しく接続されています。

MicroPythonターミナル画面1
これで、端末にMicroPythonのコードを入力又は貼り付ける事ができます。

E では、”ヘロー ワールド”等を、"print("Hello world")"を入力し「ENTER」キーを押しましょう。

MicroPythonターミナル画面1


F 終了は、[close]アイコンをクリックし切断後、[MicroPythonターミナル]ダイアログボックスを
  閉じましょう。

《その他の端末プログラムでMicroPython環境に入る》

ここでは"Tera Term"ターミナルエミュレーターを使用した例です。

@ XBee3をXBee USBインターフェースボードキットに取り付けてPCに接続しましょう。
  ”XBee USBインターフェースボードキット”の話は"XBee(無線通信)の実験パート1"を参照ください。

A "Tera Term"を起動すると、[Tera Term 新しい接続]ダイアログボックスが開かれます。
  "シリアル(E)"にチェックを入れ、"ポート(R):"でXBee3を接続しているCOMポートを選びます。
  (ポート番号は各自で異なりますよ、念の為)

TeraTerm起動画面
[OK]ボタンを押しましょう。

B メニューバーから[設定(S)]→[シリアルポート(E)...]を順にクリックして、
  [シリアルポート設定]ダイアログボックスを開きます。

シリアルポート設定画面
"フロー制御(F):"はHardwareを選択、"ボーレート(B):"を9600bpsから115200bpsに切り替え、
[OK]ボタンを押しましょう。
(勿論、XBee3側は”BDフィールドで115200 [7]”を選択していますよね)

C メニューバーから[設定(S)]→[端末(T)...]を順にクリックして、
  [Tera Term端末の設定]ダイアログボックスを開きます。

TeraTerm端末の設定
"ローカルエコー(L):"ボックスがチェックされていない事を確認して下さい。
"改行コード"エリアで、"受信(M):"ドロップダウンメニューをクリックし、[AUTO]を選択します。
[OK]ボタンを押しましょう。

D [Ctrl + B]を押してMicroPythonのバージョンバナーとプロンプトを表示します。
  (勿論、XBee3側は”APフィールドでMicroPython REPL [4]”を選択していますよね)

端末の画面1


E では、”ヘロー ワールド”等を、"print("Hello world")"を入力し「ENTER」キーを押しましょう。

端末の画面2

F 終了するには、メニューバーから[ファイル(F)]→[接続断(D)]を順にクリックして、
  接続を切ります、後は"Tera Term"を閉じます。

《REPLを使ったMicroPython》

MicroPythonはインタプリタ上で実行する事を前提に設計してあり、
サポートされたコマンドを即時実行する為の対話型プロンプト(REPL:read-eval-print-loop)が
用意されている。
MicroPython 対話インタプリタモード (別名 REPL)”のHPページも読んでおきましょう。

[ Micropython リセット ]

 ・端末のMicroPython >>>プロンプトの所で[Ctrl + D] を押せばソフトリセットが出来ます。
 ・下記のMicropythonコードを実行すればソフトリセットが出来ます。
 ------------------------------------------------------------------------------
  >>> import machine
  >>> machine.soft_reset()
 ------------------------------------------------------------------------------

[ Micropython help() ]

プロンプトでhelp()コマンドを入力すると、オンラインヘルプ、制御コマンド、及び使用例へのリンクが
表示されます。
 ------------------------------------------------------------------------------
  >>> help()
  Welcome to MicroPython!
  For online docs please visit http://docs.micropython.org/.
  Control commands:
  CTRL-A -- on a blank line, enter raw REPL mode
  CTRL-B -- on a blank line, enter normal REPL mode
  CTRL-C -- interrupt a running program
  CTRL-D -- on a blank line, reset the REPL
  CTRL-E -- on a blank line, enter paste mode
  CTRL-F -- on a blank line, enter flash upload mode
  For further help on a specific object, type help(obj)
  For a list of available modules, type help('modules')
 ------------------------------------------------------------------------------
  制御コマンド:
  CTRL-A  - rawのREPLモードに入る。(貼り付けモードに似ていますが、文字がエコーバックされない点が異なります)
  CTRL-B  - 通常のREPLモードに入る、またはMicroPythonのバナーを表示します。
  CTRL-C  - 現在実行中のプログラムの中断を行います。
  CTRL-D  - REPLをリセット(再起動)し、ヒープをクリアします。
  CTRL-E  - 貼り付けモードに入ります。
  CTRL-F  - コードをフラッシュにアップロードします。
  特定のオブジェクトについてさらにヘルプが必要な場合は、help(obj)と入力してください。
  利用可能なモジュールの一覧を表示するには、help('modules')と入力してください。
 ------------------------------------------------------------------------------
プロンプトでhelp('modules')と入力すると、利用可能な全てのMicropythonモジュールが表示されます。
 ------------------------------------------------------------------------------
  >>> help('modules')
  __main__             io               time               uos
  array                json             ubinascii          ustruct
  binascii             machine          uerrno             utime
  builtins             micropython      uhashlib           xbee
  errno                os               uio
  gc                   struct           ujson
  hashlib              sys              umachine
  Plus any modules on the filesystem
  (ファイルシステム上の任意のモジュール)
 ------------------------------------------------------------------------------
Micropythonのモジュール説明は、"MicroPython ライブラリ"のHPページを参照しましょう。

モジュールをインポートし、そのモジュールをオブジェクトとしてhelp(モジュール名)と入力すると、
そのオブジェクトがサポートしている全ての関数を照会できます。
 ------------------------------------------------------------------------------
  >>> import sys
  >>> help(sys)
  object <module 'sys'>is of type module
  (オブジェクト <module 'sys'> はmodule型です)
   __name__ -- sys
   path -- ['', '/flash', '/flash/lib']
   argv -- ['']
   version -- 3.4.0
   version_info -- (3, 4, 0)
   implementation -- ('micropython', (1, 10, 0))
   platform -- xbee3-Zigbee
   byteorder -- little
   maxsize -- 2147483647
   exit -- <function>
   stdin -- <io.FileIO 0>
   stdout -- <io.FileIO 1>
   stderr -- <io.FileIO 2>
   modules -- {}
   print_exception -- <function>
 ------------------------------------------------------------------------------

[ MicroPythonの貼り付けモードに入る ]

MicroPythonが貼り付けモードをサポートしていることを知っておくと役立ちます。
このモードでは、大きなコードブロックをコピーして、文字単位で入力する代わりに貼り付ける事が
できます。

@ 例えば下記のコード例をコピーします。
------------------------------------------------------------------------------
for i in range(10):
     if i > 5:
          break
     print(i)
------------------------------------------------------------------------------
A 端末のMicroPython >>>プロンプトの所で[Ctrl + E] を押して貼り付けモードに入ります。
   ">>>"のプロンプトが、"行番号==="となります。
  ------------------------------------------------------------------------------
  >>>
  paste mode; Ctrl-C to cancel, Ctrl-D to finish
  1===
  ------------------------------------------------------------------------------
B MicroPython端末ウィンドウを右クリックしてサブメニューから[貼り付け]をクリックするか、
  [Ctrl + Shift + V] を押して貼り付けます。
  ------------------------------------------------------------------------------
  >>>
  paste mode; Ctrl-C to cancel, Ctrl-D to finish
  1=== for i in range(10):
  2===      if i > 5:
  3===          break
  4===     print(i)
  ------------------------------------------------------------------------------
C [Ctrl + D]を押して終了します。
  直ぐに貼り付けたテキストがコンパイルされ実行されます。

貼り付けモード実行結果1


[ 時間モジュールを使う ]

時間(time)モジュールは、ルーチンやタイマーに遅延を発生させるなどの操作に使用されます。
XBee3 Zigbee RFモジュールでは、以下の時間機能がサポートされていますが、
標準のtime.time()関数は利用できません、これはXBee3モジュールはリアルタイムクロックを
欠いており、日付や時間のデータを提供する事はできません
以下は、"time"モジュールの関数一覧です。
 ------------------------------------------------------------------------------
 >>> import time
 >>> help(time)
 object <module 'utime'> is of type module
   __name__ -- utime
   sleep -- <function>
   sleep_ms -- <function>
   sleep_us -- <function>
   ticks_ms -- <function>
   ticks_us -- <function>
   ticks_cpu -- <function>
   ticks_add -- <function>
   ticks_diff -- <function>
 >>>
 ------------------------------------------------------------------------------
 ・ sleep()   :設定された秒数だけ操作を遅らせます、sleep(0.5)とすれば500ms遅延します。
 ・ sleep_ms() :設定したミリ秒数だけ操作を遅らせます。
 ・ sleep_us() :設定されたマイクロ秒数の間、操作を遅らせます。
 ・ ticks_ms() :現在の稼働時間のミリ秒カウンタ値を返します。
         このカウンターは0x40000000でロールオーバーします。
 ・ ticks_add() :現在の稼働時間から指定した時間を加算した時刻を返します。
 ・ ticks_diff() :2つのタイムスタンプの差をミリ秒単位で比較し、その値を返します。

次の例では、さまざまなsleep関数を実行し、ticks_diff()を使用して期間を測定します。
--------------------------------------------------------------------------------
import time

start = time.ticks_ms() # ミリ秒カウンタから値を取得する

time.sleep(1) # 1秒間スリープ
time.sleep_ms(500) # 500ミリ秒間スリープ
time.sleep_us(1000) # 1000マイクロ秒間スリープ

delta = time.ticks_diff(time.ticks_ms(), start)

print("Operation took {} ms to execute".format(delta))
--------------------------------------------------------------------------------
実行結果
日本語は表示できないので"??????"となっているが、コメントなのでOKでしょう。
--------------------------------------------------------------------------------
>>> 
paste mode; Ctrl-C to cancel, Ctrl-D to finish
   1=== import time
   2=== 
   3=== start = time.ticks_ms() # ???????????????
   4=== 
   5=== time.sleep(1) # 1??????
   6=== time.sleep_ms(500) # 500????????
   7=== time.sleep_us(1000) # 1000??????????
   8=== 
   9=== delta = time.ticks_diff(time.ticks_ms(), start)
  10=== 
  11=== print("Operation took {} ms to execute".format(delta))
Operation took 1501 ms to execute
>>>
--------------------------------------------------------------------------------
次の例では、現在の稼働時間の100ms前と100ms後の時間を表示させてみました。
引数は、"time.ticks_us()"もできるが、100msではなく100usとなりますよ。
--------------------------------------------------------------------------------
paste mode; Ctrl-C to cancel, Ctrl-D to finish
   1=== print(time.ticks_ms())
   2=== print(time.ticks_add(time.ticks_ms(), -100))
   3=== print(time.ticks_ms())
   4=== print(time.ticks_add(time.ticks_ms(), 100))
4045771
4045671
4045771
4045871
--------------------------------------------------------------------------------

[ MicroPythonを使用したATコマンド ]

ATコマンドはXBee3 Zigbee RFモジュールを制御します。
XBee3 Zigbee RFモジュールで使用できるATコマンドのリストについては、ATコマンドを参照ください。
MicroPythonには、コマンドモード又はAPIフレームの使用方法と同様に、ATコマンドを処理する為の
atcmd()メソッドが用意されています。

atcmd()メソッドは2つのパラメータを受け取ります:
 1. 1番目のパラメータは、2文字のATコマンドで文字列として入力します。
 2. 2番目のパラメータは、ATコマンド値を設定する為に使用されるオプション値です。
   このパラメータが指定されていない場合、ATコマンドは設定されずに照会されます。
   この値は、ATコマンドに応じて、整数、bytesオブジェクト、又は文字列です。

(注)xbee.atcmd()メソッドは、IS、AS、ED、ND、またはDNのATコマンドをサポートしません。
以下は、"xbee"モジュールの関数一覧です。
 --------------------------------------------------------------------------------
 >>> import xbee
 >>> help(xbee)
 object <module 'xbee'> is of type module
   __name__ -- xbee
   XBee -- <class 'XBee'>
   atcmd -- <function>
   relay -- <module 'relay'>
   discover -- <function>
   receive -- <function>
   transmit -- <function>
   ADDR_BROADCAST -- b'\x00\x00\x00\x00\x00\x00\xff\xff'
   ENDPOINT_DIGI_DATA -- 232
   CLUSTER_DIGI_SERIAL_DATA -- 17
   PROFILE_DIGI_XBEE -- 49413
   ADDR_COORDINATOR -- b'\x00\x00\x00\x00\x00\x00\x00\x00'
   PIN_WAKE -- 1
   RTC_WAKE -- 2
 >>>
 --------------------------------------------------------------------------------
以下は、xbee.atcmd()を使用してさまざまなATコマンドを照会および設定するコード例です。
--------------------------------------------------------------------------------
import xbee

# NI文字列(ノード識別子)を設定します
xbee.atcmd("NI", "XBee3 module")

# ATコマンドをいくつか読み、値とデータ型を表示します
print("\nAT command parameter values:")
commands =["SH", "SL", "NI", "CK"]

for cmd in commands:
     val = xbee.atcmd(cmd)
     print("{}: {:20} of type {}".format(cmd, repr(val), type(val)))
--------------------------------------------------------------------------------
実行結果
--------------------------------------------------------------------------------
>>> 
paste mode; Ctrl-C to cancel, Ctrl-D to finish
   1=== import xbee
   2=== 
   3=== # NI???(??????)??????
   4=== xbee.atcmd("NI", "XBee3 module")
   5=== 
   6=== # AT????????????????????????
   7=== print("\nAT command parameter values:")
   8=== commands =["SH", "SL", "NI", "CK"]
   9=== 
  10=== for cmd in commands:
  11===      val = xbee.atcmd(cmd)
  12===      print("{}: {:20} of type {}".format(cmd, repr(val), type(val)))

AT command parameter values:
SH: b'\x00\x13\xa2\x00'  of type <class 'bytes'>
SL: b'A\x93\xf3^'        of type <class 'bytes'>
NI: 'XBee3 module'       of type <class 'str'>
CK: 255                  of type <class 'int'>
--------------------------------------------------------------------------------
(注)長さが16ビットを超える値を格納するパラメーターは、バイトとして表されます。
   Pythonは可能な限りASCII文字を出力しようとしますが、これは予期しない出力を引き起こす
   可能性があります。("SL"は"b'\x41\x93\xf3\x5e'"ですがぁ、上記の様に表示されました)
   MicroPythonからの出力をXCTUと一致させる場合は、次の例を使用してバイトを16進数に変換
   できます。
   --------------------------------------------------------------------------------
   >>> 
   paste mode; Ctrl-C to cancel, Ctrl-D to finish
      1=== sl_value = xbee.atcmd("SL")
      2=== print(hex(int.from_bytes(sl_value, 'big')))
   0x4193f35e
   --------------------------------------------------------------------------------

[ MicroPythonによるZigbeeネットワーク ]

小規模ネットワークの場合は、全てのノードでMicroPythonを使用するのが適しています。
しかし、密集したいくつかのノードでMicroPythonを使用できない様にする制限がいくつかあります。

 ・ MicroPythonを実行している場合、受信したメッセージは全て小さな受信キューに格納されます。
   このキューには4パケット分のスペースしかなく、データ損失を防ぐ為には定期的に読み取る必要が
   あります。
   大量のトラフィックを生成するネットワークでは、データ収集は全ての着信データをキャプチャする
   為に、APIモードで動作する必要があります
 ・ MicroPythonは、特にソースルーティングの為に、全てのXBee APIフレームタイプをサポート
   している分けではありません。
   40ノードを超えるネットワークで運用する場合は、データ収集をAPIモードで運用し、
   ソースルーティングを実装する事を強くお勧めします。

(警告!) 今後の例では、暗号化(EE=0)されていないZigbeeネットワークを形成して参加します。
     モジュールが以前にネットワークに関連付けられていた場合、それらは関連付け解除されます。

[ MicroPythonを使用したネットワーク探索 ]

xbee.atcmd()は"ND"コマンドを利用できませんね、そこで
xbee.discover()メソッドは、ND要求の実行と同様に返します。結果を待っている間はブロックされる
詳しくは、ATコマンドのND(ネットワーク探索)を参照して下さい。
各結果は、ND応答に基づくフィールドを持つリスト出力です。
 ・ rssi      :送信ノードが受信したノード発見要求パケットの相対信号強度値(dBm)
 ・ node_id   :デバイスのNI値(最大20文字の文字列。ノード識別とも呼ばれます)。
 ・ device_type  :デバイスの32ビットDD値。Digiデバイスタイプとも呼ばれます。
          これは、さまざまな種類のデバイス又はハードウェアを識別する為に使用されます。
 ・ parent_nwk :コーディネータとルータでは0xFFFEに設定されます。
          それ以外の場合、これはエンドデバイスの親のネットワークアドレスに設定されます
 ・ sender_nwk :16ビットネットワークアドレス。
 ・ sender_eui64:EUI-64アドレスを持つ8バイトのバイトオブジェクト。
 ・ node_type  :コーディネーター(0)、ルーター(1)、エンドデバイス(2)の値。

(注)リストを表示する時に、device_type、sender_nwk、parent_nwkのフィールドは10進数で
   表示されます。これは、MicroPythonのhex()メソッドを使用して、整数を16進数で表示できます。

ネットワーク検出を実行するには、次のコード例を使用します。
尚、自機(XBee3ルーター)とS2Cコーディネーターも電源をいれてみた。
自機とS2ルーターでも動作します、自機のネットワーク内全てが検出対象でしょう。
--------------------------------------------------------------------------------
import xbee, time

# ネットワーク探索オプションを設定する、自分も含める
xbee.atcmd("NO", 2)
xbee.atcmd("AC") # 変更を適用する
time.sleep(.5)   # 0.5秒待つ

# ネットワーク探索を実行して結果を出力する
print ("Network Discovery in process...")
nodes = list(xbee.discover())
if nodes:
     for node in nodes:
          print("\nRadio discovered:")
          for key, value in node.items():
               print("\t{:< 12} : {}".format(key, value))

# NOをデフォルト値に戻す
xbee.atcmd("NO", 0)
xbee.atcmd("AC") # 変更を適用する
--------------------------------------------------------------------------------
実行結果
2個のデバイスリストが表示されています。
検索には少し時間が掛かります。
--------------------------------------------------------------------------------
>>> 
paste mode; Ctrl-C to cancel, Ctrl-D to finish
   1=== import xbee, time
   2=== 
   3=== # ?????????????????????????
   4=== xbee.atcmd("NO", 2)
   5=== xbee.atcmd("AC") # ???????
   6=== time.sleep(.5)   # 0.5???
   7=== 
   8=== # ????????????????????
   9=== print ("Network Discovery in process...")
  10=== nodes = list(xbee.discover())
  11=== if nodes:
  12===      for node in nodes:
  13===           print("\nRadio discovered:")
  14===           for key, value in node.items():
  15===                print("\t{:< 12} : {}".format(key, value))
  16=== 
  17=== # NO??????????
  18=== xbee.atcmd("NO", 0)
  19=== xbee.atcmd("AC") # ???????
Network Discovery in process...

Radio discovered:
        rssi         : -50
        node_id      :  
        device_type  : 1179648
        parent_nwk   : 65534
        sender_nwk   : 3244
        sender_eui64 : b'\x00\x13\xa2\x00A\x93\xf3^'
        node_type    : 1

Radio discovered:
        rssi         : -61
        node_id      :  S2C  Coordinator
        device_type  : 655360
        parent_nwk   : 65534
        sender_nwk   : 0
        sender_eui64 : b'\x00\x13\xa2\x00AQ\x04k'
        node_type    : 0
--------------------------------------------------------------------------------
※ XBee3をコーディネーターとして上のコードを実行させた、S2/S2Cルーターが表示されない。
  XBee3をコーディネーターとした場合、MicroPython同しでないとダメなのかも。


[ MicroPythonを使用してZigbeeネットワークを形成し参加する ]

この例では、MicroPythonを使用して2個のZigbeeネットワークを形成します。
これは以降のネットワーキングのサンプル例の前提条件です。

以下の例は、”ルーター”側のコードです。
親機(S2Cコーディネーター)側の電源を入れて置き下記コードを実行させます。
--------------------------------------------------------------------------------
import xbee, time

# 無線機の識別文字列を設定します
xbee.atcmd("NI", "Router")

# いくつかの基本的なネットワーク(ルーター)設定を行います
network_settings = {"CE": 0, "ID": 0x777, "EE": 0}

for command, value in network_settings.items():
     xbee.atcmd(command, value)
xbee.atcmd("AC") # 変更を適用する
time.sleep(1)    # 1秒待つ

# ネットワーク接続成功を報告するまでAIに問い合わせる
print("Connecting to network, please wait...")
while xbee.atcmd("AI") != 0:
     time.sleep(0.1)  # 0.1秒待つ
print("Connected to Network")

# 接続したら、PAN ID、拡張PAN ID、チャンネル番号を表示する
operating_network = ["OI", "OP", "CH"]
print("Operating network parameters:")
for cmd in operating_network:
     print("{}: {}".format(cmd, xbee.atcmd(cmd)))
--------------------------------------------------------------------------------
実行結果
"OP"の表示は崩れていますね、MicroPythonのhex()メソッドを使用して、整数を16進数で表示できます。
-------------------------------------------------------------------------------- >>> paste mode; Ctrl-C to cancel, Ctrl-D to finish 1=== import xbee, time 2=== 3=== # ??????????????? 4=== xbee.atcmd("NI", "Router") 5=== 6=== # ???????????????(????)??????? 7=== network_settings = {"CE": 0, "ID": 0x777, "EE": 0} 8=== 9=== for command, value in network_settings.items(): 10=== xbee.atcmd(command, value) 11=== xbee.atcmd("AC") # ??????? 12=== time.sleep(1) # 1??? 13=== 14=== # ?????????????????AI??????? 15=== print("Connecting to network, please wait...") 16=== while xbee.atcmd("AI") != 0: 17=== time.sleep(0.1) # 0.1??? 18=== print("Connected to Network") 19=== 20=== # ??????PAN ID???PAN ID????????????? 21=== operating_network = ["OI", "OP", "CH"] 22=== print("Operating network parameters:") 23=== for cmd in operating_network: 24=== print("{}: {}".format(cmd, xbee.atcmd(cmd))) 25=== Connecting to network, please wait... Connected to Network Operating network parameters: OI: 26578 OP: b'\x00\x00\x00\x00\x00\x00\x07w' CH: 22 --------------------------------------------------------------------------------
以下の例は、”コーディネーター”側のコードです。
--------------------------------------------------------------------------------
import xbee, time

# 無線機の識別文字列を設定します
xbee.atcmd("NI", "Coordinator")

# いくつかの基本的なネットワーク設定を行います(NJ=FFは常に参加ウインドウを開いて置く)
network_settings = {"CE": 1, "ID": 0x777, "EE": 0, "NJ": 0xFF}

for command, value in network_settings.items():
     xbee.atcmd(command, value)
xbee.atcmd("AC") # 変更を適用する
time.sleep(1)    # 1秒待つ

# ネットワーク接続が成功するまで待つ
while xbee.atcmd("AI") != 0:  
     time.sleep(0.1)  # 0.1秒待つ
print("Network Established")

# 接続したら、PAN ID、拡張PAN ID、チャンネル番号を表示する
operating_network = ["OI", "OP", "CH"]
print("Operating network parameters:")
for cmd in operating_network:
     print("{}: {}".format(cmd, xbee.atcmd(cmd)))
--------------------------------------------------------------------------------
実行結果
"OP"の表示は崩れていますね、MicroPythonのhex()メソッドを使用して、整数を16進数で表示できます。
このコード実行でルーターが参加できる状態となります。 -------------------------------------------------------------------------------- >>> paste mode; Ctrl-C to cancel, Ctrl-D to finish 1=== import xbee, time 2=== 3=== # ??????????????? 4=== xbee.atcmd("NI", "Coordinator") 5=== 6=== # ??????????????????????(NJ=FF????????????????) 7=== network_settings = {"CE": 1, "ID": 0x777, "EE": 0, "NJ": 0xFF} 8=== 9=== for command, value in network_settings.items(): 10=== xbee.atcmd(command, value) 11=== xbee.atcmd("AC") # ??????? 12=== time.sleep(1) # 1??? 13=== 14=== # ????????????????? 15=== while xbee.atcmd("AI") != 0: 16=== time.sleep(0.1) # 0.1??? 17=== print("Network Established") 18=== 19=== # ??????PAN ID???PAN ID????????????? 20=== operating_network = ["OI", "OP", "CH"] 21=== print("Operating network parameters:") 22=== for cmd in operating_network: 23=== print("{}: {}".format(cmd, xbee.atcmd(cmd))) 24=== Network Established Operating network parameters: OI: 13752 OP: b'\x00\x00\x00\x00\x00\x00\x07w' CH: 19 --------------------------------------------------------------------------------

[ ネットワークコーディネータにメッセージを送信する ]

XBee 3 Zigbeeデバイスからメッセージを送信するには、XBeeモジュールを使用します。
transmit()関数呼び出しは、以下のパラメーターで構成されています。
 1.宛先アドレス。次のいずれかになります。
  ・16ビットアドレス指定用の整数
  ・64ビットアドレッシング用の8バイトのバイトオブジェクト
  ・ブロードキャスト先を示すxbee.ADDR_BROADCAST定数
  ・コーディネータを示す定数xbee.ADDR_COORDINATOR
 2.文字列としてのメッセージ。

メッセージが正常に送信された場合、transmit()はNoneを返します。
ACKの失敗または受信側の空きバッファ領域の不足が原因で送信が失敗した場合、送信されたパケットは
暗黙のうちに破棄されます。

次の操作をしてみましょう。
 1.親機(S2Cコーディネータ)を”USBシリアル変換モジュールで繋いでみる”の様に配線します、
   2個目のXCTUを起動させ、[コンソール画面]を起動させておきます。
   親機の設定はXBeeパート3の"親機の設定を行う(APIモード)"を参照下さい。
 2.ルータ(XBee3)のXCTUからMicroPython環境にアクセスします。
 3. MicroPython >>>プロンプトで、import xbeeと入力して「ENTER」キーを押します。
 4. MicroPython >>>プロンプトで、
   xbee.transmit(xbee.ADDR_COORDINATOR,"Hello Coordinator!")と入力して、
   て「ENTER」キーを押します。
   --------------------------------------------------------------------------------
   >>> 
   >>> import xbee
   >>> xbee.transmit(xbee.ADDR_COORDINATOR,"Hello Coordinator!")
   >>> 
   --------------------------------------------------------------------------------
親機(S2Cコーディネータ)側XCTUの[コンソール画面]を見てみましょう、
APIフレーム"90"でメッセージが送られてきましたね。

親機のコンソール画面
上記の方で記述した"ルーター側コード"と合体したコード作成もできますね。


[ コーディネータがメッセージを受信する ]

上記にも書いたがぁ、XBee3をコーディネータにする場合は、ルータ/エンドデバイス側もXBee3でないとぉ ダメかもしれない、現在XBee3は1個しか持っていないのでこの辺の実験はXBee3をもう1個手に入れたら 行おうと思います。

PS.”MicroPython:REPL編2”にてXBee3を2個での話は記事にしました。 *2)

[ フラッシュメモリと自動コード実行 ]

フラッシュメモリは、電力がなくても、そこに格納されているものは全て保持される為、「不揮発性」
メモリと呼ばれます。
これにより、XBeeデバイスを起動した時にフラッシュメモリに保存されているコードを
実行する事ができます

以下のコードは、LEDを点滅させる物でそのコードで説明します。(XBeeセルラーモデムのみ適用)
  1.XBee3モジュールの"D4"ピンにLEDを取り付けます、
  2. MicroPython環境にアクセスします。
  3. 貼り付けたいコードをコピーします。
    この例では、XBee3のD4ピンのLEDライトを2秒毎に点滅させる次のコードを使用します。
--------------------------------------------------------------------------------
from machine import Pin
import time
dio4 = Pin("D4", Pin.OUT, value=0)
while True:
     time.sleep(1)
     dio4.toggle() # Flash the LED on DIO4 (D4)
--------------------------------------------------------------------------------
  4. MicroPython >>>プロンプトで、[Ctrl + F] を押します。
  5. MicroPython 1 ^^^プロンプトで、右クリックして[貼り付け]オプションを選択します。
  6. コードが端末に表示され、各行に番号が付けられ、その後に^^^が続きます。
    例えば、1行目は1 ^^^で始まります。
    --------------------------------------------------------------------------------
    >>> 
    flash compile mode; Ctrl-C to cancel, Ctrl-D to finish
       1^^^ from machine import Pin
       2^^^ import time
       3^^^ dio4 = Pin("D4", Pin.OUT, value=0)
       4^^^ while True:
       5^^^      time.sleep(1)
       6^^^      dio4.toggle() # Flash the LED on DIO4 (D4)
    --------------------------------------------------------------------------------
  7. [Ctrl + D]を押して終了します。
    --------------------------------------------------------------------------------
    Erasing /flash/main.mpy...
    Compiling 149 bytes of code...
    Saved compiled code to /flash/main.mpy (127 bytes).
    Automatically run this code at startup [y/N]? 
    --------------------------------------------------------------------------------
    /flash/main.mpyを消去しています...
    149バイトのコードをコンパイルしています...
    コンパイル済みコードを/flash/main.mpy(127バイト)に保存しました。
    起動時にこのコードを自動的に実行しますか[y/N]? 
    --------------------------------------------------------------------------------

ファイルシステムマネージャー画面
この様にファイルシステムマネージャーを見てみると、"main.mpy"が登録保存されていますね。
注意は、"main.mpy"はコンパイルされたファイルと言う事です。

  8. 起動時にコードを自動実行する為に、「Y」キーを押します。
    --------------------------------------------------------------------------------
    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.
    (REPLでCTRL-Rを押すと、いつでもコードを実行できます。)

    MicroPython v1.11-1227-g52e306b on 2019-07-10; XBee3 Zigbee with EFR32MG
    Type "help()" for more information.
    >>>
    --------------------------------------------------------------------------------

PSコマンド設定画面
PSフィールド(MicroPython Auto Stat)が"Enabled[1]"になります。
勿論、起動時にこのコードを実行しなければ"Disabled[0]"にすればOKですね。

  9. デバイスの電源を入れ直す前にコードをテストする事をお勧めします。
 10. [Ctrl + R]を押して、フラッシュでコンパイルされたコードを実行します。
    正しく機能しない場合は、[Ctrl + C]を押して中断し、新しいバージョンをアップロードして
    ください。
    --------------------------------------------------------------------------------
    >>> 
    Loading /flash/main.mpy...
    Running bytecode...
    --------------------------------------------------------------------------------
 11. アップロードしたコードに問題がなければ、XBeeセルラーモデムの電源を切ります。
 12. USBケーブルをコンピュータに接続します。
 13. MicroPython環境にアクセスします。 MicroPythonはLEDを点滅させるコードを実行している為、
    MicroPythonのプロンプトは表示されません
 14. コードループが実行されると、端末は応答しなくなります。
    "D4"のLEDは2秒毎に点灯してから消えます。
 15. 端末で[Ctrl + C]を押してコードの実行を停止し、端末の制御を取り戻します。
    MicroPythonのプロンプトが表示され、LEDの点滅が止まります。


《その他》

上で解説の様に”テキストエディタ”で作成し、XBee3のMicroPythonプロンプトにコピーし動作を
確認するって言うのは、面倒くさい。
そこでぇ、"PyCharm"のIDEで開発しようと思いダウンロードした。
”Digi MicroPython Programming Guide”にも"PyCharm"に"XBee MicroPython"プラグインを
導入すれば良さげな事が書いてあるので、"PyCharm"に"XBee MicroPython"プラグインを
インストールしたのだがぁ、
「プラグイン 'XBee MicroPython'はこのインストールと互換性がありません」のエラーが表示され
インストールできませんでした、色々行ったがダメで諦めました。

"PyCharm"でぇ開発したいぞぉDigi、どうなっているんだぁーーーーー。
”XBee3の新機能を試す。(MicroPython:PyCharm編)”を書かせろーーーー。

そんな感じでぇ、記事も半端な様なふうになったがぁ、XBee3もう少しいじり倒したいと思う。

PS.
19/8/6日現在、"XBee MicroPython"プラグインが"Ver 1.0.2"に変更されインストール出来そうな
感じです。 *1)



追記(*2) 2019/08/15
追記(*1) 2019/08/06


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2019 Shigehiro Kimura All Rights Reserved.