稼働中

マイクロビット(m_16)モジュール os radio

module – os radio

thonny-microbitには「antigravity、array、audio、builtins、collections|ucollections、gc、love、machine、math、microbit、micropython、music、neopixel、os、radio、random、speech、sys、struct|ustruct、time|utime、this」のモジュールがあります。※microbitモジュールは既に記載しました。

(d-12)os-module

osモジュールを読み込むと「remove, listdir, size, uname]」の関数が使えます。
デバイス上の簡易なファイルシステムの管理や情報に関連した機能があります。

(12-01)os.listdir()

マイクロビットにあるファイルリストを表示します。


>>> import os
>>> os.listdir()
['robot-01.raw', 'robot-03.raw', 'main.py', 'boot.py', 'const_d.py', 'robot-04.raw',
 'robot-02.raw']        #通常 'main.py', 'boot.py' だけです。

(12-02)os.remove(name)

マイクロビットにあるファイルを削除します。


>>> import os
>>> os.listdir()
['robot-01.raw', 'robot-03.raw', 'main.py', 'boot.py', 'const_d.py', 
'robot-04.raw', 'robot-02.raw']

>>> os.remove('const_d.py')         #'const_d.py'を削除します。
>>> os.listdir()
['robot-01.raw', 'robot-03.raw', 'main.py', 'boot.py', 'robot-04.raw', 'robot-02.raw']

(12-03)os.size(filename)

ファイルが占めるバイト数を返します。


>>> import os
>>> os.listdir()
['robot-01.raw', 'robot-03.raw', 'main.py', 'boot.py', 'robot-04.raw', 'robot-02.raw']
>>> os.size('robot-01.raw')         #'robot-01.raw'のサイズを調べます。
4000

(12-04)os.uname()

現在のオペレーティングシステムをの情報を返します。
sysname – OS の名前
nodename – (実装時に定義された) ネットワーク上でのマシン名
release – OS のリリース
version – OS のバージョン
machine – ハードウェア識別子


>>> import os
>>> os.uname()
(sysname='microbit', nodename='microbit', release='1.0.1', version='micro:bit 
v1.0.1+b0bf4a9 on 2018-12-13; MicroPython v1.9.2-34-gd64154c73 on 2017-09-01', 
machine='micro:bit with nRF51822')

– micro:bit V2 –

(12-05)os.ilistdir() -v2

イテレータを返します。イテレータが生成するのは、ディレクトリ内のエントリに対応するタプルです。
タプルの形式は (name, type, inode ) です。
name:エントリの名前です。ファイル名です。
type:エントリのタイプを指定する整数で、ディレクトリの場合は 0x4000(16384)、通常のファイルの場合は 0x8000(32768) です。
inode:ファイルのiノードに対応する整数らしいです。micro:bitのファイルシステムは対応してないので’0’になると思います。
micro:bitのファイルシステムに階層はないのでファイルだけだと思います。


>>> os.listdir()        # micro:bitにあるファイル
['test_01.py', 'test_03.py', 'test_02.py', 'main.py']

>>> ite=os.ilistdir()
>>> print(next(ite))    # 0番目のファイル
('test_01.py', 32768, 0)         # ファイルなので hex(32768)'0x8000'

>>> print(next(ite))    # 次のファイル
('test_03.py', 32768, 0)
>>> print(next(ite))
('test_02.py', 32768, 0)
>>> print(next(ite))
('main.py', 32768, 0)
>>> print(next(ite))    # 次のファイルが無いのでエラー
Traceback (most recent call last):
  File "", line 1, in 
StopIteration: 
>>> 

(12-06)osos.stat() -v2

ファイルまたはディレクトリのステータスを取得します。micro:bitではファイルだけだと思います。


>>> os.stat('main.py')
(32768, 0, 0, 0, 0, 0, 123, 0, 0, 0)
>>> hex(32768)
'0x8000'                # ファイル
>>> 

(d-13)radio-module

osモジュールを読み込むと「reset, config, on, off, send_bytes, receive_bytes, send, receive, receive_bytes_into, receive_full」の関数と「RATE_250KBIT, RATE_1MBIT, RATE_2MBIT」の定数が使えます。

「RATE_250KBIT, RATE_1MBIT, RATE_2MBIT」はconfigで設定するデータ転送速度の定数です。RATE_1MBITが標準です。

(13-01)radio.on()、radio.off()

radio.on()
無線通信をオンにします。無線通信は電力やメモリを占有するため、明示的に呼び出す必要があります。

radio.off()
無線通信をオフにして、電力とメモリを節約します。

(13-02)radio.config(**kwargs)

無線通信の設定をします。radio.config(channel=7)のようにキーワードで設定します。
channel、address、group、data_rate は送側、受側で同じ設定にします。

length (デフォルト=32)
送信されるメッセージのバイト単位の最大長を設定します。最大で 251 バイトです。


