ラズベリーパイPico WでBluetooth接続を介してLチカをしてみる

ラズベリーパイPico Wを子機(ペリフェラル)にして、Bluetooth接続で親機から子機にLチカの命令を送信してみます。

※Lチカに関してはラズベリーパイPico Wを使ってみるをご覧ください。


ラズベリーパイPico WでBluetoothを使ってみるで作成しましたファイルに更にファイルを追加します。

※新たに追加するファイルもRaspberry Pi Pico内に保存するようにしてください。


ファイル名をmain.pyとして、下記のコードを作成します。

import machine 
import bluetooth
from ble_simple_peripheral import BLESimplePeripheral

ble = bluetooth.BLE()
p = BLESimplePeripheral(ble)

led = machine.Pin("LED", machine.Pin.OUT)
led.off()

def on_rx(v):
    print("received:", v)
    if v == b'1\r\n':
        led.on()
        p.send("ON\n")
    elif v == b'0\r\n':
        led.off()
        p.send("OFF\n")
    else:
        p.send("do nothing\n")
        
while True:
    if p.is_connected():
        p.on_write(on_rx)

親機から受け取ったデータで何らかの処理を行う場合はon_rx関数内にコードを記述し、

on_write(on_rw)

のようにして呼び出します。


今回のコードでは、親機から 1 を受信した場合はLEDを点け、0 を受け取った場合はLEDを消すようにします。

Serial Bluetooth Terminalから送られてくる値は値の末尾に改行コード(\r\n)が付与されますので、if内の式では改行コード有りで判定するようにしておきます。


ラズベリーパイPico Wを含めマイコンから受信する値は必ずバイナリなので、

b'1\r\n'

のようにしておきます。




動作確認はSerial Bluetooth Terminalを介して行っても良いですが、PythonでSerial Bluetooth Terminalの動作を再現してみるで試したコードを改修して、ラズベリーパイPico Wに1 or 0 の値を送信してみます。

※ラズベリーパイPico WのMACアドレスやハンドラは上記のURL先の記事を参考にして調べます。


~/workspace/ble/main.py

from bluepy import btle
import time

PERIPHERAL_MAC_ADDRESS = "XX:XX:XX:XX:XX:XX"

p = btle.Peripheral()
p.connect(PERIPHERAL_MAC_ADDRESS, btle.ADDR_TYPE_PUBLIC)
print("connected")

try:
    TIMEOUT = 3.0
    while True:
        if p.waitForNotifications(TIMEOUT):
            continue

        # 子機に対して、1 と 0 の値の送信を繰り返す
        p.writeCharacteristic(0x000c, b'1\r\n')
        time.sleep(1)
        p.writeCharacteristic(0x000c, b'0\r\n')
        time.sleep(1)
except:
    p.disconnect()
    print("disconnected")

子機に送信する時に使用する

p.writeCharacteristic(0x000c, b'1\r\n')

ですが、第一引数には権限がWRITEのハンドラを指定して、第二引数には送信したい内容をバイナリの形式で指定します。


実行してみると、ラズベリーパイPico Wの方でLチカが始まります。