稼働中

マイクロビット(m_18)モジュール struct |ustruct time | utime

module – struct |ustruct time | utime

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」のモジュールがあります。

(d-16)ustruct|struct

ustruct、またはstructでインポートできます。
モジュールを読み込むと「calcsize, pack, pack_into, unpack, unpack_from」が使えるようになります。※詳細はPythonのドキュメントサイトなどを参照してください。

(16-01)ustruct.pack(fmt,v1,v2…)

書式文字列 fmt を指定して bytes 型に変換します。

(16-02)ustruct.unpack(fmt,buffer)

buffer を、書式文字列 fmt に従ってアンパックします。


>>> import ustruct
>>> a=1
>>> b='ABC'
>>> c=5

>>> fmt='h3sh' # 2byte整数、3byte文字、2byte整数
>>> d=ustruct.pack(fmt,a,b,c) # fmtの形式でbytes型に変換
>>> d
b'\x01\x00ABC\x00\x05\x00'

>>> ustruct.unpack(fmt,d) # fmtの形式で元に戻す
(1, b'ABC', 5)

(16-03)ustruct.calcsize(format)

書式文字列 fmt に従って作成されるバイト列のサイズを返します。


>>> import ustruct
>>> fmt='s' #文字char(1byte)
>>> ustruct.calcsize(fmt)
1
>>> fmt='h' #整数(2bytes)
>>> ustruct.calcsize(fmt)
2
>>> fmt='i' #整数(4bytes)
>>> ustruct.calcsize(fmt)
4
>>> fmt='3sh2i'
>>> ustruct.calcsize(fmt)
16

(16-04)ustruct.pack_into(fmt, buffer, offset, v1, v2, …)

書き込み可能なfmt形式のバッファデータをoffset位置から書き換える。


>>> a=bytearray(b'\x01\x02\x03\x04')
>>> ustruct.pack_into('4b',a,0,5,6,7,8)# aの0番から4つ書き換える
>>> a
bytearray(b'\x05\x06\x07\x08') #5,6,7,8になった

(16-05)ustruct.unpack_from(fmt, buffer, offset=0)

fmt形式のバッファのoffsetからアンパックします。結果はタプルになります。


>>> import ustruct
>>> a= bytes(b'\x01\x02\x03\x04\x05\x06\x07')
>>> ustruct.unpack_from("b", a, 2)      # a 2番から1byteアンパック
(3,)

>>> ustruct.unpack_from("3b", a, 2)     # a 2番から3bytesアンパック
(3, 4, 5)

– micro:bit V2 –

モジュール名がustructだけに変わっています。


>>> import struct
>>> help(struct)
object <module 'ustruct'> is of type module

(d-17)utime -module

utime モジュールは、標準の Python の time モジュールの MicroPython 版です。import utime でもimport time でもインポートできます。モジュールは同じものです。
utimeモジュールを読み込むと「sleep, sleep_ms, sleep_us, ticks_ms, ticks_us, ticks_add, ticks_diff」の関数が使えます。

(17-01)utime.sleep(seconds)

指定された秒数の間スリープします。浮動小数点数も使えます。

(17-02)utime.sleep_ms(ms)

指定のミリ秒間だけ遅延します。整数だけです。

(17-03)utime.sleep_us(us)

指定のマイクロ秒間だけ遅延します。整数だけです。


>>> import utime
>>> utime.sleep(1)                  # 1 sec
>>> utime.sleep_ms(1000)            # 1 sec
>>> utime.sleep_us(1000000)         # 1 sec
>>> utime.sleep(0.001)              # 1 msec
>>> utime.sleep(0.000001)           # 1 μsec
>>> 
>>> from microbit import *
>>> sleep(1000)                     # 1 sec

(17-04)utime.ticks_ms()

呼出し時点でのmicro:bitが起動してからの時間をミリ秒単位で返します。
最大値に達すると一周して最低値に戻ります。
最大値は’0x_3fff_ffff’(1073741823)です。

(17-05)utime.ticks_us()

utime.ticks_ms() と同じですが、マイクロ秒単位です。

microbit moduleにあるrunning_time(ms)とutime.ticks_ms(ms)は同じ機能のようです。


>>> from microbit import *
>>> import utime

>>> utime.ticks_ms()
2285445

>>> running_time()
2288079

(17-06)utime.ticks_add(ticks, delta)

与えた数をticks値からのオフセットとして加算した値を返します。
delta値は正でも負でもかまいません。


r=running_time()
t=utime.ticks_ms()
s=utime.ticks_add(utime.ticks_ms(),-100)

#running_time,utime.ticks_ms
print(t, r)
print(t-100, s)

実行結果


>>> %Run 1010_ticks_01.py
5679487 5679487         # running_time, utime.ticks_ms
5679387 5679388         # utime.ticks_msの加減と同じ

(17-07)utime.ticks_diff(ticks1, ticks2)
utime.ticks_ms() や ticks_us() 関数の戻り値の差を計算します。
utime.ticks_diff(ticks1, ticks2) は ticks1 – ticks2 と同じです。


start = utime.ticks_ms()        # 開始した稼働時間
print('start')

# 現在の稼働時間-開始した稼働時間(動作時間)が1sec以下ならprint
while utime.ticks_diff(utime.ticks_ms(), start) < 1000: 
    sleep(250)
    print(start,utime.ticks_ms()) # 開始した稼働時間 現在の稼働時間

実行結果


>>> %Run 1010_ticks_02.py
start
6784115 6784369
6784115 6784626
6784115 6784883
6784115 6785139     #開始から1000msec超えたので停止

– micro:bit V2 –

モジュール名がutimeだけに変わっています。


>>> import time
>>> help(time)
object <module 'utime'> is of type module

まとめ

thonny-microbitのモジュール struct |ustruct、time | utime について記載しました。