スマホからサーボモータを制御(Arduino/Genuino101)

 スマホからBluetooth経由でサーボモータを制御してみました。Androidアプリは自作、BluetoothLE(以下BLE)経由で情報を送信し、Arduinoで受けてサーボモータをコントロールしてます。

 

 Genuino101を使用しているのでBLEは内蔵、サーボは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でアプリは作成しました。

 

▼画面はこんな感じです▼
092_02

 ほぼ見たままです。画面上のドラッグでサーボモータを制御してます。中身は今まで紹介してきたアプリとほぼ同様で画面ドラッグの情報をBLEで送信してます。

 

 はじめ、Androidアプリが悪さしてサーボの動きがいまいちでした。原因は単純で、割り込み時の処理に時間がかかって、どうもオーバーフローしていたよう。処理の最適化と割り込みを調整したらうまくいきました。

 

MIT APP Inventor2のBLEコンポーネントの使い方

Arduino/Genuino101のいろいろ

 

<スポンサーリンク>

この投稿へのコメント

コメントはありません。

コメントを残す

メールアドレスが公開されることはありません。

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL