Pico W PR

【質問回答】RaspberryPi pico WでBluetooth でシリアル通信をする方法【Arduino SPP RFCOMM】

記事内に商品プロモーションを含む場合があります

はじめに

RaspberryPi pico Wで、BluetoothのSPP(Serial Port Profile)を使う方法について、記事リクエストをいただいたので解説したいと思います。

SPPは、Bluetoothを使ってシリアル通信をする(RFCOMM)規格なのですが、Pico WのMicroPythonではサポートされていません。

そのため今回は「Aruduino言語」を使って、Pico WでSPP通信を行います。接続先はスマホアプリ「Serial Bluetooth Terminal 」を使用します。

リクエストいただいた「かず」さん、ありがとうございます。

環境

この記事で使用する環境は以下の通りです。

環境 バージョンなど 備考
開発用PCのOS Windows11 Windows10でもOKです
言語 Arduino言語
開発環境  Arduino IDE 2.2.1
ボード RaspberryPi Pico W
ボードサポートパッケージ
スマホ アプリ Serial Bluetooth Terminal 

RaspberryPiとの接続

SPPを使って以下のように無線接続します。Pico Wへの配線は必要はありません。

システム構成を説明する画像
SPPでの接続イメージ

使用する部品

Pico W 本体

Raspberry Pi Pico W本体です。技適対応品かどうか心配…という方は、以下のページで出品者を「共立エレショップAセレクト」(国内の有名ショップ)にして購入してください。

¥1,635 (2024/04/28 23:25時点 | Amazon調べ)

プログラム概要

今回のプログラムの概要は以下の通りです。

  • 小文字データの受信(Pico W ← terminal)
  • 受信データを大文字に変換
  • 大文字データの送信(Pico W → terminal)

Arduino言語のセットアップ

別記事にまとめていますので、こちらの記事をご参照ください。

実行結果

後述のプログラムの実行結果は以下の通りです。

Serial Bluetooth Terminalで入力した、小文字の「abcde」が、Pico Wで変換され、大文字の「ABCDE」としてシリアルモニタに出力されています。

Serial Bluetooth Terminalの入力画面の実行結果を解説する画像
Serial Bluetooth Terminalの入力画面
ArduinoIDEの実行結果画面を解説する画像
ArduinoIDEのシリアルモニタ表示

※ 画像をクリックすると拡大できます。

全体コード

全体コードは以下の通りです。詳細な内容は後述する「コードのポイント」で解説します。

こちらの公式のサンプルにコメント・デバッグ用のコードを追加したものです。

#include <SerialBT.h>

void setup() {
  
  // Bluetooth Serialを開始します。
  // 指定なしの場合ボーレートは115200です。
  SerialBT.begin();

  // デバッグ用のUSBシリアルを開始します。
  Serial.begin(115200);

  // 本体LED(のピン)を出力に設定します。
  pinMode(LED_BUILTIN, OUTPUT);
  
  // 本体LEDを点灯させます。
  digitalWrite(LED_BUILTIN, HIGH);

  Serial.println("start");

}

void loop() {

  // Bluetoothが開始されている間繰り返します。
  while (SerialBT) {

    // 受信データがある間繰り返します。
    while (SerialBT.available()) {    

      // 受信データを読み込みます
      char c = SerialBT.read();
      
      // 読み込んだ文字を大文字に変換します
      c = toupper(c);

      // 大文字にした文字を送信します。
      SerialBT.write(c);

      // デバッグ用に受信データをシリアルモニタに表示します。
      Serial.println(c);
    }
  } 
}

コードのポイント

Bluetooth Serial (SPP)の開始

Bluetoothを使ったシリアル通信も、デバッグで使うUSBシリアルと同じようにbegin関数を呼ぶだけで使えます。引数を指定しない場合のボーレートは「115200」です。

 // Bluetooth Serialを開始します。
  // 指定なしの場合ボーレートは115200です。
  SerialBT.begin();

  // デバッグ用のUSBシリアルを開始します。
  Serial.begin(115200);

本体LEDの点灯

定数「LED_BUILTIN」を指定するとPico W搭載のLEDに対する操作が行えます。デバッグ(見た目)上のコードなので、省略してもOKです。

  // 本体LED(のピン)を出力に設定します。
  pinMode(LED_BUILTIN, OUTPUT);
  
  // 本体LEDを点灯させます。
  digitalWrite(LED_BUILTIN, HIGH);

データの受信

