Pythonを使って micro:bit v2 とシリアル通信する方法

本記事では、Python を使ってmicro:bit v2とシリアル通信する方法を紹介します。書き込みと読み込みの両方を紹介しますので、PC や Raspberry Pi と連携させる際の参考になれば幸いです。

検証に使用した環境は以下の通りです。

  • macOS Catalina 10.15.7
  • Python 3.8.1
  • micro:bit v2

前準備

micro:bit と PCの両方でプログラムを動かすため、それぞれ必要な準備を行います。まずは PC と micro:bit を USBケーブルで接続します。

みなさんは何色のmicro:bit v2をゲットしましたか?

micro:bit v2側の準備

micro:bit へのプログラムの書き込みにはMakeCodeを使います。以下のリンクから新しいプロジェクトを作成してください。

Microsoft MakeCode for micro:bit

PC側の準備

次はPC側の準備です。Pythonの実行環境がない場合はあらかじめインストールを行なっておきましょう。

Python環境構築ガイド

Pythonでシリアル通信を行うために、PySerial というモジュールを使用します。インストールは pip で行います。

pip install pyserial

インストールが出来たら、micro:bit を認識しているポートを確認します。以下のコマンドは macOS における探し方です。

ls /dev/cu.*
/dev/cu.Bluetooth-Incoming-Port	/dev/cu.usbmodem141402

表示された結果の内、/dev/cu.usbmodem141402 が micro:bit への接続ポートを表します。番号の部分はお使いの環境によって変わるかもしれません。後ほどPythonのスクリプトで使用するためどこかに控えておきましょう。

準備は完了です! さっそくプログラミングに移りましょう。

micro:bit v2からの読み込み

まずは読み取りから試してみます。例として、シリアル通信を通して micro:bit から温度の読み取ってみましょう。

micro:bit側のプログラムは以下の通りです。シリアル通信を表す藍色のブロックは、高度なブロックの中に含まれています。

シリアルポートに対して1秒に1回温度を書き出すという意味になります。PC側でPythonのスクリプトを実行するまえに、あらかじめ書き込んでおきます。

次に、お好きなエディタで以下のPythonスクリプトを作成します。Pythonの対話モードで順番に実行してもOKです。

import serial
# シリアルポートへの接続
ser = serial.Serial('/dev/cu.usbmodem141402', 115200)
# シリアル通信で1行読み込む
line = ser.readline()
# 余分な空白や改行を除き、バイト列を文字列に変換する
temp = line.strip().decode()
print(f'温度: {temp}°C')
# シリアルポートを閉じる
ser.close()

serial.Serial() の第1引数には、先ほど調べたシリアルポートの値を入れます。スクリプトを実行して以下のような表示になれば、温度の取得に成功しています。

これで、シリアル通信を使って micro:bit からデータを読み取ることができました。

micro:bit v2への書き込み

次は書き込みを行なってみましょう。せっかくなので、もう少し賢い動作をさせてみます。micro:bit側のプログラムは以下の通りです。

これは、PC側からシリアル通信で書き込んだ値に応じて、LEDの表示を変化させるプログラムになります。

赤いブロックでシリアルポートから読み取った値を変数に入れ、変数の中身の値に応じてハートや四角をLEDに表示させます。無効な値だった場合は「Unknown input (不明な入力)」と返します。

Pythonのスクリプトは下記の通りです。このスクリプトはファイルとして作成した方が動作が分かりやすいと思います。

import serial
ser = serial.Serial('/dev/cu.usbmodem141402', 115200)
# 入力を待ち受ける
val = input('heart または cube と入力してください:')
# シリアル通信で1行書き込む
ser.write(f'{val}\n'.encode())
line = ser.readline()
print(line.strip().decode())
ser.close()

ファイルに保存したら実行してみましょう。上手く動作していれば、以下のようになります。

これで書き込みができることも確認できました!

ちなみに下記スクリプトのように、書き込みを行なって直ぐにシリアルポートを閉じると、micro:bit側の動作まで止まってしまうので注意が必要です。micro:bit側から成功メッセージを返し、Python側ではメッセージを受け取ってから終了させるのが良いでしょう。

import serial
ser = serial.Serial('/dev/cu.usbmodem141402', 115200)
ser.write(b'Hello World!')
ser.close()

micro:bit v2 (教材付き) 予約受付中

micro:bit v2 はツクレルPIYショップでも取り扱い予定です。現在教材付きで予約受付をしていますので、詳しく知りたい方はこちらをチェックしてください。

https://blog.tkrel.com/13717
]]>

上部へスクロール