Help us understand the problem. What is going on with this article?

BluetoothSerialでお手軽無線通信(M5StickC)

シリアル通信

IoT開発において以下のユースケースなど、ArduinoなどのデバイスをPCと連携させたいパターンは多いと思います。

  • PCからデバイスの設定値を上書きする
  • デバイスで取得された値をPCに送信する

その際、最もお手軽な方法がシリアル通信ではないでしょうか
Arduinoの標準機能でもありますし、大体のPCのOSでサポートされている機能だと思います。

しかし、物理的なケーブルでPCとデバイスをつないでいるとデバイスの配置などが制限されてしまう場合があります。デバイスのユースケースにおいてはPCとの接続を無線で行いたい場合も多いでしょう。

Bluetoothでの無線の利便性とシリアル通信の手軽さの両方の恩恵に預かれるのが、 Bluetoothの SPP (Serial Port Protocol) という規格です。

SPP (Serial Port Protocol)

SPPとは、Bluetoothのプロファイルのひとつで、Bluetooth搭載機器を仮想のシリアルポート化するためのプロファイルのこと。

シリアル通信をBluetoothで行うための規格がすでに決められています。
PC側では仮想のシリアルポートとして利用するため、シリアルポート経由で行う体でプログラミングすればよく、有線の場合/無線の場合といった考慮が不要になるのが大きなメリットになります。

BluetoothSerial

ESP32のライブラリの1つであり、SPPをデバイスに実装するためのライブラリです。

ライセンスは Apache License, Version 2.0 のようです。

BluetoothSerial.hのヘッダコメント
// Copyright 2018 Evandro Luis Copercini
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at

//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

使い方

Arduinoの開発環境に上記 BluetoothSerial を追加し(最初から入っているかも)、以下のように実装します。

#include "BluetoothSerial.h"

BluetoothSerial SerialBT;

void setup() {
  SerialBT.begin("ESP32");
}

void loop() {
  SerialBT.println("Hello World");
  delay(1000);
}

次に、PCに BluetoothSerial のデバイスを覚えさせるためPCとペアリングする必要があります。
デバイスを起動した状態で、各OSの設定メニューからペアリングを行なってください。
上記の実装例の場合ですと ESP32 と表示されるはずです。SerialBT.begin() に渡した文字列で検出されます。

最後にPC側の実装です。ここでの実装は C# で行います。

using System.IO.Ports;

const string comPort = "COM7"; // ポート番号は自分で確認してください
const int baudRate = 115200;

public static void Main(string[] args) {
  var serial = new SerialPort(comPort, baudRate);
  serial.Open();
  while (true) {
    string message = serial.ReadLine();
    Console.WriteLine(message); // Hello World
  }
}

動作確認していないコードですが、雰囲気こんな感じです。詳しくはこちらなどをご参照ください

何番のポートに BluetoothSerial の仮想ポートが割り振られているかを事前に知っておく必要があります。Windowsであればデバイスマネージャで確認したりできますが、ArudinoIDEのシリアルモニタで実際につなげてみたりして確認するのが確実でしょう。

また、デバイス側では特にボードレートを設定していませんでしたが、PC側ではよくある値として 115200 を設定しています。もしかしたらなんでも良いのかもしれません。

応用例

2000円で買える IMU x Bluetooth デバイスである M5StickC を使って無線でIMUのデータをPCに送る開発をしました。

クライアントPC側はUnityで実装しており、無線ジャイロコントローラ的な用途に使えます。
BluetoothSerial で仮想のシリアルポートを使っていれば、Windowsネイティブの処理を呼ばなくてもBluetoothでの送受信が書けるので、Unity Editorでも動作する点が特に助かりました。:pray:

参考記事

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした