マイクロビット(m_25)PySerialモジュール
PySerialでTurtleを操作
PySerialのモジュールをインストールしてパソコン(ローカル)でmicro:bitのデータを受信します。
パソコン側で受信できればそのデータを使って何か処理できそうです。パソコン上のTurtleを動かして軌跡を描こうと思います。
インストール
PySerialモジュールをインストールします。Thonnyでは簡単にインストールできます。
Thonnyのメニューから「Tools>Manage-packages」を選択します。「PySerial」を検索窓に記入して「Find package from PyPI」をクリックしてインストールするだけです。
通信の確認
micro:bit側は、
micro:bitからA、B、A+B のボタン押し操作した際に、各々’A’、’B’、’C’を送信するようにします。そのスクリプトをThonnyからmain.pyとしてmicro:bitにアップロードしてmicro:bit単体で動作させます。
パソコン側は、
micro:bitからの送信データを受信して表示します。Thonny同梱のPythonで確認します。
micro:bitのスクリプト
from microbit import *
s="" # 確認文字 空に
while True:
t="" # 送信文字 空に
if button_a.was_pressed():
t='A' # Aボタン押で’A'を送信
if button_b.was_pressed():
t='B' # Bボタン押で’B'を送信
if button_a.is_pressed() and button_b.is_pressed():
#sleep(200) # 有効にした方がCCが発生しにくい
t='C' # A+Bボタン押で’C'を送信
if t != s and t !="": # 確認文字と送信文字のチェック、送信文字は空でない
tmp=str(t) +'\r\n' # 送信文字に改行記号をつけて
uart.write(tmp) # 送信
s = t # 確認文字に送信文字を記憶
sleep(150)
s="" # 150msec後には確認文字を空にする
確認文字と送信文字のチェック
前に送信した確認文字と送信文字が異なり、送信文字が空でない場合に送信します。
150msec待機後に確認文字sが空になります。そのため150msec後には前回と同じ送信文字が送信できます。
ボタンを押した際の動作確認(ここのThonnyはTools>Optinons>InterpreteがMicroPython on BBC:microbitの状態)
パソコン側のスクリプト
ThonnyはTools>Optinons>Interpreterで同梱のPythonを使うdefault設定にします。(Thonnyでのシリアル通信は解除されます。)
import serial # serial通信のモジュールをインポート
import time # sleepを使うのでtimeモジュールをインポート
ser = serial.Serial("COM3",115200) # 通信条件を設定
time.sleep(1)
while True:
line = ser.readline() # こんな簡単に受信できる
#受信 PySerial
line_data=line.strip().decode('UTF-8')# 改行記号をストリップしてデコード
print('PC=',line_data) # デコードした文字をシェルに表示
time.sleep(0.1)
※serial.Serial(“COM3”,115200)の’COM3’ポートは環境によって変わります。micro:bitが接続されているポートです。
Python 3.7.2 (bundled) # Thonny同梱のPython環境
>>> %Run 1012_pyser_pc_recive.py
PC= Push btn A or B or A+B
PC= A # micro:bitでAが押されたので’A'文字送信 > PC側で受信・表示
PC= B
PC= C
PC= B
Turtle動作例
特に記載するような応用例も無いのですが、turtleモジュールをインポートしてパソコン上でTurtleを動かしてみます。単純な右、左、停止を操作するだけです。
ボタンAで左90度、Bで右90度、A+Bでホームに戻り終了です。ボタン押しが無いときは一定のステップで直進します。
先のスクリプトをやや追加修正します。
micro:bit側(送信、カメの操作)ThonnyのInterpreterはBBC:Micropython
from microbit import *
uart.write(b'Push btn A or B or A+B \r\n')
s=""
while True:
t=""
if button_a.was_pressed():
t='A'
if button_b.was_pressed():
t='B'
if button_a.is_pressed() and button_b.is_pressed():
sleep(200)
t='C'
if t != s and t !="":
tmp=str(t) +'\r\n'
uart.write(tmp)
s = t
else: # 追加 ボタン押しが無いとき
tmp='\r\n' # 空白を送信
uart.write(tmp)
sleep(150)
s=""
micro:bitにmain.pyとしてアップロードします。(メニューのDevice項)
パソコン側(受信、カメの表示) ThonnyのInterpreterはデフォルト
import serial
import time
import sys
import turtle # 亀のモジュールをインポート
# serial tuusin settei
ser = serial.Serial("COM3",115200)
time.sleep(1)
# turtle no settei # 亀の設定
kame = turtle.Turtle() # 操作するshapeをkame名で作成
kame.reset()
kame.shape("turtle") # shapeの形を亀にします。'arrow', 'circle'などがある。
kame.speed(2)
kame.pensize(2)
kame.color('orange')
kame.pencolor('red')
kame.home()
kame.pendown()
go_step = 10 #foward(go_step)
direct = 0 #go_heading
while True:
line = ser.readline()
#受信 PySerial
line_data=line.strip().decode('UTF-8')
print('PC=',line_data)
#time.sleep(0.5)
a=line_data
if a == 'A': # ‘A’受信で向きを左90度
kame.left(90)
print("kame.left(90)")
if a == 'B': # ‘B’受信で向きを左90度
kame.right(90)
print("kame.right(90)")
if a == 'C': # ‘C’受信でホームに戻って終了
kame.penup()
kame.home()
#turtle.done()
ser.close()
print("kame.home-back->END")
time.sleep(3)
sys.exit()
#break
kame.forward(go_step) # 直進
print("kame.forward(go_step)")
#time.sleep(1)
実行結果
ThonnyのInterpreterがデフォルト(同梱のPython)であることを確認してRunします。操作歴が表示がされます。
まとめ
PySerialのモジュールをインストールしてパソコン(ローカル)でmicro:bitのデータを受信します。micro:bitのA-BボタンでTurtleを操作して走行軌跡を描いてみました。