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℃を出力することができた。
これでコンピュータが周辺の温度を測定する手段を得た。
関連記事