MicroPython

MicroPython

MicroPythonはARMベースのマイコンで動作するPythonで、Python3と高い互換性を持っています。
MicroPython ライブラリ
「https://micropython-docs-ja.readthedocs.io/ja/latest/library/index.html」があります。
「Python 標準ライブラリとマイクロライブラリ」に使えるライブラリ一覧が掲載されています。
しかし、私自身がPythonに詳しくないので必要に応じて調べながら使っている状態です。

ThonnyとPython3とMicroPython

Thonnyをインストールした時にも少し触れましたが、Thonnyは最初はPython3で動きます。
例として実数計算をしてみましょう。



次に、Picoを接続してMicroPythonで計算してみましょう。



ハッキリと分かっていることはMicroPythonの実数計算が単精度だと言うことです。
これは、Python3がWindowsPCのCPUを使って計算しているのに対して、MicroPythonはPicoのCPUを使って計算している違いです。
実際のところ、PicoのUSBケーブルを引き抜いてもPython3に切り替えるとThonnyでプログラムが実行できます。
しかし、Pico独自のPIO命令等を使っている時(例えばLチカなど)は当然のことですがPython3ではエラーになります。

※倍精度版のMicroPythonのUF2ファイルはあります。AIに「MicroPythonの倍精度演算バージョンの作り方を教えて」と頼んでみましょう。
最近のAIは拒否されることが多くなってしまいました。「Pico MicroPython Double Precision」でググってください。

bytes型

pythonでbytes型を初めて扱いました。
最初はなかなか理解できなかったので説明しておきます。

bytes型は1byte(0~255)のデーターの集まりです。
b'xxxxxxx'とシングルコーテーションで囲んであるので、文字列?かな。
文字列?なので、記号や数字、アルファベットがそのまま書けます。 b'ABC678+-$'
※シングルコーテーションはそのままでは使えないみたい。


アスキーコード表を見ると、(16進表記)
00~1F:制御文字(キャラクターなし)
20~7E:記号や数字、アルファベット(キャラクターあり)
7F:DEL(キャラクターなし)
80~FF:未定義(キャラクターなし)です。

なので、20~7Eは記号、数字、アルファベットがそのまま使えるのですが、キャラクターがない部分は どうなるかと言うと\xXXとなり、16進数のコード番号が代わりに表示されます。
※\はバックスラッシュになります。

例えば、16進数で41,42,43,81,82,83を定義してprint()させると
b'ABC\x81\x82\x83'となります。

16進数で81,41,82,42,83,43を定義してprint()させると
b'\x81A\x82B\x83C'となります。

最初の頃はこの事が理解できず混乱してしまいました。
つまり、何らかのコード表の16進の「81A」のアドレスにはどんな文字が割り当てられているのだろうか?と思ってしまったのです。



ちなみに、data = b'ABCあいう'を定義してprint()させると、
SyntaxError: bytes can only contain ASCII literal characters
「SyntaxError: バイトには ASCII リテラル文字のみを含めることができます」
のエラーになります。
つまり「あ」のような非1byte文字はそのままでは受け付けないのです。

スレッド

通常のプログラムは複数の処理を並べて記述します。
処理A→処理B→処理C→…といった感じです。そして1巡した後に処理Aに戻ります。
例えば、処理Bが時刻を表示する処理だったとしたら、その他の処理に時間がかかるとギクシャクした数秒飛ばしの時計になるかもしれません。
こうした場合、処理Bを別スレッドにして並列処理化する事でスムーズな時計を表示させることができます。
時間のかかる処理とそうでない処理を別々のスレッドにする事で遅延なく処理を行うことができるのです。
Picoにもスレッドが使えるのですが、2つしか使えません。OSを持つコンピュータであれば、2つ以上のスレッドを普通に使えるのですが、 マイコンのPicoではメインとサブスレッド1個だけが限界のようです。

# Picoの場合、スレッドは2個(main,sub)までしか動かない。
# 2つ以上動かそうとすると OSError: core1 in use になる。
import _thread
import time

def thread1():
    for i in range(0,10):
        print("T1 running:", i)
        time.sleep_ms(500)
    _thread.exit()

_thread.start_new_thread(thread1,())

mainLoop=0
while mainLoop < 5:
    mainLoop += 1
    print("MAIN:", mainLoop)
    time.sleep_ms(700)

-------------------------------
MPY: soft reboot
T1 running:MAIN:  01

T1 running: 1
MAIN: 2
T1 running: 2
MAIN: 3
T1 running: 3
T1 running: 4
MAIN: 4
T1 running: 5
MAIN: 5
T1 running: 6
T1 running: 7
T1 running: 8
T1 running: 9
-------------------------------

メインとサブスレッドが並行して実行されている事が分かります。