今回はスマホからArduino 101 / Genuino 101のBluetooth Low Energy経由(BluetoothLE 以下BLE)でLEDの明るさをコントロールしたいと思います。
自作Androidアプリからの通信情報をGenuino101でPWM信号に置き換えてLEDの明るさを制御してます。2個のLEDを同時に制御できるようにしてみました。どんなものかは下の確認動画を見ていただければわかり易いかと思います。
▼動作確認動画▼
もう少し操作し易いレイアウトにすれば良かったです……。2個同時の操作が難しいです。通信接続待ち状態でArduinoの13pinLEDが点滅。接続中は点灯するようにしてます。
以下から作成記事です。
スマホアプリ(Androidアプリ)の作成
アプリはMIT Inventor2で作成。公式環境ではBLEに対応していないため、テスト環境で作成してます。
▼アプリ概要▼
「Connect」「Disconnect」でGenuio101とBLE接続・切断をします。2個のスライドバーでスライド位置情報を取得しつつ値にか変化があった場合にcharacteristicへ位置情報を格納。画面中央あたりから下はただのデバック表示です。
基本的な内容は以前作成したLED点滅アプリと同様で、変更したのはLEDの「On/Off」ボタンだったのをスライドバーへ変更したのと、BLE接続の方法を少し変更してます。変更した部分を以下に説明します。
▼BLE接続部分のブロック図です▼
アプリ起動で周辺のBLE機器のスキャン開始。BLE機器を見つけたらMACアドレスを変数へ格納します。「Connect」ボタンがクリックされたらBLE機器との接続を行います。ただこの方法だと、近くにBLE機器が複数ある場合、どの機器と接続するかわかりません。複数BLE機器がある必要がある場合は、「ListPicker」で一度情報を格納してから選択・接続します。
▼スライドバー情報送信部ブロック図▼
スライドバーを2個配置しておりますが、2個とも同様の内容です。スライドバーの位置が変更したら、2個のスライドバーの位置情報をcharacteristicへ格納します。位置情報は数字を整数に丸めて、カンマ区切りで送信します。
MIT Inventor2で作成してますが、sdkバージョンを11以上に設定すれば記事冒頭動画のようにマルチタッチの操作も可能となります。方法はこちらに記載してます。
Arduino101/Genuino101側のスケッチ
BLE機器との接続や複数byteの送受信方法は、以前作成したこちらの記事を参考。
・内蔵Bluetooth LEを使ってみる(LED点滅)
・BLE(Bluetooth LE)で文字列通信
今回は受信部分、LED制御部分を中心に説明します。
▼データを受信する部分のスケッチ▼
while (central.connected()) { if (conLEDCharacteristic.written()) { if (conLEDCharacteristic.value()) { // any value other than 0 for (int i = 0; i < 20; i++) { buf[i] = *(conLEDCharacteristic.value() + i); } Serial.println(buf);//for debug } } }
スマホから受信したカンマ区切り文字列を、一旦buf [ ] へ格納します。
▼受信した情報からLEDの明るさ制御▼
ch[0] = atoi(strtok(buf, ",")); ch[1] = atoi(strtok(NULL, ",")); Serial.println(ch[0]);//for debug Serial.println(ch[1]);//for debug analogWrite(5, ch[0]); analogWrite(6, ch[1]); ch[0] = 0; ch[1] = 0;
buf [ ] にある文字列をカンマ区切りで分けて、数値に変換しつつ ch[ ] へ格納。5,6ピンをそれぞれPWM出力します。LED制御自体はたいしたことはしていません。
これで記事冒頭にある動画のようなLED制御がスマホからできます。応用すれば複数サーボやモータ制御等も簡単にできると思います。
Arduino101/Genuino101にはBluetoothが内蔵されていて、また最近のスマホはBLEに対応してきてます。そのためほとんど追加購入パーツが必要なく、こういったことができるため非常に便利です。ちなみに今回はGenuino101とスマホとLEDのみです。
コメント