Arduino Tank

「Arduino Tank」の編集履歴(バックアップ)一覧に戻る

Arduino Tank - (2013/08/12 (月) 18:58:24) のソース

*はじめに
ArduinoとXBeeとモーターシールドを使ってラジコンを作ろうと思う。ラジコンのソースコードは今後Arduinoを用いた動くおもちゃを作る際の動作確認に利用する事が出来る。また、XBeeによる無線通信とモーターの制御を組み合わせた最も基本的な工作のひとつであるため、ソースコードやノウハウを他の工作に生かす事ができると考える。

*Arduino Tankの機能
-無線により操作が可能
-一本のスティックで操作が可能
-スティックを倒した方向に進む(角度は無段階)
-スティックを倒した角度に比例してスピードが変化(1chにつき255段階)
-超信地展開が可能(左右のキャタピラーを逆方向に回す事によりその場で回転)

*車体側
**車体側の機能
-無線により値を受け取る事で動作
-左右のキャタピラーがそれぞれ比例制御が可能(8bit-255段階)

**ハードウェアの構成
-キャタピラー(タミヤ工作キット)
-ギアボックス([[タミヤダブルギアボックス>http://www.tamiya.com/japan/products/70168double_gearbox/index.htm]])
-シャーシ(タミヤユニバーサルプラスチック基盤)
-マイコン(Arduino Uno)
-モータードライバー([[Ardumoto>http://www.switch-science.com/catalog/427/]]: Arduinoのシールドの一種)
-通信モジュール(XBee Series2)

#ref(ArduinoTank.jpg)

**ハードウェアの説明
タミヤ工作キットのキャタピラー工作キットとダブルギアボックスを組み合わせて駆動系を作った。また、シャーシはタミヤユニバーサルプラスチック基盤で作った。マイコンはArduino Unoを用いており、モータードライバーにはArdumotoを利用している。また、ArduinoとXbeeはArduino → XBeeは分圧抵抗により電圧を落としている。XBee→Arduinoはそのまま入力を行っている。本来はロジックレベル変換レベル変換を行うべきであるが、現状で動作している。(XBeeに5Vを入力してしまうと壊れるので注意)

**ソフトウェアの説明
XBeeから3Byteのデータを受け取り、それを2系統の8bit出力と1bitの回転方向に変換し、Ardumotoに出力する事でモーターの制御を行っている。

#ref(スティックコントローラー.jpg)
*スティックコントローラー側
**スティックコントローラーの機能
-スティックを倒した方向に応じて、2つのキャタピラー出力に変換し無線送信する
-スティックを押す事で超信地旋回するモードとしないモードに切り替わる(超信地旋回するモードの場合には緑LEDが点灯)

**使用した部品
-[[Arduino Fio>http://arduino.cc/en/Main/ArduinoBoardFio]]
-XBee
-LiPoバッテリー
-[[アナログジョイスティック>http://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-07RM]]
-LED × 2(赤, 緑)
-ブレッドボード

**ハードウェアの説明
Arduinoのアナログ入力0, 1にジョイスティックのX軸とY軸を接続し、AD変換を行っている。また、D2ピンにボタンを接続し、スイッチが押された場合はGNDレベルに落ち、割り込みが発生するようになっている。D2ピンとスイッチに関しては 10KΩのプルアップ抵抗が取り付けられている。またD3とD5ピンにLEDが取り付けられており、PWMにより明るさの調整が可能になっている。

**ソフトウェアの説明
XY座標により入力されるデータを2つのモーター出力に変換している。変換のために極座標に飛ばし、角度θにより左右のモーター出力の係数を出力する関数を記述し、それをベクトルの大きさRと掛け合わせる事でモーター出力を得ている。またスイッチによりモードの切り替えを行い、モード0(超信地旋回あり)とモード1(超信地旋回しない)で別の関数を呼び出している。データは現在100ms毎に送信を行っている。チャタリング対策に関してもソフトウェア的に行っている。一旦ボタンが押された場合は500ms割り込みを無視するように設定されている。

*実験
Arduino Tank Ver0.1と合わせて動作実験を行い、意図した通りに動作している事を確認した。ただし、通信エラーが発生する事がある。通信エラーはPCの近く等電磁波が発生していると考えられる場所、および走っている途中で発生している。現在はデータの送信周期は100msになっているが、遅くしすぎるとレスポンスが悪く、速くしすぎると通信エラーが頻発する。

*今後の課題
-通信モジュールのテスト(どういった場合にエラーが発生するか)
-一定時間データが来ない場合に停止するような実装(車体側で一定時間データが来ない場合タイマー割り込みにより出力を0にする実装)

#ref(Arduinoラジコン完成版.jpeg)
最終的にこうなった(苦笑)