〔マイコンのトップに戻る〕
[Xbeeの実験]
[FileSystem]
[REPL 2]
[PyCharm導入]
[PyCharmの操作]
[PyCharmで開発]
これで、端末にMicroPythonのコードを入力又は貼り付ける事ができます。
[OK]ボタンを押しましょう。
"フロー制御(F):"はHardwareを選択、"ボーレート(B):"を9600bpsから115200bpsに切り替え、
[OK]ボタンを押しましょう。
(勿論、XBee3側は”BDフィールドで115200 [7]”を選択していますよね)
"ローカルエコー(L):"ボックスがチェックされていない事を確認して下さい。
"改行コード"エリアで、"受信(M):"ドロップダウンメニューをクリックし、[AUTO]を選択します。
[OK]ボタンを押しましょう。
------------------------------------------------------------------------------ >>> import machine >>> machine.soft_reset() ------------------------------------------------------------------------------
------------------------------------------------------------------------------ >>> 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ページを参照しましょう。
------------------------------------------------------------------------------ >>> 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> ------------------------------------------------------------------------------
------------------------------------------------------------------------------ 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端末ウィンドウを右クリックしてサブメニューから[貼り付け]をクリックするか、
------------------------------------------------------------------------------ >>> 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]を押して終了します。
以下は、"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遅延します。
-------------------------------------------------------------------------------- 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後の時間を表示させてみました。
-------------------------------------------------------------------------------- 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 --------------------------------------------------------------------------------
以下は、"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ビットを超える値を格納するパラメーターは、バイトとして表されます。
-------------------------------------------------------------------------------- >>> 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 --------------------------------------------------------------------------------
-------------------------------------------------------------------------------- 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ルーターが表示されない。
-------------------------------------------------------------------------------- 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 --------------------------------------------------------------------------------
-------------------------------------------------------------------------------- >>> >>> import xbee >>> xbee.transmit(xbee.ADDR_COORDINATOR,"Hello Coordinator!") >>> --------------------------------------------------------------------------------親機(S2Cコーディネータ)側XCTUの[コンソール画面]を見てみましょう、
上記の方で記述した"ルーター側コード"と合体したコード作成もできますね。
-------------------------------------------------------------------------------- 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] を押します。
-------------------------------------------------------------------------------- >>> 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"はコンパイルされたファイルと言う事です。
-------------------------------------------------------------------------------- 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フィールド(MicroPython Auto Stat)が"Enabled[1]"になります。
勿論、起動時にこのコードを実行しなければ"Disabled[0]"にすればOKですね。
-------------------------------------------------------------------------------- >>> Loading /flash/main.mpy... Running bytecode... --------------------------------------------------------------------------------11. アップロードしたコードに問題がなければ、XBeeセルラーモデムの電源を切ります。
追記(*2) 2019/08/15
追記(*1) 2019/08/06
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2019 Shigehiro Kimura All Rights Reserved.