picoをリモコンで操作したい (2)

まずはラズパイ → 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 → ラズパイ 一方向通信テストです

コメント

タイトルとURLをコピーしました