ラズパイPicoW/Pico2W Bluetooth通信の使い方

Raspberry Pi Pico2/Pico2Wアイキャッチ

「Raspberry Pi Pico W」でBluetooth通信を使用して、遠隔操作やデータ取得する方法をサンプルプログラムを使用して詳しく紹介します。

今回は「Pico2W」を使用していますが「PicoW」でも使用方法は同じです。
パソコンは「Windows11」、開発環境は「ArduinoIDE」を使用してC言語で行います。 
Bluetooth通信の動作確認には「ArduinoIDE」のシリアルモニタを使用しますが、自作のPythonアプリで遠隔操作したり、受信データをCSVデータとして記録してExcelで確認する方法も応用編として紹介しています。

「Raspberry Pi Pico」の基本的な使い方は、以下のリンクで詳しく紹介しています。

ラズパイPico/PicoWの使い方を3つの開発環境Python、ArduinoIDE、PlatformIOで紹介
Raspberry Pi Pico/Pico Wの使い方を端子配列からPython(MicroPython)とC言語の開発環境、Lチカ方法まで紹介。PythonはTonny、C言語はArduinoIDEとPlatformIOの3種類で詳しく紹介します。
スポンサーリンク

1.Raspberry Pi PicoW/Pico2Wとは

「Raspberry Pi PicoW/Pico2W」とは、イギリスを拠点とする慈善団体によって若者のプログラミング学習を目的に開発されたもので、OSを搭載してパソコンのように使える他の「Raspberry Piシリーズ」とは異なり、OSを搭載する機能はありません。

その代わり、電源投入ですぐに使用でき、スイッチやLEDランプ、モーター、各種センサー、通信機器を接続して、それらを制御するプログラムを簡単に作成して動作確認できるため、組み込み(制御)系プログラミングの学習に最適です。

「PicoW/Pico2W」には通信機能があり、Wi-Fiでインターネット経由のデータ収集や、Bluetoothでのデータ通信、遠隔操作等のアイデアを簡単に試すことができます。

メイン処理装置のマイコン(マイクロコントローラ)には同財団で開発された「RP2040(PicoW)/RP2350(Pico2W)」が使用されており、USBコネクタや電源回路、スイッチ、LED等と合わせて1枚の基板に実装されています。
このようにマイクロコントローラーと周辺回路が実装された基板をマイコンボードと呼びます。

以下写真左が「PicoW」、右が「Pico2W」で端子配列や使い方は同じで、「Pico2W」は処理速度等の機能がアップしています。

Raspberry Pi Pico2/Pico2W外観
Raspberry Pi Pico2/Pico2W外観
Wi-Fi機能のある「PicoW」は日本国内で使用するためには「技適(技術基準適合証明)」の取得確認が必要で、技適対応品は「スイッチサイエンス」さんで購入できます。

「PicoW」の「技適」については以下のリンクで詳しく紹介しています。

ラズパイPico/PicoWの使い方を3つの開発環境Python、ArduinoIDE、PlatformIOで紹介
Raspberry Pi Pico/Pico Wの使い方を端子配列からPython(MicroPython)とC言語の開発環境、Lチカ方法まで紹介。PythonはTonny、C言語はArduinoIDEとPlatformIOの3種類で詳しく紹介します。

・基本仕様

Pico2WとPicoWの違い

「Pico2W」と「PicoW」の違いは以下表のようになります。

項目Pico2WPicoW
コントローラRP2350RP2040
CPUデュアルコア Arm Cortex-M33
または
Hazard3(RISK-V)を選択して使用可能
最大150MHz
デュアルコア Arm Contrex M0+プロセッサ
最大133MHz
メモリ
Flash / SRAM
4MB / 520kB2MB / 264kB
コントローラが「RP2350」に変更され、CPUはデュアルコアの「Arm Cortex-M33」またはデュアルコアの「RISC-V Hazard3」 を選択して使用することができるようになりました。
クロック速度は「133MHz」から「150MHz」となり、より高速な処理が期待できます。

共通仕様

共通仕様は以下表のようになります。

項目詳細
電源電圧(VBUS)DC5V±10%
USBMicro USB Type-B
入出力多機能GPIO x 26
通信機能UART x 2 / I2C x 2 / SPI x 2
無線通信機能
※Pico Wのみ
Wi-Fi (2.4 GHz)/Bluetooth
その他機能ADC(12bitアナログコンバータ) x 3
PWM x 16
動作温度範囲-20℃〜85℃(自己発熱含む)
※最大温度は推奨70℃
寸法21 x 51 (mm)

・端子配列

「Pico2W」端子配列は以下のようになります。(公式サイトより抜粋

Raspberry Pi Pico2W 端子配列
「Pico2W」と「PicoW」で端子配列は同じす。
スポンサーリンク

2.動作確認の準備

動作確認のためには、開発環境のインストールとPicoの初期設定が必要なため、以下から詳しく紹介していきます。

・開発環境ArduinoIDEのインストール

開発環境「ArduinoIDE」のインストールやライブラリの準備方法は以下のリンクで詳しく紹介しいるので、インストールがまだの方はインストールしておいてください。

Arduino IDE 2のインストール方法、初期設定、使い方
バージョンアップして使いやすくなったArduino IDE 2のインストールから使い方まで詳しく紹介、便利な機能やM5Stack、ラズパイPicoでの使用方法も紹介します。

「 Raspberry Pi Picoシリーズ」を「ArduinoIDE」で使用するにはボード情報の追加等の初期設定が必要です。これについても以下のリンクで詳しく紹介しています。

ラズパイPico/Pico2/PicoWのArduinoIDE2のインストール方法や使い方紹介
Raspberry Pi Pico/Pico2/PicoWのC言語での開発環境 ArduinoIDE2のインストールから初期設定、使い方、Lチカで動作確認まで詳しく紹介

・ライブラリの準備

今回使用するライブラリは「SerialBT」で、個別にインストールする必要はありません。
「SerialBT」を使用するためにはプログラムの先頭に以下のように記述するだけです。

#include <SerialBT.h>  // Bluetooth通信用ライブラリ

・PicoW/Pico2Wの初期設定

「ArduinoIDE」をインストールして、ボード情報の設定が完了したら、以下のように「PicoW/Pico2W」を使用するための初期設定を行います。

まずは、下画像のように「PicoW/Pico2W」を基板上の「BOOTSEL」ボタンを押しながら、パソコンとUSBケーブルで接続しておきます。

Raspberry Pi Pico2W BOOTSELボタン

次に「ArduinoIED」を起動します。(既に起動している場合もこのまま進めてください。)

Raspberry Pi Pico のArduinoIDE初期設定

「ArduinoIED」が起動したら上画像のように[ファイル]→[新規スケッチ]をクリックします。

Raspberry Pi Pico のArduinoIDE初期設定

上画像のように新規ウインドウで「ArduinoIDE」が起動します。

初期状態では基本のプログラムが書かれていますが、ここではこれを消去して、サンプルプログラムをコピペで貼り付けて、書き込みを行っていきます。
Bluetooth通信は初期状態では使用することができません、使用するには以下の設定が必要です。
初期設定のままでは書き込み時にエラーとなるため、Bluetooth通信を使用する時は必ず以下の設定を行ってください。
Raspberry Pi Pico のArduinoIDE Bluetooth使用のための初期設定

Bluetooth通信を有効にするために、上画像のように[ツール]→[IP \Bluetooth Static〜]をクリックして[IPv4 + Bluetooth]を選択してください。

Raspberry Pi Pico のArduinoIDE初期設定

次に上画像のように使用するボードの選択を行います。
[ツール]→「ボード:(ここは環境によって異なります)」→[Raspberry Pi Pico/RP2040/RP2350]をクリックしてご自身が使用するボード(今回の場合はRaspberry Pi Pico 2W)を選択します。

Raspberry Pi Pico のArduinoIDE初期設定

次に上画像のように通信ポートの設定を行います。
[ツール]→[ボード:”(ここは環境によって異なります)”]をクリックすると、上画像のように[UF2 Board]が表示されているため、これをクリックします。

「UF2 Board」が表示されていない場合は、USBケーブルを抜いて本体基板上の「BOOTSEL」ボタンを押しながら再接続してから試してみてください。
一度でも書き込みを行っている場合は「UF2 Board」ではなく「COM番号」が表示されるため、2回目以降は「COM番号」を選択します。

以上の作業は初回のみの作業です。

Raspberry Pi Pico のArduinoIDE初期設定

1度書き込みを行ってから「ポート」を確認すると、上画像のように「COM番号(Generic RP2350〜)」のように表示されるようになるため、2回目以降の書き込みは、このCOM番号を選択して書き込みを行う必要があります。

Raspberry Pi Pico のArduinoIDE初期設定

初回書き込み時にはファイルの保存を求められるため、上画像のように事前に保存しておくとスムーズに作業が進められます。

以上で初期設定は完了です。

スポンサーリンク

3.Bluetooth通信の使い方

・ライブラリの使い方

今回使用する「SerialBT」ライブラリの基本的な使用方法は以下になります。

// 初期設定
SerialBT.setName("Pico_BT");  // ペアリング時に表示するデバイス名を設定(初期化の前に設定)
SerialBT.begin(9600);         // 通信速度を指定してBluetooth通信を初期化して開始

// Bluetoothデータ送受信処理
SerialBT.available();         // 受信データがあればtrue
SerialBT.read();              // 受信データを1文字読み取る
SerialBT.print("送信データ");   // データを文字列で送信(printfも使用可)
「SerialBT」ライブラリは標準で使用できるため、個別にインストールする必要はありません。

・パソコンとのペアリング方法

この下で紹介するサンプルプログラムを書き込んだら、「PicoW/Pico2W」とBluetooth通信を行うために、パソコンとのペアリングを行う必要があります。

サンプルプログラムを書き込んでから、動作確認を行うためには以下の手順でペアリングを行ってください。

パソコンとペアリングを行う方法は、他のBluetoothデバイスと同じです。
Pico2W Bluetooth ペアリング方法

まずは上画像のように、Windowsアイコンを「右クリック」して、表示されるメニューの中から[設定]をクリックします。

Pico2W Bluetooth ペアリング方法

上画像のように「設定」画面が表示されたら[Bluetoothとデバイス]をクリックします。

Bluetoothデバイスとのペアリング

上画像のように表示されたら[デバイスの追加]の「+」部をクリックします。

Pico2W Bluetooth ペアリング方法

上画像のようなウインドウが表示されるので[Bluetooth]をクリックします。

Pico2W Bluetooth ペアリング方法

ここで紹介するサンプルプログラムでは、Bluetoothデバイス名を「Pico_BT」と設定しているため、上画像のように「Pico_BT」が認識されて表示されたら、これをクリックします。

Pico2W Bluetooth ペアリング方法

上画像のような「PIN」番号の確認画面が表示されますが、番号の確認はできないため、そのまま[接続]をクリックすれば問題ありません。

Pico2W Bluetooth ペアリング方法

上画像のような画面が表示され、「Pico_BT」の下に「接続済み」と表示されればペアリング完了です。

Pico2W Bluetooth ペアリング方法

このウインドウをしばらく表示させていると、上画像のように「未接続」となりますが、ペアリングは完了しているので問題ありません。

以上でペアリング作業は完了です。

ペアリング完了後に「PicoW/Pico2W」のプログラムを書き換えた場合は再度ペアリングの必要があるため、以下の手順でペアリングを行います。

Pico2W Bluetooth ペアリング方法


書き込み後にパソコン側から「Bluetooth通信」接続が実行された時に、以下のようにWindowsの画面右下に[デバイスの追加]ウインドウが表示されたらこれをクリックします。

Pico2W Bluetooth ペアリング方法

上画像のようなウインドウが表示されたら、番号の確認はできないので[はい]をクリックすれば問題ありません。

Pico2W Bluetooth ペアリング方法

ウインドウが切り替わり、上画像のようにデバイス名の下に「接続成功」と表示されたらペアリング完了です。

4.動作確認1:Bluetooth通信で遠隔データ取得

動作確認1では「PicoW/Pico2W」で測定したデータをBluetooth通信で受信して、パソコン上で確認する方法を紹介します。

今回は「PicoW/Pico2W」基板に内蔵されている温度センサの値を、1秒ごとに取得して確認します。
基板内部温度のため、基板の発熱の影響を受けるのため雰囲気温度とは異なります。
あまり実用的ではないため、正確な温度測定を行うには外付けの温度センサを使用しましょう。

・動作紹介

サンプルプログラムを書き込むと、「PicoW/Pico2W」基板上のLEDが1秒ごとに点灯/消灯を繰り返し、基板内部の温度データが1秒ごとにBluetooth通信で送信されます。

データの確認には「ArduinoIDE」のシリアルモニタを使用します。

シリアルモニタを起動すると、下画像のように、1秒ごとに受信した温度データが確認できます。

Pico2W Bluetooth受信データの確認
受信データの先頭に表示されている「BT:」はBluetooth通信の受信データを表します。
有線のUSBシリアル通信でも同じように温度データを取得して表示できますが、この場合は「SR:」と表示されるように設定してあります。
応用編として、受信した温度データを自作の「Python」アプリで「CSV」データとして保存して、「Excel」で確認してデータ分析等に利用できる方法も紹介しています。

・サンプルプログラム

サンプルプログラムは以下になります。
コピペで貼り付けて書き込んでください。コピーは下の黒塗り部右上のアイコンクリックでもできます。

#include <SerialBT.h>  // Bluetooth通信用ライブラリ

// 変数宣言
const int ledPin = LED_BUILTIN; // LEDの端子番号を取得
bool ledState = HIGH;           // LED状態格納用(HIGH 点灯/LOW 消灯)

// 初期設定 ----------------------------------------------------------
void setup() {
  Serial.begin(9600);          // USBシリアル通信を初期化
  SerialBT.setName("Pico_BT"); // Bluetoothデバイス名を設定
  SerialBT.begin(9600);        // Bluetooth通信を初期化

  pinMode(ledPin, OUTPUT);     // LED端子を出力設定
}

// メイン ------------------------------------------------------------
void loop() {
  // Pico内蔵の温度センサの値を取得
  float temp = analogReadTemp();  // 温度データアナログ値を取得
  String tempStr = "Temp: " + String(temp) + "°C"; // 送信データ成形
  
  // Bluetooth通信で温度データを送信
  SerialBT.print("BT:");      // Bluetooth通信なら「BT:」付
  SerialBT.println(tempStr);  // 温度データ送信

  // USBシリアル通信でも温度データを送信
  Serial.print("SR:");        // USBシリアル通信なら「SR:」付
  Serial.println(tempStr);    // 温度データ送信

  // LED点滅処理(正常動作確認用)
  ledState = !ledState; // LEDの状態を反転
  digitalWrite(ledPin, ledState); // LED状態出力

  delay(1000); // 1秒待機(データ送信間隔)
}

・ArduinoIDEのシリアルモニタで動作確認

サンプルプログラムを書き込んで、動作確認を行う手順は以下のようになります。

Raspberry Pi Pico  Bluetoothの動作確認

まずは上画像のように「ArduinoIDE」の開発画面にサンプルプログラムを貼り付けて[書き込みアイコン(→部)]をクリックして書き込みを開始します。

Raspberry Pi Pico Bluetoothの動作確認

書き込みが完了したら、上画像のように[ツール]→[ポート:”(ここは環境によって異なります)”]をクリックして表示される[COM番号(Generic RP2350,〜)]をクリックしてチェックマークがついていることを確認してください。

Raspberry Pi Pico Bluetoothの動作確認

次に上画像のように虫眼鏡の[シリアルモニタアイコン]をクリックします。

Raspberry Pi Pico Bluetoothの動作確認

「ArduinoIDE」のウインドウ下に「シリアルモニタ」が表示されます。
通信速度は「9600baud」に設定してください。

シリアルモニタには「SR:」に続けて温度データが1秒ごとに表示され続けますが、これは有線のUSBケーブルで受信したデータです。

Bluetooth通信を行うためにはパソコンとのペアリングを行う必要があります。
ペアリング方法はページ上のこちら→「パソコンとのペアリング方法」を参照してください。

Raspberry Pi Pico Bluetoothの動作確認

ペアリング後に上画像のように[ポート:」を確認すると、新たなCOM番号が2つ増えています。
私の環境では増えた2つのうち数値の大きいCOM番号が「Bluetooth通信」ポートでしたのでこれを選択します。

Raspberry Pi Pico Bluetoothの動作確認

「Bluetooth通信」が開始されると上画像のように「SR:」に続けて表示されていた温度データが「BT:」に続けて表示されるようになります。

「Bluetooth通信」でデータ受信の確認ができたら、パソコンと接続ケーブルを外して、「PicoW/Pico2W」単体で電源供給してもデータの受信ができるので、試してみてください。

再接続する場合はシリアルモニタを一旦閉じて、再度開いてください。
「BT:」付の表示が確認できない場合はもう一方のCOM番号を選択して試してみてください。
Raspberry Pi Pico Bluetoothの動作確認

再度プログラムの書き込みを行う場合は、「PicoW/Pico2W」をパソコンと接続して上画像のように「有線のCOM番号」を選択してから行ってください。

応用編では、自作の「Python」アプリを使用して受信したデータを「CSV」形式で保存して「Excel」で確認する方法も紹介しています。

5.動作確認2:Bluetooth通信で遠隔操作

動作確認2ではパソコンから「PicoW/Pico2W」基板上のLEDを「Bluetooth通信」による遠隔操作で「ON/OFF」させる「Lチカ」の動作確認を行います。

また、「PicoW/Pico2W」基板上の「BOOTSEL」ボタンを利用して、ボタンを押すごとにLEDを「点灯/消灯」させるようにして、LEDの状態が変化した時にパソコン側で確認できる、稼働監視も行います。

・動作紹介

今回の動作確認は「ArduinoIDE」を2つ起動して以下のように行います。

Raspberry Pi Pico Bluetoothの動作確認

左側が有線USB接続のシリアルモニタで、右側がBluetooth接続のシリアルモニタです。

Bluetooth側のシリアルモニタから「PicoW/Pico2W」基板へ「ON」という文字列を送信すると基板上のLEDが点灯します。「OFF」という文字列を送信するとLEDは消灯します。

有線USB接続側のシリアルモニタには「Bluetooth通信」で送信されてきた文字列データ「ON/OFF」が表示され、LED点灯時は「LED ON!」消灯時は「LED OFF!」が表示されます。

基板上の「BOOTSEL」ボタンを押すごとにLEDが点灯/消灯を繰り返し、それぞれのシリアルモニタにはLEDの状態が変化するごとに「LED Change!」が表示されます。

・サンプルプログラム

サンプルプログラムは以下になります。
コピペで貼り付けて書き込んでください。コピーは下の黒塗り部右上のアイコンクリックでもできます。

#include <SerialBT.h>  // Bluetooth通信用ライブラリ

// 変数宣言
const int ledPin = LED_BUILTIN; // LEDの端子番号を取得
bool ledState = HIGH;           // LED状態格納用(HIGH 点灯/LOW 消灯)
bool buttonState = LOW;         // BOOTSELボタン状態格納用

// 初期設定 ----------------------------------------------------------
void setup() {
  Serial.begin(9600);           // USBシリアル通信の初期化
  SerialBT.setName("Pico_BT");  // Bluetoothデバイス名を設定
  SerialBT.begin(9600);         // Bluetooth通信の初期設定

  pinMode(ledPin, OUTPUT);      // LED端子を出力設定
}

// メイン ------------------------------------------------------------
void loop() {
  // Bluetooth受信データ処理
  if (SerialBT.available()) { // Bluetooth受信データがあれば
    String receivedData = ""; // 受信データ格納用文字列初期化
    
    while (SerialBT.available()) { // データがなくなるまで繰り返す
      char c = SerialBT.read();    // 1文字読み取る
      receivedData += c;           // 文字列に追加
    }
    SerialBT.print(receivedData);  // 受信データをそのまま返す
    Serial.println(receivedData);  // 受信したデータをUSBシリアルモニタに表示

    if(receivedData == "ON") {     // 受信データが「ON」なら
      ledState = HIGH;             // LED状態HIGH(点灯)
      Serial.println("LED ON!");   // USBシリアルモニタ表示
    }
    if(receivedData == "OFF") {    // 受信データが「OFF」なら
      ledState = LOW;              // LED状態LOW(消灯)
      Serial.println("LED OFF!");  // USBシリアルモニタ表示
    }
  }

  // BOOTSELボタンONでLED状態反転、Bluetoothデータ送信
  if (BOOTSEL == HIGH && buttonState == LOW) {  // BOOTSELボタンがON かつ BOOTSELボタン状態がOFFなら
    buttonState = HIGH;               // BOOTSELボタン状態をHIGHへ
    ledState = !ledState;             // LED状態反転
    SerialBT.println("LED Change!");  // Bluetoothシリアルデータ送信
    Serial.println("LED Change!");    // USBシリアルモニタ表示
  }
  if (BOOTSEL == LOW) { // BOOTSELボタンがOFFなら
    buttonState = LOW;  // BOOTSELボタン状態をLOWへ
  }

  digitalWrite(ledPin, ledState); // LED出力実行
  delay(100); // 遅延時間
}

・ArduinoIDEのシリアルモニタで動作確認

動作確認にはArduinoIDEのシリアルモニタを使用しますが、有線のUSB接続のシリアルモニタと無線のBluetooth接続のシリアルモニタの両方を使用したいため、下画像のように「ArduinoIDE」を2つ起動して並べて表示しておくと、両方の通信内容がリアルタイムで確認できます。

Raspberry Pi Pico Bluetoothの動作確認

「ArduinoIDE」を2つ起動したら、左側にサンプルプログラムをコピペで貼り付けて、下画像のようにポートの設定を確認してから書き込みを行います。

「ArduinoIDE」でPicoに書き込みを行う初期設定はページ上のこちら→「PicoW/Pico2Wの初期設定」を参照してください。
Raspberry Pi Pico Bluetoothの動作確認

左側の「ArduinoIDE」のポート設定は、上画像のように有線のUSBポート「COM6(番号は環境によります)(Generic RP2350〜)」を選択してください。

Raspberry Pi Pico Bluetoothの動作確認

右側の「ArduinoIDE」のポート設定は、上画像のように無線のBluetooth通信ポート「COM7(番号は環境によります)」を選択してください。

Raspberry Pi Pico Bluetoothの動作確認

両方の「ArduinoIDE」で上画像のように[虫眼鏡アイコン]をクリックしてシリアルモニタを起動します。
右側のBluetooth接続のシリアルモニタの「デリミタ(送信メッセージの末尾につけるもの)」は「改行なし」に設定しておいてください。

Raspberry Pi Pico Bluetoothの動作確認

右側のBluetooth接続のシリアルモニタに「ON」を入力して[Enterキー]を押すと、下画像のように基板上のLED(画像右上)が点灯します。

Raspberry Pi Pico2W
Raspberry Pi Pico Bluetoothの動作確認

右側のシリアルモニタに「OFF」を入力して[Enterキー]を押すと、LEDは消灯します。

Raspberry Pi Pico2W BOOTSELボタン

上画像のように基板上の「BOOTSELボタン」を押すと、基板上のLEDが点灯していれば消灯、消灯していれば点灯します。

Raspberry Pi Pico Bluetoothの動作確認

「BOOTSELボタン」を押して、基板上のLEDが点灯すると上画像のように「LED Change!」が両方のシリアルモニタに表示され、LEDの状態が変化したことが確認できます。

Raspberry Pi Pico Bluetoothの動作確認

もう一度「BOOTSELボタン」を押して、基板上のLEDが消灯すると上画像のように「LED Change!」が両方のシリアルモニタに表示され、LEDの状態が変化したことが確認できます。

LEDを「点灯/消灯」させるために送信する文字列や、Pico基板の状態を送信する文字列は好きなように変えることができます。
複数設定して、外付けのLEDやモーターを駆動するように設定すれば色々な動作を遠隔操作で制御することができるようなります。
応用編では自作のpythonアプリを使用して、画面上の「ON/OFF」ボタンでLEDの「点灯/消灯」を制御する方法も紹介しています。

6.応用編:自作Pythonアプリで動作確認

ここまでは、動作確認に「ArduinoIDE」のシリアルモニタを使用しましたが、毎回文字列データを送信していては実用性がありません。

ここからは簡単なPythonアプリを使用して、受信データを確認したり、パソコン画面上のボタン操作で遠隔操作する方法を紹介します。

・動作確認1:遠隔データ取得、CSV保存データをExcelで確認

動作確認1の応用編として、Pico基板内の温度データを自作のPythonアプリで受信して、CSVデータとして保存して、Excelで確認する方法を紹介します。

使用したPythonアプリは、以前紹介した以下の記事の記録機能付シリアルモニタを使用します。

Bluetooth通信でパソコンへcsvデータ保存、遠隔操作する方法
BluetoothでM5StickC Plusとパソコン間でデータ送受信やcsv保存、遠隔操作する方法をpython自作アプリのシリアルモニタを使って詳しく紹介

pythonのインストール方法については以下のリンクで詳しく紹介しています。

pythonのダウンロードからインストール方法の紹介
人気のプログラミング言語 python のインストール方法の紹介です。python はアプリ開発やWebサイト構築、ディープラーニングにも使用されますが、マイコンボードの統合開発環境「Platform IO」のインストールにも必要です。

受信するデータは数値だけの方が後でExcelでグラフ表示する等で扱いやすいため、サンプルプログラムは「21,22行目」を修正した、以下のものを使用します。

サンプルプログラムは以下になります。
コピペで貼り付けて書き込んでください。コピーは下の黒塗り部右上のアイコンクリックでもできます。

#include <SerialBT.h>  // Bluetooth通信用ライブラリ

// 変数宣言
const int ledPin = LED_BUILTIN; // LEDの端子番号を取得
bool ledState = HIGH;           // LED状態格納用(HIGH 点灯/LOW 消灯)

// 初期設定 ----------------------------------------------------------
void setup() {
  Serial.begin(9600);          // USBシリアル通信を初期化
  SerialBT.setName("Pico_BT"); // Bluetoothデバイス名を設定
  SerialBT.begin(9600);        // Bluetooth通信を初期化

  pinMode(ledPin, OUTPUT);     // LED端子を出力設定
}

// メイン ------------------------------------------------------------
void loop() {
  // Pico内蔵の温度センサの値を取得
  float temp = analogReadTemp();  // 温度データアナログ値を取得
  String tempStr = "Temp: " + String(temp) + "°C"; // 送信データ成形
  
  // Bluetooth通信で温度データの値のみを送信
  SerialBT.printf("%.1f\n", temp);  // 温度データ送信(デリミタ:改行)

  // USBシリアル通信でも温度データを送信
  Serial.print("SR:");        // USBシリアル通信なら「SR:」付
  Serial.println(tempStr);    // 温度データ送信

  // LED点滅処理(正常動作確認用)
  ledState = !ledState; // LEDの状態を反転
  digitalWrite(ledPin, ledState); // LED状態出力

  delay(1000); // 1秒待機(データ送信間隔)
}

Pythonアプリのシリアルモニタを使用した動作確認の様子は以下になります。

「シリアルモニタ」のpythonのアプリの使用方法は以下のリンクで詳しく紹介しています。

Bluetooth通信でパソコンへcsvデータ保存、遠隔操作する方法
BluetoothでM5StickC Plusとパソコン間でデータ送受信やcsv保存、遠隔操作する方法をpython自作アプリのシリアルモニタを使って詳しく紹介

サンプルプログラムを書き込んだらPythonアプリの「シリアルモニタ」を起動します。

Raspberry Pi Pico Bluetoothをpythonアプリで動作確認

上画像のような「シリアルモニタ」が表示されたら[ポート選択]右の[ドロップダウンリスト]からペアリング済みのBluetooth通信の[COM番号]を選択して[接続ボタン]を押すと、「Pico」からデータが送信されて表示されます。

プログラムを書き込み直後は再ペアリングが必要なため、上で紹介している「こちら」のように再度ペアリングを行ってください。
Raspberry Pi Pico Bluetoothをpythonアプリで動作確認

[記録ボタン]を押すと「pythonアプリ」の実行ファイルがあるフォルダに受信データが「タイムスタンプ」付で「CSV」ファイルに保存されます。

Raspberry Pi Pico Bluetoothをpythonアプリで動作確認

保存された「CSV」ファイルを開いたものは上画像のようになります。

Raspberry Pi Pico Bluetoothをpythonアプリで動作確認

「CSV」ファイルをExcelで開くと上画像のようにセルごとに表示され、グラフの表示等、データ分析に利用することができるようになります。

・動作確認2:パソコンからON/OFFボタンでLチカ

動作確認2の応用編として、パソコン画面の[ON/OFFボタン]でPico基板上のLEDデータの「点灯/消灯」を行う方法を紹介します。

[ON/OFFボタン]は自作のPythonアプリを使用します。

「Pico」に書き込むプログラムは「動作確認2」のサンプルプログラムと同じです。

[ON/OFFボタン]を表示させるPythonアプリのサンプルプログラムは以下になります。
コピペで貼り付けて実行してください。コピーは下の黒塗り部右上のアイコンクリックでもできます。

import tkinter as tk
from tkinter import ttk
import serial
import serial.tools.list_ports

class SerialApp:
    def __init__(self, root):
        self.root = root
        self.root.title("Serial Communication")
        self.root.geometry("300x130")
        
        # 通信ポートの取得とウィジェットの配置
        ttk.Label(root, text="通信ポート").grid(row=0, column=0, sticky="ew")
        self.port_combobox = ttk.Combobox(root, state="readonly", values=self.get_serial_ports())
        self.port_combobox.grid(row=0, column=1, sticky="ew")
        self.port_combobox.bind("<<ComboboxSelected>>", self.port_selected)

        # 通信速度の設定
        ttk.Label(root, text="通信速度").grid(row=1, column=0, sticky="ew")
        self.baud_rate_combobox = ttk.Combobox(root, state="readonly", values=[9600, 115200, 38400])
        self.baud_rate_combobox.set(9600)  # 初期値
        self.baud_rate_combobox.grid(row=1, column=1, sticky="ew")

        # ONボタン
        self.on_button = ttk.Button(root, text="ON", command=self.send_on, width=20)
        self.on_button.grid(row=2, column=0, columnspan=2, pady=(5, 0), padx=10) 

        # OFFボタン
        self.off_button = ttk.Button(root, text="OFF", command=self.send_off, width=20)
        self.off_button.grid(row=3, column=0, columnspan=2, pady=(5, 0), padx=10) 
        
        self.serial_connection = None

    def get_serial_ports(self):
        """利用可能なシリアルポートのリストを取得"""
        ports = [p.device for p in serial.tools.list_ports.comports()]
        return ports
    
    def port_selected(self, event):
        """選択されたポートに接続"""
        selected_port = self.port_combobox.get()
        if self.serial_connection and self.serial_connection.is_open:
            self.serial_connection.close()
        
        self.serial_connection = serial.Serial(selected_port, int(self.baud_rate_combobox.get()))
    
    def send_on(self):
        """'ON'メッセージを送信"""
        if self.serial_connection and self.serial_connection.is_open:
            message = "ON"
            self.serial_connection.write(message.encode('utf-8'))

    def send_off(self):
        """'OFF'メッセージを送信"""
        if self.serial_connection and self.serial_connection.is_open:
            message = "OFF"
            self.serial_connection.write(message.encode('utf-8'))

    def on_closing(self):
        """アプリ終了時のクリーンアップ処理"""
        if self.serial_connection and self.serial_connection.is_open:
            self.serial_connection.close()
        self.root.destroy()

if __name__ == "__main__":
    root = tk.Tk()
    app = SerialApp(root)
    root.protocol("WM_DELETE_WINDOW", app.on_closing)  # アプリを閉じる際の処理
    root.mainloop()

Pythonアプリを使用した動作確認の様子は以下になります。

まずはWindowsで「コマンドプロンプト」を起動して、以下のように上記の「python」プログラム(メモ帳等にコピペで貼り付けてファイル名を拡張子ごとbutton_on_off.pyに変更して保存)を実行します。
以下の例では、上記のファイルをファイル名「button_on_off.py」として[Documents/python]フォルダに保存していた場合の例です。

pythonのインストール方法については以下のリンクで詳しく紹介しています。

pythonのダウンロードからインストール方法の紹介
人気のプログラミング言語 python のインストール方法の紹介です。python はアプリ開発やWebサイト構築、ディープラーニングにも使用されますが、マイコンボードの統合開発環境「Platform IO」のインストールにも必要です。

実行ファイルが保存されているフォルダへ移動

cd Documents/python

pythonプログラムを実行

python button_on_off.py

実行すると以下のようなpythonアプリが起動します。

Raspberry Pi Pico Bluetoothをpythonアプリで動作確認

アプリが起動したら上画像のように[通信ポート]右の[ドロップダウンリスト]からペアリング済みのBluetooth通信の[COM番号]を選択します。

プログラムを書き込み直後は再ペアリングが必要なため、上で紹介している「こちら」のように再度ペアリングを行ってください。

ペアリングが完了してから[ONボタン]を押すと

Raspberry Pi Pico2W

「Pico」基板上のLED(上画像右上)が点灯します。

[OFFボタン]を押すと

Raspberry Pi Pico2W

「Pico」基板上のLED(上画像右上)が消灯します。

7.まとめ

「Raspberry Pi Pico2W」でBluetooth通信を使用して、遠隔操作やデータ取得をする方法をサンプルプログラムを使用して詳しく紹介しました。

「Pico2W」は「PicoW」よりコントローラのクロック速度が「133MHz」から「150MHz」になる等、機能アップしていますが使用方法は同じです。

Bluetooth通信の使い方については、「Arduino」のライブラリ「SerialBT」を使用すれば比較的簡単に、通信を行うことができ、遠隔操作やデータ取得を行うことができます。

Bluetooth通信と言っても通信するデータはシリアル通信(UART)と同じ文字データです。
動作確認は開発環境の「ArduinoIDE」の「シリアルモニタ」で簡単に行うことができます。

「ArduinoIDE」を2つ起動して、1つは有線のUSBシリアルデータを確認しながら、もう1つはBluetooth通信のシリアルデータを確認すると作業効率が良いと思います。

シリアルモニタでの動作確認では文字列データの送信による動作確認となりますが、より実用的に使用するなら、「python」の「pyserialライブラリ」でシリアル通信の制御を行い、「tkinter」でGUIアプリを作成すれば、遠隔操作やデータ取得も比較的容易に行うことができるようになります。

今回は「ArduinoIDE」を使用した「C言語」による動作確認を行いました。
標準で使用できるライブラリ「SerialBT」は使いやすいのですが「PicoW」基板同士でペアリングして通信を行う機能は実装されていないため、他のライブラリに頼る必要がありそうです。

今後は「PicoW」基板同士で通信を行う方法や、「python」を使用してBluetooth通信を行う方法等も紹介できればと思います。

ラズパイPico/PicoWの使い方を3つの開発環境Python、ArduinoIDE、PlatformIOで紹介
Raspberry Pi Pico/Pico Wの使い方を端子配列からPython(MicroPython)とC言語の開発環境、Lチカ方法まで紹介。PythonはTonny、C言語はArduinoIDEとPlatformIOの3種類で詳しく紹介します。

コメント

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