ラズベリーパイ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 ...
のような値が出力されました。