マイクロビット(m_10)microbit.uart
uart
「microbit」モジュールには「display, Image, button_a, button_b, accelerometer, compass,pin0, pin1, pin2, pin3, pin4 pin5, pin6, pin7, pin8, pin9, pin10, pin11, pin12,pin13, pin14, pin15, pin16, pin19, pin20,i2c, spi, uart, panic, reset, running_time, sleep, temperature」の関数などがあります。
※「microbit」モジュールを「from microbit import *」でインポートした前提で記載しています。
(09)microbit.uart
シリアルインタフェースを使用してボードに接続されたデバイスと非同期でシリアル通信を行います。
「init, any, read, readline, readinto, write, ODD, EVEN」の関数があります。
※thonny-microbitを使っているので既にシリアル通信されています。thonny-microbitとの送受信を記載しています。
(09-1)init
uart.init(baudrate=9600, bits=8, parity=None, stop=1, *, tx=None, rx=None)
uart.init(115200)で、Python のコンソールを復元できます。
baudrate は通信速度を定義します。一般的なボーレートは 9600、14400、19200、28800、38400、57600、115200です。
現在のところは bits=8 だけのサポートらしいです。
parity パラメータはNone, uart.ODD, uart.EVEN が可能です。
stopは、ストップビットの数です。現状では 1 にする必要があるそうです。
tx と rx を指定しない場合はmicro:bit の USB シリアルコンバータに接続し、UART を PC に接続するそうです。
(09-2)any()
待機データがあれば True を返し、なければ False を返します。
(09-3)read([nbytes])
バイト列を読み込みます。nbytesまで読み込みます。指定されていなければ、できるだけ多く読み込みます。
以下はbytes指定の場合の例です。(無指定の場合はuart.any()の項を参照)
from microbit import *
uart.write(b'input chara\r\n')
while True:
if uart.any():
s=uart.read(2) #2bytesを読み込む
print(s)
#break
sleep(1000)
実行結果
>>> %Run 0911_uart_00.py
input chara
ABCD
b'AB' #読み込んだ2bytesをprint
b'CD' #次の2bytes
b'\r\n' #次の2bytes
(09-4)readinto()
uart.readinto(buf[, nbytes])
buf にバイト列を読み込みます。nbytes数まで読み込みます。指定数がなければ len(buf) のバイト数まで読み込みます。
myFrameの3バイトづつ読込、myFrameに格納、返り値は格納数
from microbit import *
uart.write(b'input chara\r\n')
myFrame = bytearray(3) #myFrameに3バイトのバッファ
print(myFrame)
while True:
if uart.any():
s=uart.readinto(myFrame) #3バイト読み込む
print('s=',s)
print(myFrame)
実行結果
>>> %Run 0911_uart_02-2.py
input chara
bytearray(b'\x00\x00\x00') #myFrameの初期の中
ABCDEFGHI #micro:bitに送信
s= 3 #格納したバイト数
bytearray(b'ABC') #格納したデータ
s= 3
bytearray(b'DEF')
s= 3
bytearray(b'GHI')
s= 2 #残りのバイト数
bytearray(b'\r\nI') #格納したデータ
(09-5)readline()
1行の改行文字まで読み込みます。バイト列に改行文字は含まれます。
thonny-micropythonでは改行文字無くても読み込みました。※やり方が悪いのでしょうか?
from microbit import *
uart.write(b'input chara\r\n')
while True:
if uart.any():
r=uart.readline()
print(r)
break
sleep(1000)
実行結果
>>> %Run 0911_uart_00.py
input chara
abcdef
b'abcdef\r\n'
(09-6)write(buf)
バッファをバスに書き出します。バッファはバイト列か文字列です。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from microbit import *
uart.write(b'input chara\r\n')
uart.write(b'あいう\r\n')
#'あいう'.encode('utf-8)
x=b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86' #エンコードした’あいう'を送信
print(len(x))
z=uart.write(x+'\r\n') #改行文字を加えて送信
print(z)
実行結果
>>> %Run 0911_uart_00_w.py
input chara
あいう
9 #ひらがな3bytesx3文字
あいう #ひらがなに戻っている
11 #送信したbyte数
■PuTTYで接続
リモートログオンターミナルクライアントソフトのPuTTY(パティ)を使ってシリアル通信をしてみます。「SSH」「Telnet」「rlogin」にも対応しています。
Serialを選択してシリアル通信の接続先、ボーレート等をinitの項を参考にして設定します。
「open」をクリックします。
PuTTYのターミナルが開きます。
thonny-micropytonのshellと同じように使えます。
ちなみに外枠上で右クリックをして、メニューを表示させPuTTYをresetすると以下のようになります。
from microbit import *
uart.write(b'input chara \r\n')
while True:
if uart.any():
#sleep(2000) #PuTTY時にコメントアウト
s=uart.read(2) #2bytes受信
r=str(s)
uart.write('microbit >> '+r+'\r\n') #受信2byteに文字付加して送信
#break
sleep(500)
実行結果
>>> %Run 0911_uart_00.py
input chara
ABCDE #thonnyからmicro:bitへ送信
microbit >> b'AB' #受信した2byteをmicro:bitが送信、改行されている
microbit >> b'CD'
microbit >> b'E\r'
microbit >> b'\n'
ちなみに送信データに改行コード ‘\r\n’が無いと
microbit >> b'AB'microbit >> b'CD'microbit >> b'\r\n'
改行なしで返ります。
このスクリプトをmicro:bitへmain.pyとしてアップロードします。
thonnyを閉じてPuTTYを立ち上げます。
micro:bit本体の裏面のリセットボタンを押すか、PuTTYの外枠で右クリックから「Special command>Break」します。
「ABCD」と打ち込みたいのですが、入力後uart.any()がTrueになるので以下のように一文字づづ返ってしまします。thonny-shellとやや動作が違います。
先のスクリプトでuart.any()直下のsleep(2000)を有効にします。そうすれば1文字目から2秒間の間に打ち込まれた文字に対応するはずです。
有効にしたらmain.pyとしてmicro:bitにアップロードします。
どうにか動いているようです。もっといい方法がありそうですが・・。
※thonny-microbitで動作する場合にsleep(2000)を有効にするとエラーになります。
まとめ
microbitモジュールのuartについて記載しました。thonny-microbitでは既にuart接続されています。thonny-microbitを使わずにPuTTYを使ってシリアル通信の確認をしてみました。