Arduino 101 (Genuino 101)のBluetooth LE(Bluetooth Low Energy 以下BLE)通信の続きです。今回は、自作Androidアプリからの任意テキスト文字を BLE経由で Arduino 101/ Genuino 101へ送信。Arduino側で、受信した文字列をシリアルモニタでPCに表示したいと思います。
▼文字列通信の動作確認動画▼
Arduino 待受け状態で 13pinLED を点滅。BLE接続中は点灯するようにスケッチを改造してます。後述しますが送信できる文字列は 20byte までです。
以下から作成記事・使い方です。
Android 側アプリの作成
前回同様、MIT Inventor2 を使用してスマホアプリを作成してます。 Arduino との BLE 接続・切断等は前回の作成したスマホアプリと変わらないため、送信部分内容のみ解説します。
▼作成した Android アプリ▼
◇概要
- Connect ボタン: Arduino とのBLE 接続します。
- Disconnect ボタン:Arduino とのBLE 接続を切断します。
- 青い部分:デバック画面です。通信状態をデバックしてるだけで通信機能には不要です。
- テキストボックス:ここに送信した文字列を入力します。
- send ボタン:テキストボックスに入力した文字列を BLE 送信します。
今回変えたところは4.5です。
send ボタンがクリックされるとテキストボックスの文字列を characteristic へ格納(送信)します。service、characteristic の uuid はArduino 側と合わせておきます。MIT inventor2 の公式な環境では未だ BLE 用コンポーネントがありませんが、テスト環境では BLE コンポーネントが公開されています。今回はそちらを使用してます。それ以外は前回作成したスマホアプリと同様です。
Arduino101(Genuino101)側スケッチ
arduino.cc のページでは CurieBLE に関してのサンプルスケッチがいくつか紹介されていますが、 1byte データの送受信スケッチ多いです。そのチュートリアルの中、「CurieBLE Heart Rate Monitor」で 2byte を送信しているようなスケッチがありました。また CurieBLE ライブラリページの中頃に
A characteristic value can be up to 20 bytes long. This is a key constraint in designing services. [...]
You could also combine readings into a single characteristic, when a given sensor or actuator has multiple values associated with it.
[e.g. Accelerometer X, Y, Z => 200,133,150
] This is more efficient, but you need to be careful not to exceed the 20-byte limit. The accelerometer characteristic above, for example, takes 11 bytes as a ASCII-encoded string.
このような記載が・・。
使い方調べたら、BLEcharacteristic クラスの引数で、
BLEBoolCharacteristic yourCharacteristicName(UUID, properties, maxLen)
文字配列数(20byte まで)が指定できます。
▼作成した通信部分のスケッチ抜粋です▼
char packet[20];
受信した文字列の格納用の配列です。
BLECharacteristic textCharacteristic("19B10011-E8F2-537E-4F6C-D104768A1214", BLERead | BLEWrite, 20);
▲characteristicの設定です。最後の引数で、20byteを指定してます。▲
▼void loop()内、データ受信とシリアルモニタへの送信部の抜粋です▼
void loop() { while (central.connected()) { if (textCharacteristic.written()) { if (textCharacteristic.value()) { // any value other than 0 for (int i = 0; i < 20; i++) { packet[i] = *(textCharacteristic.value() + i); } Serial.println(packet); digitalWrite(13, HIGH); // will turn the LED on } } } }
char*とconst char *の違いでしょうか?。そのままcharacteristicのSerial.printができなかったため一度、準備したchar型の文字配列に格納してからPCへシリアル通信しています。
これで記事冒頭にある動画のように文字列(20byte以下)の無線通信ができます。複数の値を同時にやり取りできるようになるので処理の幅が広がります。
コメント