available関数は、Bluetooth Serialの受信データがある際に「True」を返します。データがある状態でread関数を呼び出すと、1文字(1byte)分の受信データを取得できます。

 // Bluetoothが開始されている間繰り返します。
  while (SerialBT) {

    // 受信データがある間繰り返します。
    while (SerialBT.available()) {    

      // 受信データを読み込みます
      char c = SerialBT.read();

大文字への変換

toupper関数の引数に文字(char)を渡すと、大文字に変換した文字が返ります。

      // 読み込んだ文字を大文字に変換します
      c = toupper(c);

データの送信

write関数の引数に文字(char)を渡すことで、1文字(1byte)分のデータを送信することができます。

      // 大文字にした文字を送信します。
      SerialBT.write(c);

データの表示

デバッグ用のコードです。Bluetooth Serialで送信した文字を、シリアルコンソールに表示します。

      // デバッグ用に受信データをシリアルモニタに表示します。
      Serial.println(c);

まとめ

RaspberryPi Pico W で、BluetoothのSPP(Serial Port Profile)を使う方法について解説しました。MicroPythonのBLEとは違い、SPPではコードがシンプルに記載できるのはうれしいですよね。

MicroPythonも使いやすくてよいのですが、サポートされていない場合や、サクッと使いたい場合には、Arduino言語(環境)を使ってみるのも一つの手段かもしれません。

参考になればうれしいです。

質問いただいた かずさんへ

当初は「RaceChrono」にダミーデータを表示する所までを作成する予定でしたが、RaceChronoの仕様(無料版でのデータ表示の可否・プロトコル…etc)でハマってしまい、長時間必要そうなので、一旦SPP(RFCOMM)の内容のみで記事を作成してみました。

上記SPPのコードを開始すれば、AndroidのRaceChrono(無料版)で、RaceChrono DIYとして認識(接続)してくれるところまでは確認できているのですが、やり取り部分についてはラズパイのコードを移植していただくか、ラズパイ版のコードとRace Chronoの使い方を教えていただけるともう少しお力になれそうです。

またコメントいただければうれしいです。

お知らせ

今月号のInterfaceは『仕事のChatGPT』!

今週号の日経Interfaceは「仕事のChatGPT」。
イントロとして、ChatGPTをはじめとした大規模言語モデル(LLM)の現在や、エンジニア向け生成AIの活用法。その後の内容で、ChatGPTを使ったPythonでゲームの作り方や生成AIを使ったシステムの製作例が学べます。

全ての内容はここでは紹介しきれないので、詳細は以下のAmazonページをご覧ください。

5月25日発売です。

CQ出版
¥1,430 (2024/04/25 12:53時点 | Amazon調べ)

Pico/Pico W関連のおすすめ本

RaspberryPi Pico / Pico W関連のおすすめ本を独断と偏見で3つ選んでみました。Picoやるならとりあえずこれ買っとけ的な本や、電子工作全般で使える本などを厳選しています。

見た目のいい工具をお探しの方へ

よく使うツールは『見た目』が重要。モチベもあがりますし、仲間との話のネタにもなります。以下のサイトは、デザイン性の高い工具が集めたサイトなので、興味がある方はぜひご覧ください。

質問・要望 大歓迎です

「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。

使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。

ABOUT ME
えす
現役のソフトウェアエンジニアです。 C++ C# Python を使ってます。10年ちょい設計/開発部門にいましたが、今はQAエンジニアっぽいことをしています。

POSTED COMMENT

  1. かず より:

    記事ありがとうございます!
    参考にさせてもらいます!
    ラズパイのコードはどうしたらいいでしょうか?
    ここに載せたらいいでしょうか?
    あとRace Chronoの使い方はどこのあたりがわかりませんか?

    • えす より:

      かずさん

      えすです。

      ラズパイのコードありがとうございます!
      気になっていたのでうれしいです、メール添付でいただけると助かります。後程メールを送ります。

      RaceChronoは、無料版の画面にRace Chrono DIYのデータが表示されないところ(データ取得中の表示のまま)で困ってまして、以下の内容を教えていただきたいです。

      1. DIYの表示内容
       ラズパイから正常にRace Chronoにデータ送信できた状態の、Race Chronoのスクショをいただけないでしょうか?
       (恐らく「データロガー」のところに何か表示される。と思っているのですが、どうなれば通信成功なのかちょっと分からなかったので)

      2. デバッグ手法
       DIY から Race Chronoに送るデータのフォーマットに間違いがあった場合、Race Chronoのログやエラー表示など、間違っていることを確認できる手段(デバッグする手段)はあるでしょうか?

      よろしくお願いします。

  2. くろ より:

    記事掲載いただき、ありがとうございます。
    当方、プログラミングのド素人です。
    早速ですが、
    本記事の「今回の全体コード」をPico WにUploadした際にエラーメッセージが出たのですが、そちらの対処方法をお教えいただく事は可能でしょうか。
    エラーメッセージはメール等でお送りできます。
    よろしくお願いします。

    • えす より:

      くろさん

      コメントありがとうございます。えすです。

      了解です。大丈夫ですよ。
      後ほど、入力いただいたアドレスにメールを送るので、
      エラーメッセージや、つないでいるPCのOSなども教えてもらえると助かります。

  3. くろ より:

    えす さん

    くろ です。
    メール返信いただきました内容を確認・実行し、Pico WへのUpload、及び記事内容の動作を確認することができました。
    単純なArduino IDE設定ミスということでした。

    迅速なご対応に感謝します。
    今後もこちらの記事を参考にさせていただきます。

    • えす より:

      くろさん

      えすです。

      動作までできたのとのことで、安心しました。
      また何か分からないことや、ハマることがあったら、気軽にコメントしてください。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

Index