Raspberry Pi Pico WからRaspberry Pi 5へデータ送信|Wi-Fi通信でセンサーデータをやりとりする方法

目次

はじめに

今回は、Raspberry PiとRaspberry Pi Pico W間でデータを送受信する方法を紹介します。「センサーで測定した値をRaspberry Piに送りたい」「複数のマイコンで協調動作させたい」そんな方におすすめの記事です。

全体の流れ

1.なぜPico Wと通信したいのか?
2.通信方法の選定
3.USBシリアル通信で通信する
4.WiFi(TCPソケット)で通信する
5.トラブルシュート

なぜPico Wと通信したいのか?

Pico Wは安価で低消費電力なマイコンで、温度センサーや加速度センサーなどを接続して測定→Raspberry Piに送信するという使い方がよくされます。

たとえば、

  • Pico Wに人感センサーをつけて、人の動きを感知
  • Piが受信して、ログを保存 or 通知を飛ばす

こんな連携ができると、お手軽スマートホームも夢ではありません。

通信方法の選定

通信方法メリットデメリット
USBシリアル通信簡単・速い・安定ケーブルが必要
Wi-Fi( ソケット通信)ワイヤレス初心者に難しい

USBシリアル通信で送る

PicoW → Raspberry Pi とデータを送信します

PicoW側(MicroPython)

import time
import machine

uart = machine.UART(0, baudrate=115200)

while True:
    uart.write("Hello from Pico W!\n")
    time.sleep(1)

Raspberry Pi側(Python)

/dev/ttyACM0 は環境により異なるため、ターミナルで次のコマンドを入力し、ls /dev/tty* で確認してください

import serial

ser = serial.Serial('/dev/ttyACM0', 115200)  # デバイス名は状況に応じて変わります

while True:
    line = ser.readline().decode('utf-8').strip()
    print(f"受信: {line}")

Wi-Fi(TCPソケット)で通信する

PicoW ← Raspberry Pi とデータを送信します

PicoW側(MicroPython)
Wi-Fiにつながっている必要があるので、SSID、PASSWORDに必要な情報を入力ください。

import socket
import network
import time

# Wi-Fi接続
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('SSID', 'PASSWORD')

while not wlan.isconnected():
    time.sleep(1)

print("接続完了:", wlan.ifconfig())

# TCPサーバーを立ち上げる
addr = socket.getaddrinfo('0.0.0.0', 5001)[0][-1]
s = socket.socket()
s.bind(addr)
s.listen(1)
print("待機中...")

conn, addr = s.accept()
print("接続あり:", addr)

while True:
    data = conn.recv(1024)
    if data:
        print("受信:", data.decode())

Raspberry Pi側(Python)

PicoWのIPアドレスを指定する必要があります。
方法は2つあります。1つは上述したコードを実行すればwlan.ifconfig()コマンドによってIPアドレスが表示されます
もう1つは、自宅のWi-Fiルーターにログインして確認することです。

STEP
同一Wi-Fiにつながっている端末を準備

ブラウザのURL欄に192.168.0.1または192.168.1.1を入力

STEP
Wi-Fiルーターにログイン

ルーター本体の裏面などにID(adminなど)とパスワードが記載されているのでその情報でログイン

STEP
PicoWを見つける

raspberrypiやESP-xxxxのような名前を探す

import socket
import time

HOST = '192.168.1.XX'  # Pico WのIPアドレスを指定
PORT = 5001

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))

while True:
    s.send(b"Hello from Raspberry Pi!\n")
    time.sleep(1)

トラブルシュート

症状原因と対処法
/dev/ttyACM0が見つからないPicoが接続されていない、またはドライバ未インストール
Permission deniedsudoをつけるかdialoutグループに追加
Wi-Fiが繋がらないSSID/PASSWORDミス or チャンネル設定の相性問題
IPが見つからないPiとPicoが同じネットワークにいるか確認

まとめ

デバイス同士で通信ができるようになると、できることが爆発的に増加します。
PicoWに接続したセンサの値をRaspberry Piに送信する、Raspberry Piを使ってインターネットから取得した情報をPicoWに接続したディスプレイに表示する、など活用の幅が広がります。是非試してみてください。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次