稼働中

マイクロビット(m_14)モジュール micropython

module – micropython

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-09)micropython-module

micropythonモジュールを読み込むと「const, opt_level, mem_info, qstr_info, stack_use, heap_lock, heap_unlock, kbd_intr」の関数が使えます。

(9-01)micropython.const(expr)

式が定数であることを宣言します。定数名がアンダースコアで始まっていれば不可視となります。

「const_d.py」として


#!/usr/bin/env python
# -*- coding: utf-8 -*-
import micropython
CONST_X = micropython.const('abc')                  #定数を宣言
CONST_Y = micropython.const(2 * CONST_X)

# Thonny組込みのpythonの状態にしてmicrofs等でファイルをmicro:bitに送ります。
>>> microfs.put('const_d.py')
True
>>> microfs.ls()
['main.py', 'boot.py', 'const_d.py']

他のスクリプトで読み込んでもそのまま定数が使えます。(BBC:MicroPythonに切り替え)


#!/usr/bin/env python
# -*- coding: utf-8 -*-
from microbit import *
from const_d import *           #モジュールを読み込む

display.scroll(CONST_X)         #定数がそのまま使える
print(CONST_X)
print(CONST_Y)

実行結果


>>> %Run 1006_const.py
abc
abcabc

(9-02)micropython.opt_level([level])

※よくわかりません。
デフォルトの最適化レベルは通常レベル 0 です。
levelを指定した場合、後続のスクリプトのコンパイルレベルを設定して None を返します。
指定しない場合は、現在の最適化レベルを返します。

アサーション
レベル 0 では、アサーションステートメントが有効になり、バイトコードにコンパイルされます。
レベル 1 以上ではアサーションがコンパイルされません。

ビルトイン __debug__ 変数:
レベル 0 でこの変数が True に展開されます。
レベル 1 以上では False で展開されます。

ソースコード行番号
レベル 0, 1, 2 では行番号が格納され、例外が発生した行番号を報告することができます。
レベル 3 以上では行番号が格納されません。


>>> import micropython
>>> micropython.opt_level()         # 指定しない場合は、現在の最適化レベルを返す
0                                   # 通常レベル 0

>>> micropython.opt_level(1)        # 指定した場合は、レベルを設定してNone を返す
>>> micropython.opt_level()
1
>>> micropython.opt_level(0)

(9-03)micropython.mem_info([verbose])

現在使っているメモリに関する情報を表示します。 verbose を指定すると詳しい情報を表示します。


>>> micropython.mem_info()
stack: 516 out of 1800
GC: total: 10048, used: 7408, free: 2640
 No. of 1-blocks: 165, 2-blocks: 63, max blk sz: 19, max free sz: 125

>>> micropython.mem_info(True)
stack: 524 out of 1800
GC: total: 10048, used: 3680, free: 6368
 No. of 1-blocks: 67, 2-blocks: 31, max blk sz: 19, max free sz: 333
GC memory layout; from 200001f0:
00000: h=h==================h============h==================h=SSh=h=SSh
00400: =BB........hh..Shh=Sh=h========hh=======h=====....h==h===h......
       (5 lines all free)
01c00: .......BDB...........h=Dh=SShSShh=ShShShh=ShS.SS.......h=====h==
02000: =hh=h=h=hSSSSh=h=h=hSh=hSh=h=hSSh=Sh=SSh=hShSh=ShSSh=========h=S
02400: Sh=h=SSSSh=hSS...............h=h=h=.................

Symbol Meaning
.       free block
h       head block
=       tail block
m       marked head block
T       tuple
L       list
D       dict
F       float
B       byte code
M       module

(9-04)micropython.qstr_info([verbose])

現在のところのインターンド文字列に関する情報を表示します。verbose を指定すると詳しい情報を表示します。
※よくわかりません。


>>> import micropython
>>> 
>>> micropython.qstr_info()
qstr pool: n_pool=1, n_qstr=5, n_str_data_bytes=31, n_total_bytes=127

micropython.qstr_info(1)はエラーで表示できませんでした。

(9-04)micropython.stack_use()

現在使われているスタックのサイズを表す整数を返します。


>>> micropython.stack_use()
484
>>> 

(9-06)micropython.heap_lock()

(9-07)micropython.heap_unlock()

ヒープをロックまたはロック解除します。ロックされているとメモリ割り当ては発生せず、ヒープを割り当てようとした場合は MemoryError が発生します。

heap_lock()、heap_unlock()どちらも同じようにMemoryErrorになり止まりませんでした。※よくわかりません。


>>> import micropython
>>> micropython.heap_unlock()
MemoryError: 
>>> MemoryError: 
>>> MemoryError: 
>>> MemoryError: 
>>> MemoryError: 
>>> 
========================= RESTART =========================
>>> 

(9-08)micropython.kbd_intr(chr)

KeyboardInterrupt 例外を発生させる文字を設定します。
デフォルトでは、Ctrl-C(割り込み停止) に該当する 3 が設定されています。-1 を渡すと Ctrl-C が無効になります。


#!/usr/bin/env python
# -*- coding: utf-8 -*-
from microbit import *
import micropython
micropython.kbd_intr(-1)                #Ctrl-Cを無効
while True:
    for i in range(10):
        print(i)
           
        if i>5:
            micropython.kbd_intr(3)     #Ctrl-Cを有効
        sleep(1000)

実行結果


>>> %Run 1005_test_01.py
0
1        # i>5にならないとCtrl-Cが効かない。
2
3
4
5
6
Traceback (most recent call last):
  File "C:\Py_B551\02tes\1005_test_01.py", line 13, in 
KeyboardInterrupt: 
>>> 

– micro:bit V2 –

(9-09)micropython.schedule(func, arg) -v2

関数 func が「非常にすぐに」実行されるようにスケジュールします。
この関数には、単一の引数として値 arg が渡されます。

コールバックのような感じでしょうか?。素人の私には使い方がよくわかりません。


from microbit import *
import micropython

def func(arg):       # Scheduled
    print(arg,list(arg))
   
def cb1(arg):
    micropython.schedule(func, arg)
    print(arg)

cb1('abc')
print('END')

実行結果


>>> %Run -c $EDITOR_CONTENT a
abc
END
abc ['a', 'b', 'c']         # func 遅れ?
>>> 

まとめ

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