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

UART - Wikipedia


構築した内容は、


P6248915


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


P9140089


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


PA079215


最終的には上の写真のようにジャンパー線で繋ぐ。

※左下にある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の方の設定を行う。


uart_rasp_cnf_0


Raspberry Piの設定を開き、


uart_rasp_cnf_1


シリアルポートを有効にして再起動する。

これでシリアルポートの設定は終了。




続いて、Micro:bitでUARTで室温のデータを送信するようにコードを作成する。

エディタはMicro:bit用のMuというものを使用する。

Code With 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で繋いだ状態で、


mu_flushing


転送ボタンを押すだけでフラッシングは終了する。

※転送ボタンはモードの指定でBBC micro:bitモードにした時に表示される


上記のコードでtx=pin0とrx=pin1が重要なので、それだけ触れておくと、UARTのシリアル通信では、TxDはデータの送信の役割があり、RxDはデータの受信の役割があり、今回のコードで


PA079216


PA079217


Micro:bitのP0をTxDにして、P1をRxDにした。

※TxD:赤のジャンパー線 RxD:オレンジのジャンパー線




続いて、Raspberry Pi側を見る。

UARTの通信では、片方(今回はMicro:bit)のTxDには、もう片方(Raspberry Pi)のRxDを接続し、RxDはTxDと接続する必要がある。


最初にRaspberry PiのGPIOピンのどれがTxDとRxDに該当するか?を調べる。


gpio_pinout_arch


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


PA079219


PA079218


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℃を出力することができた。

これでコンピュータが周辺の温度を測定する手段を得た。


関連記事

環境制御を学ぶ為にMicro:bitでサーボモータを学ぶ