まずはラズパイ → picoの一方向通信です。
ラズパイからデータを送ってpicoで受け取り
決められたデータ(今回は数字の1)だったらLEDを点灯させます
まずはラズパイでタクトスイッチが押されたら
UARTでデータを送るプログラムです
GitHub Copilotでコメントを入れてもらいました。
便利~
前回の配線図で忘れていましたが
ラズパイのGPIO17にタクトスイッチを付けました
"""
*** コメントはGitHub Copilotで生成されました ***
Raspberry Pi と Pico の UART通信プログラム
ボタン入力を検出し、その状態をUART経由でPicoに送信します。
ボタン押下時: '1'、ボタン未押下時: '0' を送信
"""
import serial
import time
import RPi.GPIO as GPIO
from gpiozero import Button
# ==================== GPIO初期化 ====================
# GPIO のボード番号付けモード (pin番号を使用) を設定
GPIO.setmode(GPIO.BCM)
# ボタン入力ピンの設定
# GPIO 17 を入力モードに設定、内部プルアップ抵抗を有効化
SWITCH_ON_BUTTON = 17
GPIO.setup(SWITCH_ON_BUTTON, GPIO.IN, pull_up_down=GPIO.PUD_UP)
print("GPIO初期化完了...")
# ==================== UART設定 ====================
# Raspberry Pi と Pico を UART(/dev/serial0)で接続
# ボーレート: 9600 bps (ビット/秒)
# タイムアウト: 1秒(受信待機時間)
ser = serial.Serial('/dev/serial0', 9600, timeout=1)
# ==================== GPIO設定 ====================
# GPIO 17 (Raspberry Pi pin 11) にボタンを接続
# 内部プルアップ抵抗が有効になっています
# ボタン押下時 → 0V (ボタンが押されている状態を検出)
switch_on = Button(SWITCH_ON_BUTTON, pull_up=True)
print("ボタンの状態をPicoに送信開始...")
try:
while True:
# ボタンが押されているかを判定
if switch_on.is_pressed:
# ボタンが押されている → '1' をバイナリ形式で送信
ser.write(b'1')
else:
# ボタンが押されていない → '0' をバイナリ形式で送信
ser.write(b'0')
# ポーリング間隔: 10ms (0.01秒)
time.sleep(0.01)
except KeyboardInterrupt:
# ユーザーが Ctrl+C を押した場合の終了処理
ser.close()
print("UART接続を閉じました。")
GPIO.cleanup() # GPIOのクリーンアップ: GitHub Copilot により追加
print("GPIOをクリーンアップしました。")
print("プログラムを終了します...")
# 以下は通常到達しないが、念のための保険: GitHub Copilot により追加
exit()
finally:
# プログラム終了時に必ず実行されるクリーンアップ処理
ser.close()
GPIO.cleanup()
ラズパイからの通信を受信してLEDを点灯させるpico側のプログラムです
"""
*** コメントは Github copilot により生成されました ***
Raspberry Pi からUART経由で送信されたデータに応じて、
Pico に接続された LED を制御します。
- '1' を受信 → LED 点灯
- '0' を受信 → LED 消灯
"""
from machine import UART, Pin
import time
# ==================== UART初期化 ====================
# UART0を使用してRaspberry Piと通信
# tx: GPIO 0(送信 - 未使用)
# rx: GPIO 1(受信 - Piのシリアルに接続)
# ボーレート: 9600 bps
uart = UART(0, baudrate=9600, tx=Pin(0), rx=Pin(1))
# ==================== LED設定 ====================
# GPIO 15 を出力モードで設定
# ここに LED のアノード(長い足)を接続してください
# カソード(短い足)はGNDに接続
led = Pin(15, Pin.OUT)
print("UART Receiver Started...")
print("Pico が Raspberry Pi からのデータを待機中...")
# ==================== メインループ ====================
while True:
# UART バッファにデータが到着したかチェック
if uart.any():
# バッファから1バイトのデータを読み込み
data = uart.read(1)
# 受信したデータが '1' の場合
if data == b'1':
led.value(1) # GPIO 出力を High (3.3V) に設定 → LED 点灯
# 受信したデータが '0' の場合
if data == b'0':
led.value(0) # GPIO 出力を Low (0V) に設定 → LED 消灯
# ポーリング周期: 10ms (0.01秒)
# CPU負荷を下げるため、このスリープを入れています
time.sleep(0.01)
次は双方向通信のテスト
picoが受け取った 0→1 の回数をラズパイに送ります
併せて、タクトスイッチによるチャタリングの様子も確認します
(1月23日追記)
Picoからラズパイにデータを送るのに予想外に手間取りました。
予定を変更して次回は Pico → ラズパイ 一方向通信テストです


コメント