マイクロビットからのシリアル通信をラズベリーパイで受信してみる



マイクロビットのシリアル通信を使って、ラズベリーパイを操作してみよう。

ラズベリーパイの方ではPygameでGUIを用意して、ウィンドウ内で描写した丸をマイクロビットで操作します。


最初にマイクロビットの方で加速度センサーから得られた値をシリアル通信で送信できるようにしておきます。


MakeCodeであれば、



のようにし、MicroPythonであれば、


from microbit import *

# uartの標準設定を用いる 
uart.init()

while True:
	x, y, z = accelerometer.get_values()
	uart.write("x:"+str(x))
	uart.write("\r\n")
	uart.write("y:"+str(y))
	uart.write("\r\n")
	uart.write("z:"+str(z))
	uart.write("\r\n")
	sleep(1000)

のようにします。

マイクロビットのシリアル通信であるUARTの通信速度(ボーレート)の標準設定は9600になっています。

MakeCodeの方でも最初に通信速度を9600にしておきます。

※UARTの詳細に関しては今回は触れません




ラズベリーパイの方では最初に単純にシリアル通信の内容を受信して出力してみます。

Muエディタ等でPythonのコードを書いて実行してみます。

※Muエディタのインストール方法や使い方はこの場では触れません。

Code With Mu


先に端末(ターミナル)を開き、pyserialをインストールしておきます。

$ pip install pyserial

pyserial · PyPI


import serial

ser = serial.Serial("/dev/ttyACM0", 9600, timeout=1)
ser.close()
ser.open()

while True:
	line = ser.readline().strip().decode('UTF-8')

	if len(line) > 0:
		print(line)

上記のコードを実行してみます。

コンソールの箇所に

x:-392
y:256
z:-984

のようなマイクロビットの加速度センサーで得られた値が1秒毎に受信できている事が確認できれば成功です。


ser = serial.Serial("/dev/ttyACM0", 9600, timeout=1)

Serialオブジェクトの初期化の際の1番目の値は端末デバイスの指定で、USBの場合は/dev/ttyACM0のような値になります。

2番目の9600はシリアル通信の通信速度(ボーレート)の指定になりまして、マイクロビット側で決めた値を指定します。




続いて、Pygameでラズベリーパイの方で実行したコードから生成されたウィンドウ内の丸をマイクロビットから操作できるようにします。

※Pygameの詳細はこの場では触れません。


import serial
import pygame
from pygame.locals import *
import sys

ser = serial.Serial("/dev/ttyACM0", 9600, timeout=1)
ser.close()
ser.open()

pygame.init()
screen = pygame.display.set_mode((400, 300))

# 丸の最初に描写される位置
px=200
py=150

# 丸の移動量
m = 20

while True:
	screen.fill((255,255,255))
	pygame.draw.circle(screen,(10,10,10),(px,py),10)
	pygame.display.update()

	# serial
	line = ser.readline().strip().decode('UTF-8')
	if len(line) > 0:
		# x:100から x(ini)と数字(v)に分ける
		ini = line[0]
		v = int(line[2:])
		
		if ini == "x":
			if v > 0:
				px += m
			else:
				px -= m
		elif ini == "y":
			if v > 0:
				py += m
			else:
				py -= m
		#else:
			# 何もしない
		
	for event in pygame.event.get():
		if event.type == QUIT:
			pygame.quit()
			sys.exit()

実行すると冒頭の動画のような出力になります。