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,499 (2024/05/27 10:22時点 | 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の使い方を教えていただけるともう少しお力になれそうです。

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

お知らせ

そぞらさんのRaspberryPi Pico Wの本が登場

RaspberryPi 界隈で有名、Xでもバズり中の「そぞら」さんがPico Wの本を出しました。

Pico Wを使って、電子工作やMicroPythonの文法、AI活用にいたるまでをゼロから学ぶことができるので、興味のあるかたはぜひご覧ください!

MicroPythonのプログラミングガイドブックが遂に発売!

このブログでよく使用している「MicroPython」の本が遂に発売になりました。

MicroPythonの言語仕様から、プログラミングの仕方までが”みっちり”学べます(笑)。

普段別言語で組み込み系の開発をしている人や、これからマイコンの学習が必要となってしまった(専門分野の)学生などを対象としているため、初心者用とはいきませんが、自前のライブラリの作成を目標にしているので、これ一冊で「ガッツリ」と使い方を学ぶことができます。

全ての内容はここでは紹介しきれないので、詳細は以下の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