ラズベリーパイPico WでUARTを使ってみる

ラズベリーパイPico W(以後ラズピコ)2個をジャンパーワイヤで繋いでUARTで文字列を送信してみます。

UARTというのはUniversal Asynchronous Receiver/Transmitter(汎用非同期送受信機)の頭文字を取ったもので、2本のラインでシリアルデータを交換できる仕組みを指します。


※各々のラズパイは個別に電源を確保しているものとする


今回は上の図のようにラズパイ2個を繋いで、UARTを試してみます。

※GND同士を繋ぐと信号が安定します


送信側のらラズピコが定期的に文字列を生成して、受信側のラズピコに文字列を送信して、受信側はThonny(トニー)に繋いだままにして、トニーのシェル上で受信した文字列を出力するようにします。


送信用のラズピコに入れるコード

※今回のコードはコードを保存する時にラズピコ(Raspberry Pi Pico)に保存して、コンセントに直接挿しても起動するようにしておく

from machine import UART, Pin
import time

# UART1 (TX=GP4, RX=GP5) を設定
uart = UART(1, baudrate=115200, tx=Pin(4), rx=Pin(5))

count = 0
print("Transmitter: Transmission started...")

while True:
    # 最後に必ず '\n' (改行) をつける
    message = "MSG_ID:{:04d} | DATA:HELLO_RPi_PICO_W\n".format(count)
    
    # UARTへ書き込み
    uart.write(message)
    
    # Thonnyで実行した時にシェル上で値を確認できるようにしておく
    print("Sent:", message.strip())
    count += 1
    time.sleep(1)



受信側のラズピコ用のコード

※こちらは開発用のPC上にコードを置いたまま実行か、ラズピコ内に入れるかは自由です。

from machine import UART, Pin
import time

uart = UART(1, baudrate=115200, tx=Pin(4), rx=Pin(5))

# 送信側から得られた値が長くても確実に1行として取得できるようにする関数
def read_complete_line(u):
    line_buffer = bytearray() # データを溜める場所
    while True:
        # 送信側から何らかの値を受信した時
        if u.any():
            char = u.read(1) # 1バイトずつ読む
            if char == b'\n': # 改行が来たら終了
                return line_buffer
            line_buffer.extend(char) # 改行以外は溜める
        else:
            time.sleep(0.001) # データが届くのを少し待つ

print("Receiver: Waiting for complete lines...")

while True:
    full_line = read_complete_line(uart)
    
    try:
        print("Received (Full):", full_line.decode('utf-8'))
    except:
        print("Received (Binary):", full_line)

両方のらラズピコを起動すると、受信側のラズピコの方で

UART Receiver: Waiting for complete lines...
Received (Full): MSG_ID:0001 | DATA:HELLO_RPi_PICO_W
Received (Full): MSG_ID:0002 | DATA:HELLO_RPi_PICO_W
Received (Full): MSG_ID:0003 | DATA:HELLO_RPi_PICO_W
...

のような値が出力されました。

京都の東本願寺で開催されているプログラミング教室で講師をしています。
詳しくはTera schoolを御覧ください。
大阪府高槻市でプログラミング教室を開設しています。
同じカテゴリーの記事
マインクラフト用ビジュアルエディタを開発しています。

詳しくはinunosinsi/mcws_blockly - githubをご覧ください。