>>>radio.config(length=32) 

queue (デフォルト=3)
受信キューに格納できるメッセージの数を指定します。キューに空きがない場合、メッセージは捨てられます。


>>>radio.config(queue=5) 

channel (デフォルト=7)
0 から 83 までの整数値で「チャネル」を設定します。チャンネルは1MHz 幅で、2400MHz を基準にしています。


>>radio.config(channel=22)

power (デフォルト=6)
信号の強度で、0 から 7 を設定できです。値が高いほど信号は強くなりますが、消費電力が大きくなります。
各々-30, -20, -16, -12, -8, -4, 0, 4(dBm) になります。


>>>radio.config(power=2)

address (デフォルト=0x75626974)
32 ビットのアドレスです。ハードウェアレベルで着信パケットをフィルタリングするために使用されます。


>>>radio.config(address=0xbb8)  #3000

group (デフォルト=0)
8ビットの値(0〜255)です。address フィルタしたメッセージで使います。


>>>radio.config(group=128)

data_rate (デフォルト=radio.RATE_1MBIT)
データ転送速度です。RATE_250KBIT, RATE_1MBIT, RATE_2MBITの定数のいずれかになります


>>>radio.config(data_rate= radio.RATE_1MBIT) 

※詳細は「https://microbit-micropython.readthedocs.io/ja/latest/radio.html」を参照してください。

(13-03)radio.reset()

configの設定を既定値にリセットします。

length=32
queue=3
channel=7
power=6
address=0x75626974
group=0
data_rate=radio.RATE_1MBIT

(13-04)radio.receive()

メッセージを受信します。メッセージがない場合は None を返します。メッセージはバイト列として返されます。


from microbit import *
import radio
radio.on()
while True:
    message = radio.receive()
    if message:
        display.scroll(message)
    print(message)
    sleep(1000)

>>> %Run test_01.py
None
None
None

(13-05)radio.receive_bytes()

メッセージを受信します。メッセージはバイト列として返されます。保留中のメッセージがない場合は None を返します。

受信側


from microbit import *
import radio
radio.on()

while True:
    r_msg=radio.receive_bytes() #バイト列で受信
    print(r_msg)
    sleep(3000)     #約3secごとに受信

実行結果(radio.send_bytes(‘ABC’)でデータをバイト列で送信)


>>> %Run 1008_radio_recieve_02.py
None            #データなし
b'ABC'          #データ受信
None

(13-06)radio.receive_bytes_into(buffer)

メッセージを受信します。メッセージを buffer にコピーします。メッセージの長さを返します。メッセージがない場合は None を返します。※バッファサイズより大きいデータは捨てられます

受信側


from microbit import *
import radio
radio.on()

myFrame = bytearray(8)  #バッファサイズを設定

while True:
    r_msg=radio.receive_bytes_into(myFrame)
    print(r_msg,myFrame)        #受信byets(接頭辞3含む),受信データ
    sleep(3000)                 #約3secごとに受信

実行結果(radio.send(’ABC’)でデータを送信)


>>> %Run 1008_radio_recieve_02.py
None bytearray(b'\x00\x00\x00\x00\x00\x00\x00\x00') #受信無し
6 bytearray(b'\x01\x00\x01ABC\x00\x00')     #6byte受信 接頭文字3+受信データ
None bytearray(b'\x01\x00\x01ABC\x00\x00')  #受信無し

(13-07)radio.receive_full()

メッセージを表す3つの値のタプルを返します。メッセージがない場合には None を返します。

タプルで返す3つの値は
• メッセージのバイト列
• RSSI (信号強度) dBm
• 稼働時間(usec) time.ticks_us()の値

受信側


from microbit import *
import radio
radio.on()
while True:
    m_msg=radio.receive_full()  #受信データ、信号強度、稼働時間を受信
    print(m_msg)
    sleep(3000)                 #約3secごとに受信

実行結果(radio.send_bytes(’ABC’)でデータを送信)


>>> %Run 1008_radio_recieve_03.py
None
(b'ABC', -44, 1070177252)   # 受信したデータ、信号強度、稼働時間
None

(13-08)radio.send(message)

バイト列を含むメッセージを送信します。


>>> from microbit import *
>>> import radio
>>> radio.on()
>>> radio.send('Open sesame') # 送信

(13-09)radio.send_bytes(message)

バイト列を含むメッセージを送信します。


>>> from microbit import *
>>> import radio
>>> radio.on()
>>> s_msg=str('ABC')
>>> radio.send_bytes(s_msg)

r_msg=radio.receive_bytes()で受信
>>>b'ABC'

– micro:bit V2 –

configで設定するデータ転送速度の定数‘RATE_250KBIT’がありません。

まとめ

thonny-microbitのモジュール os、radio について記載しました。