スマホからBluetooth経由でサーボモータを制御してみました。Androidアプリは自作、BluetoothLE(以下BLE)経由で情報を送信し、Arduinoで受けてサーボモータをコントロールしてます。
Genuino101を使用しているのでBLEは内蔵、サーボはArduinoへ直付け。コントローラーはスマホを使用しているため外付け部品は無しです。
▼動作確認動画です▼
この動画に使用したスマホアプリとArduinoスケッチの詳しい作成記事はこちらにアップしています。
以下は簡単な概要です。
Arduino/Genuino101側スケッチ
今までBluetooth受信はポーリングで受けていたのですが、今回はイベントハンドラを使って受信制御してみました。CurieBLEライブラリを利用しているため実装は簡単です。
servoCharacteristic.setEventHandler(BLEWritten, servoCharacteristicWritten);
定義したcharacteristicに対してイベントハンドラを定義してます。第2引数がイベント時に呼び出す関数名になります。
void servoCharacteristicWritten(BLECentral& central, BLECharacteristic& characteristic) { noInterrupts(); servoPin.ticks = 32 * (1600 + (1020 / 90) * servoCharacteristic.value()); interrupts(); digitalWrite(13, LED); LED = LED - 1; }
データ受信時にイベントハンドラが呼び出されます。いろいろあって、今回はservo.hライブラリを使用せずに、自作でサーボモータを制御しているため少し変わったソースとなってます。
servo.hライブラリ使用しても問題はなかったです。(はじめ、サーボのレスポンスが悪くいろいろ試行錯誤する中でservo.hを使わないようにしたのですが、結局原因はそれ以外のところでした。)
LEDはデータ受信毎に点滅を繰り返すようにしてます。記事冒頭の動画でもオンボードのLEDがサーボの動きに合わせて点滅していたかと思います。
今まではポーリングでBLE処理していたのですが、やっぱりイベントハンドラで処理した方が実用的かもしれません。
Android側アプリ
今回もMIT APP Inventor2でアプリは作成しました。
▼画面はこんな感じです▼
ほぼ見たままです。画面上のドラッグでサーボモータを制御してます。中身は今まで紹介してきたアプリとほぼ同様で画面ドラッグの情報をBLEで送信してます。
はじめ、Androidアプリが悪さしてサーボの動きがいまいちでした。原因は単純で、割り込み時の処理に時間がかかって、どうもオーバーフローしていたよう。処理の最適化と割り込みを調整したらうまくいきました。
MIT APP Inventor2のBLEコンポーネントの使い方
コメント
サーボモータを動かすアプリの作り方をよければ、教えていただけませんか?
コメント有難う御座います。アプリの作り方ですが、コメント欄での紹介は難しいので、そのうち記事に投稿したいと思います。この記事のアプリはMIT APP Inventor2を使用、通信はBLEです。それでよければ紹介したいと思います。
返信ありがとうございます。
ぜひお願いします。
こちらにスマホアプリの作り方を投稿しました。
https://garchiving.com/servo-control-in-android/