47
49

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Moff EngineeringAdvent Calendar 2019

Day 17

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

Last updated at Posted at 2019-12-16

シリアル通信

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 <M5StickC.h>
#include "BluetoothSerial.h"

BluetoothSerial SerialBT;

void setup() {
  Serial.begin(115200);  // 一応Serialを初期化
  SerialBT.begin("ESP32");
}

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

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

!!もしプログラムを書き込めなくなったら!!

Timed out waiting for packet header などのメッセージで新たにプログラムを書き込めなくなった場合はG0とGNDをジャンパピンなどで繋いで強制書き込みモードにして試してみてください。

最後に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:

参考記事

47
49
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
47
49

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?