稼働中

マイクロビット(m_25)PySerialモジュール

PySerialでTurtleを操作

PySerialのモジュールをインストールしてパソコン(ローカル)でmicro:bitのデータを受信します。
パソコン側で受信できればそのデータを使って何か処理できそうです。パソコン上のTurtleを動かして軌跡を描こうと思います。

インストール

PySerialモジュールをインストールします。Thonnyでは簡単にインストールできます。
Thonnyのメニューから「Tools>Manage-packages」を選択します。「PySerial」を検索窓に記入して「Find package from PyPI」をクリックしてインストールするだけです。
PySerialのインストール

通信の確認

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を操作して走行軌跡を描いてみました。