はじめに
RaspberryPi pico Wで、BluetoothのSPP(Serial Port Profile)を使う方法について、記事リクエストをいただいたので解説したいと思います。
SPPは、Bluetoothを使ってシリアル通信をする(RFCOMM)規格なのですが、Pico WのMicroPythonではサポートされていません。
そのため今回は「Aruduino言語」を使って、Pico WでSPP通信を行います。接続先はスマホアプリ「Serial Bluetooth Terminal 」を使用します。
リクエストいただいた「かず」さん、ありがとうございます。
~ この記事の内容 / Contents ~
環境
この記事で使用する環境は以下の通りです。
環境 | バージョンなど | 備考 |
開発用PCのOS | Windows11 | Windows10でもOKです |
言語 | Arduino言語 | |
開発環境 | Arduino IDE 2.2.1 | |
ボード | RaspberryPi Pico W | |
ボードサポートパッケージ | ||
スマホ アプリ | Serial Bluetooth Terminal |
RaspberryPiとの接続
SPPを使って以下のように無線接続します。Pico Wへの配線は必要はありません。
使用する部品
Pico W 本体
Raspberry Pi Pico W本体です。技適対応品かどうか心配…という方は、以下のページで出品者を「共立エレショップAセレクト」(国内の有名ショップ)にして購入してください。
プログラム概要
今回のプログラムの概要は以下の通りです。
- 小文字データの受信(Pico W ← terminal)
- 受信データを大文字に変換
- 大文字データの送信(Pico W → terminal)
Arduino言語のセットアップ
別記事にまとめていますので、こちらの記事をご参照ください。
実行結果
後述のプログラムの実行結果は以下の通りです。
Serial Bluetooth Terminalで入力した、小文字の「abcde」が、Pico Wで変換され、大文字の「ABCDE」としてシリアルモニタに出力されています。
※ 画像をクリックすると拡大できます。
全体コード
全体コードは以下の通りです。詳細な内容は後述する「コードのポイント」で解説します。
※ こちらの公式のサンプルにコメント・デバッグ用のコードを追加したものです。
#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の使い方を教えていただけるともう少しお力になれそうです。
またコメントいただければうれしいです。
お知らせ
MicroPythonのプログラミングガイドブックが遂に発売!
「MicroPython」の本が遂にでました。
この一冊で、MicroPythonの言語仕様から、プログラミングの仕方まで”ガッツリ”学べます!。
内容は、普段別言語で開発している人や、これからマイコンを始める(工学系の)学生を対象としているので「初心者向け」ではありません。しかし、「自前のライブラリの作成」が目標なので、これ一冊で「ガッツリ」とMicroPythonを学ぶことができます。
全ての内容はここでは紹介しきれないので、詳細は以下のAmazonページをご覧ください。目次だけでも”ガッツリ”なのが確認できると思います。
Pico/Pico W関連のおすすめ本
RaspberryPi Pico / Pico W関連のおすすめ本を独断と偏見で3つ選んでみました。Picoやるならとりあえずこれ買っとけ的な本や、電子工作全般で使える本などを厳選しています。
質問・要望 大歓迎です
「こんな解説記事作って」「こんなことがしたいけど、〇〇で困ってる」など、コメント欄で教えてください。 質問・要望に、中の人ができる限り対応します。
使えたよ・設定できたよの一言コメントも大歓迎。気軽に足跡を残してみてください。記事を紹介したい方はブログ、SNSにバシバシ貼ってもらってOKです。
記事ありがとうございます!
参考にさせてもらいます!
ラズパイのコードはどうしたらいいでしょうか?
ここに載せたらいいでしょうか?
あとRace Chronoの使い方はどこのあたりがわかりませんか?
かずさん
えすです。
ラズパイのコードありがとうございます!
気になっていたのでうれしいです、メール添付でいただけると助かります。後程メールを送ります。
RaceChronoは、無料版の画面にRace Chrono DIYのデータが表示されないところ(データ取得中の表示のまま)で困ってまして、以下の内容を教えていただきたいです。
1. DIYの表示内容
ラズパイから正常にRace Chronoにデータ送信できた状態の、Race Chronoのスクショをいただけないでしょうか?
(恐らく「データロガー」のところに何か表示される。と思っているのですが、どうなれば通信成功なのかちょっと分からなかったので)
2. デバッグ手法
DIY から Race Chronoに送るデータのフォーマットに間違いがあった場合、Race Chronoのログやエラー表示など、間違っていることを確認できる手段(デバッグする手段)はあるでしょうか?
よろしくお願いします。
メールを送りましたm(_ _)m
記事掲載いただき、ありがとうございます。
当方、プログラミングのド素人です。
早速ですが、
本記事の「今回の全体コード」をPico WにUploadした際にエラーメッセージが出たのですが、そちらの対処方法をお教えいただく事は可能でしょうか。
エラーメッセージはメール等でお送りできます。
よろしくお願いします。
くろさん
コメントありがとうございます。えすです。
了解です。大丈夫ですよ。
後ほど、入力いただいたアドレスにメールを送るので、
エラーメッセージや、つないでいるPCのOSなども教えてもらえると助かります。
えす さん
くろ です。
メール返信いただきました内容を確認・実行し、Pico WへのUpload、及び記事内容の動作を確認することができました。
単純なArduino IDE設定ミスということでした。
迅速なご対応に感謝します。
今後もこちらの記事を参考にさせていただきます。
くろさん
えすです。
動作までできたのとのことで、安心しました。
また何か分からないことや、ハマることがあったら、気軽にコメントしてください。