てきとうなさいと べぇたばん

Arduinoでラジコンを作る

左側から ラジコン。右側から ラジコン。後ろから 正面から これがつくったコントローラー。Nexus 7(2013)で動かしている。 Turbo(ターボモード)をONにしている。この場合は多少早くなる。 Bluetooth SPPによる通信。Androidはタンクから返信されないと再送信出来ないとした 通信中の場合は通信が完了するまで待ってからその時のSeekBarの値を再送信する。

ラジコンを作れるらしい

Arduinoから始めた電子工作。モーターを制御できるようになったので、ラジコンをつくってみようかと思い立った。

乗り物の仕様

方向転換と速度制御ができるようにしたい。モータードライバーを2つ使って、2つのモーターを制御できるようにした。サーボモーターを使って方向転換できるようにしようかとも思ったのだけど、複雑になりそうだなと思ってやめてしまった。

モータードライバーを2つ使う乗り物で方向転換ができる乗り物で、一番最初に思いついたのはキャタピラだった。片方のキャタピラを動かせば旋回するし、両方のキャタピラを動かせば前進・後退する。

モータードライバーを2つ使うだけで制御ができるので簡単そうということで、キャタピラにしようということになった。

キャタピラの起動輪について

これは余談だけど、キャタピラへ動力を伝える車輪を起動輪(スプロケットホイール)とか言うらしい。

戦車での起動輪について

戦車では、起動輪は後方においてある。前方においてしまうと、エンジンなどでスペースを取ってしまい、装甲を分厚く出来ない。前方は装甲を分厚くしないと敵からの攻撃に脆弱になってしまう。そのために後方にエンジンを置くことが慣習になっているようだ。

このラジコンでは

このラジコンでは、起動輪は前に、モーターも前においた。前方と後方では、前方のほうが障害物を乗り越えやすかったためである。

通信で使う方式

コントローラーはAndroidで行おうと考えた。Android側から制御できるようにしたいなと思っていたので、Bluetoothが一番簡単かなという結論になった。

勉強がてらXBeeで通信も良かったんだけど、Androidで制御しようとするとハードルが上がってしまうのでお預け。

Android

Androidでコントローラーを作る理由は、タッチパネルもあるし、PCで制御すると持ち運べない(持ち運べてもどこに持ち運ぶんだよという問題はあるんだけど)し、何よりAndroidでプログラムを組みたかったのだ。

具体的な仕様

タンク側

シリアル通信では、以下の様な値を受け取る。数値がパラメーターで、カンマ区切りで左、右モーターの制御を行う。最後はCRLFを含む。

511,511

256を停止として、257,258...511と出力が上がっていく。逆方向は255,254...1となっていく。0でブレーキ。

受信が完了したら、モータードライバーを操作。10ミリ秒だけ待って処理完了の返信を行う。

Android側

コントローラー側であるAndroidでは、BluetoothのSPPによるシリアル通信で上記の値を送信する。

511,511

Android側で送信の制御や、送信パラメーターを決める。タンク側にはパラメーターを受け取って、モーターを操作するという単純な仕様にしておく。こうすることで、Android側・タンク側両方でプログラムを変更しやすくなる。また、複雑な処理をAndroidにやらせることができる。

パラメーターの送信はリアルタイムではなく、コントローラーの状態に変更があった時のみとしている。

材料

  • タンク工作基本セット
  • Arduino UNO
  • SBDBT
  • Bluetoothドングル
  • ユニバーサルプレート
  • Arduino用ユニバーサルボード
  • スズメッキ線
  • M3ナット
  • M3塩ビ管
  • TA7291P
  • 三端子レギュレータ3.3v
  • 足長ピン
    • 6穴
    • 8穴
  • 電池ボックス
    • 単三乾電池4本6v
    • 006P(9v電池)

躓いたところ

TA7291P

最初、TA7291Pでの電圧制御にvrefを使っていたのだけど、IN1へPWM制御する方式に変更した。

参考

http://cranberrytree.blogspot.jp/2012/12/ta7691ppwm.html

タンクの動力部分のギア比

ギア比が小さいと、まともにキャタピラが動かなかった。仕方なしに、ギア比を上げた。重たいものを運ぶには、ギア比を上げてその分トルクを確保しないといけなかった。

トルクとは、簡単に説明するとネジを回すときにただの棒を回すよりも、ちょっと太くしたほうがネジを回しやすい。それとおんなじということで良いのだろうか?

Bluetooth

Bluetoothのこと、なんにも知らなかったのでお勉強。

Bluetoothとは、今まで線で繋がれていたものを無くして、そのかわりに無線で通信する技術である。そのため、色々なプロファイルがある。今回は、Bluetoothでシリアル通信をしたいのでSPPモードで通信する。

Android

Bluetooth

Bluetoothでの通信部分はサンプルのBluetoothChatを参考にした。タンク側から返信されてくる値をCRLFで区切りとしたので、そこの部分のコードを変更。

SeekBar

SeekBarは0から511。タンク側では0はブレーキを意味していて、1から511までがパラメーターである。

ただ、511でフルパワー出力すると、TA7291Pの電圧降下分から約4.5ボルトくらいになるらしい(よくわからないけど、テスターで測った結果)。しかし、FA-130モーターは1.5ボルトから3.0ボルトでの使用が適切である。

そのため、最大でも3ボルトであろう出力をAndroidで計算させる。タンクで出力を絞るよりも、タンクは値を受け取って出力するだけにしたほうが、Arduino側はシンプルだし複雑なのはAndroidでやらせることができる。

通信

送信したら相手からの返信を待つ。返信が来るまで送信出来ないとする。送信した値が返信を待たないで送信した値同士とで混ざってしまうことで上手く操縦できなくなるため。

とはいえ、操縦には停止などの急に操作する必要のあるコマンドも存在する。返信を待っている間にSeekBarを操作したら、返信がやってきた時に現在のSeekBarの値を再送信する必要がある。

改善したい部分

つくってて、ここの部分不便だと思ったことや、改善出来ないか思った部分。

  • 006P電池を買うのがめんどくさい。使わないようにどうにかならないのか?
  • Androidから操作する際に、声とかユニークな方法で操作できないか?
  • Arduinoが大きすぎるので、AVRで同じことが出来ないだろうか?

ラジコンを作るだけなのに、Arduinoでのプログラミングとか、AndroidとBluetoothでの通信とか、電子回路などなど、色々な勉強をできた。面白い。

ソースコード・基盤

シールド基盤

各自購入してくださいな。(Fritzingで行ってますが、プリント基板ならば安いところ探してエクスポートするのもありかもしれません)

http://fritzing.org/projects/tekimen-tank

コントローラー側

https://github.com/youkidearitai/arduino-tank-controller

アプリリリースしました

Get it on Google Play

Arduino側スケッチ

https://github.com/youkidearitai/arduino-tank-receiver