ESP32ではBluetooth ClassicとBLEの両方が使えますが、Raspberry Pi Pico
WはBLEのみ対応しています。Bluetooth
Classicは音楽再生や連続データ転送向け、BLEは省電力でセンサ制御などに適しています。BLEは理論上多数の機器と接続可能ですが、実際の接続数はデバイスや実装により異なります。今回はPico
WのBLE機能を使って、スマホなどからLEDの点灯・消灯を制御します。Pico
WのBLEは実験的な機能ですが、簡単な通信制御には十分使えます。ESP32ほど多機能ではありませんが、Pico
Wでも手軽にBLE通信を試すことができます。
BLEのサンプルコードは、micropython/micropython
リポジトリの
examples/bluetoothディレクトリに用意されています。
今回はそれらをライブラリのように扱い、Thonny上に取り込んで活用していきます。

◆Bluetooth接続を介してLチカのコード
import machine
import bluetooth
from ble_simple_peripheral import BLESimplePeripheral
import time
# GPIO16番ピンをLED出力用に設定
led = machine.Pin(16, machine.Pin.OUT)
led.off() # 起動時はLEDを消灯
# Bluetoothオブジェクトを生成し、ペリフェラルとして初期化
ble = bluetooth.BLE()
p = BLESimplePeripheral(ble)
# BLE経由でデータを受信したときのコールバック関数
def on_rx(v):
print("received:", v)
v = v.strip() # 改行コード(\r\n など)を削除
if v == b'1':
led.on() # LED点灯
p.send("ON\n") # 応答メッセージを送信
elif v == b'0':
led.off() # LED消灯
p.send("OFF\n") # 応答メッセージを送信
else:
p.send("do nothing\n") # 無効なコマンドに対する応答
# 受信時のコールバック関数を登録(何度も設定しない)
p.on_write(on_rx)
# メインループ
while True:
try:
if not p.is_connected():
# 接続待機中は少し待つ
time.sleep(0.1)
# 接続中は on_rx がイベントで呼ばれる
except OSError as e:
# BLEエラー発生時の処理
print("BLE error:", e)
try:
# BLEを再初期化して復旧を試みる
ble.active(False)
time.sleep(1)
ble.active(True)
p = BLESimplePeripheral(ble)
p.on_write(on_rx)
print("BLE reinitialized")
except Exception as e:
# 再初期化に失敗した場合は少し待って再試行
print("Reinit failed:", e)
time.sleep(5)
実行するとコンソールに
のように出力されます。
Raspberry Pi Pico Wをペリフェラル機器として設定し、接続準備を進めます。
Androidスマートフォンやタブレットから、
Google Playから「Serial Bluetooth Terminal」アプリをインストールしてください。
インストール後、スマホやタブレットなどのセントラルデバイスでBluetoothをオンにし、Serial Bluetooth Terminalを起動します。

画面左上の≡のアイコンをタップし、Devicesをタップします。

Bluetooth LEの方を開き、表示されているペリフェラル機器を選択します。

接続すると「Connecting to -unnamed-... Connected」と表示されます。
1と送信するとON「GPIO16番に接続された LED が点灯します」
0と送信するとOFF「GPIO16番に接続された LED が消灯します」

コメント
コメントを投稿