UART(Universal Asynchronous Receiver/Transmitter、ユーアート)というシリアル通信に触れたくて、Raspberry PiとBBC Micro:bitで構築してみた。
構築した内容は、

BBC Micro:bitの温度センサーで室温を測り、

Raspberry Piに室温のデータを送信する。

最終的には上の写真のようにジャンパー線で繋ぐ。
※左下にあるMicro:bitに繋がっているUSBは送電とフラッシング用
※フラッシングはPCで作成したコードをMicro:bitに送って実行できるようにすること
環境
Raspberry Pi 4B 8GB
OS:Raspberry Pi OS 64bit
BBC Micro:bit V2
ディスプレイ:SunFounder 10.1'' 1280×800 HDMI IPS LCD Monitor Display for Raspberry Pi 4B with Camera Holder
※ディスプレイ・Raspberry Piの一体型で配線がコンパクトになってオススメ
最初にRaspberry Piの方の設定を行う。

Raspberry Piの設定を開き、

シリアルポートを有効にして再起動する。
これでシリアルポートの設定は終了。
続いて、Micro:bitでUARTで室温のデータを送信するようにコードを作成する。
エディタはMicro:bit用のMuというものを使用する。
/path/to/dir/uart.py
from microbit import *
display.show(Image.HAPPY)
uart.init(baudrate=9600, bits=8, parity=None, stop=1, tx=pin0, rx=pin1)
while True:
tmp = str(temperature())
if len(tmp) > 0:
#UARTでデータを送信
uart.write(tmp)
sleep(1000)
詳しい話は一旦置いといて、MuからMicro:bitにデータを転送してフラッシングする。
Micro:bitとPCをUSBで繋いだ状態で、

転送ボタンを押すだけでフラッシングは終了する。
※転送ボタンはモードの指定でBBC micro:bitモードにした時に表示される
上記のコードでtx=pin0とrx=pin1が重要なので、それだけ触れておくと、UARTのシリアル通信では、TxDはデータの送信の役割があり、RxDはデータの受信の役割があり、今回のコードで


Micro:bitのP0をTxDにして、P1をRxDにした。
※TxD:赤のジャンパー線 RxD:オレンジのジャンパー線
続いて、Raspberry Pi側を見る。
UARTの通信では、片方(今回はMicro:bit)のTxDには、もう片方(Raspberry Pi)のRxDを接続し、RxDはTxDと接続する必要がある。
最初にRaspberry PiのGPIOピンのどれがTxDとRxDに該当するか?を調べる。

Raspberry Pi Document - Raspberry Pi OS#gpio-and-the-40-pin-headerのページによるとGPIO14がTxDに該当し、GPIO15がRxDに該当する。


Raspberry PiのTxDにオレンジのジャンパー線を付け、RxDに赤のジャンパー線を付けた。
シリアル通信用の線を繋げたら、下記のコードを作成して実行した。
/path/to/dir/temp.py
import serial
#第一引数の/dev/ttyS0がUART用のデバイスの指定になる
ser = serial.Serial("/dev/ttyS0", 9600, timeout=1)
ser.close()
ser.open()
tmp = 0
while True:
#UARTでデータを受信
line = ser.readline().strip().decode('UTF-8')
if len(line) > 0:
if int(line) != tmp:
tmp = int(line)
print(tmp)
pi@raspberrypi:~ $ python3 /path/to/dir/temp.py 30
Rasbperry Pi側で無事に室温の30℃を出力することができた。
これでコンピュータが周辺の温度を測定する手段を得た。
関連記事




