Raspberry Pi Pico WでBluetoothをお試し

2023/3/27にとうとう日本でもRaspberry Pi Pico Wが販売開始されました。

https://prtimes.jp/main/html/rd/p/000000122.000064534.html

今までも海外の通販サイトからは購入可能でしたが、技適マークが付いていなかったため、個別に実験用の届出が必要でしたが、これで手軽に扱えるようになりました。

Raspberry Pi Pico WはWi-Fi、Bluetoothが利用できます。

簡単ですが、以前Arduino IDEでWi-Fiを試したので、同じくArduino IDE Buletoothを試したいと思います。

https://qiita.com/jksoft/items/86d61e85320733da70cc

## 構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/5bb0382f-f8d6-1b36-c896-a5f6ac83d501.png)

Raspberry Pi Pico WをRaspberry PiとBluetoothでつなげて、双方向の通信を試します。
Bluetoothは仮想シリアルであるSPPを使用します。Raspberry Piとしては、シリアルポートとして認識します。
Raspberry Pi側は、Node-REDを使ってシリアルポートの通信を受け取って、デバッグメッセージを出したりしています。

## Raspberry Pi Pico W側のスケッチ
ボード定義は、[arduino-pico](https://github.com/earlephilhower/arduino-pico)を使用してます。

Raspberry Pi Pico W上のBOOTSELボタンを押すとBluetooth SPPで、`B`という文字を送ります。
`A`という文字をBluetooth SPPで受け取るとRaspberry Pi Pico W上のLEDをON、`B`を受け取るとLEDをOFFにするスケッチです。

サンプルを元に作ったスケッチが以下になります。

```cpp
#include <SerialBT.h>

void setup() {
  SerialBT.begin();
  Serial.begin(115200);
  pinMode(LED_BUILTIN,OUTPUT);
}

void loop() {
  while (SerialBT) {
    bool bootSel = BOOTSEL;
    static bool beforeBootSel = BOOTSEL;
    while (SerialBT.available()) {
      char c = SerialBT.read();
      Serial.println(c);
      if(c=='A'){
        digitalWrite(LED_BUILTIN, HIGH);
      } else if(c=='B'){
        digitalWrite(LED_BUILTIN, LOW);
      }
    }
    if(bootSel && !beforeBootSel) {
      SerialBT.write('B');
    }
    beforeBootSel = bootSel;
  }
}

```
※Bluetoothを使用する場合は、以下の設定を変更する必要があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/6693d328-f5ac-42f6-f729-9bf15f5645d5.png)

## Raspberry Piとの接続
Raspberry Pi Pico Wにスケッチを書き込んで、動作させたらRaspberry Piとペアリングさせて、仮想シリアルポートとして、認識させます。

Raspberry Piのコンソールで、以下のコマンドを実行し、Bluetoothの制御モードに入ります。
```shell-session
pi@raspberrypi:~ $ sudo bluetoothctl
Agent registered
[bluetooth]#
```

以下のコマンドで、スキャンするとPicoW Serialというのが見つかればOKです。ここで表示されるMacアドレスを使用します。（以下は伏せ字にしていますが、xx:xx:xx:xx:xx:xxの部分です。）
```shell-session
[bluetooth]# scan on
[NEW] Device xx:xx:xx:xx:xx:xx PicoW Serial
```

以下のコマンドで、調べたMacアドレスをペアリングします。
```shell-session
[bluetooth]# pair xx:xx:xx:xx:xx:xx
```

exitでBluetoothの制御モードを抜けて、仮想シリアルポートとして、認識させます。

```shell-session
[bluetooth]# exit
pi@raspberrypi:~ $ sudo rfcomm -r -M -L 0 bind 0 xx:xx:xx:xx:xx:xx
```

これで、シリアルポートとして、/dev/rfcommを指定すれば、Raspberry Pi Pico Wと通信が可能です。

## Raspberry Piのフロー
標準以外のノードで、`node-red-node-serialport`を使用しているので追加します。

フローは以下になります。

```json
[{"id":"96f17b2b1df90c4f","type":"tab","label":"フロー1","disabled":false,"info":"","env":[]},{"id":"65ef48c720800e76","type":"serial-port","serialport":"/dev/rfcomm0","serialbaud":"115200","databits":"8","parity":"none","stopbits":"1","waitfor":"","dtr":"none","rts":"none","cts":"none","dsr":"none","newline":"100","bin":"false","out":"time","addchar":"","responsetimeout":"10000"},{"id":"aa04af3218aa6097","type":"serialout","z":"96f17b2b1df90c4f","name":"","serial":"65ef48c720800e76","x":800,"y":280,"wires":[]},{"id":"a629b346ae079ec6","type":"serialin","z":"96f17b2b1df90c4f","name":"","serial":"65ef48c720800e76","x":570,"y":420,"wires":[["99569767c0c3fe16"]]},{"id":"99569767c0c3fe16","type":"debug","z":"96f17b2b1df90c4f","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":810,"y":420,"wires":[]},{"id":"3217cc134d81db14","type":"inject","z":"96f17b2b1df90c4f","name":"LEDON","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"A","payloadType":"str","x":540,"y":280,"wires":[["aa04af3218aa6097"]]},{"id":"f6fb6e948700cf0a","type":"inject","z":"96f17b2b1df90c4f","name":"LEDOFF","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"B","payloadType":"str","x":540,"y":340,"wires":[["aa04af3218aa6097"]]}]
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/c6176eff-9227-b32b-0c65-e81b826d0217.png)

## 動作確認

### Raspberry Pi Pico W ⇒ Raspberry Pi
BOOTSELを押すごとにDebugノードから受け取った文字が表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/86b7c775-219a-7f2d-0c85-cde20e6225f6.png)

### Raspberry Pi ⇒ Raspberry Pi Pico W
フローの`LED ON`をクリックするとRaspberry Pi Pico WのLEDが点灯し、`LED OFF`をクリックするとLEDが消灯することが確認できました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109992/225b8876-704f-a2ea-ff99-2a983be0cf03.png)


## 最後に
Raspberry Pi Pico WをArduino IDE扱うための書籍も執筆中です。
~~こちらは、しばしお待ち下さい！~~
⇒ 出版しました！

https://qiita.com/jksoft/items/c53d3cb17114a7d88fc4