2010年7月16日金曜日

2.0 逆立ち2輪車




次はやはりスリルがあるものに挑戦したいと思い、2輪車を立たせることにした。ネットを見たところ、新しいレゴのマインドストームでは倒立2輪車が走っておりレースもやっているらしいし、他にも倒立2輪車のキットがあり、スムーズに立ち上がったり歩いたりしていることがわかった。車体をモデル化し、運動方程式を解いて制御しているらしいが、当方はそのような難しいことは苦手なので、いきあたりばったりの制御で立たせることができるかに挑戦することにした。

ボディ:
車輪を2つ平行に配置し、それぞれをモーターで駆動する。モーターの上に枠を作り、そこにPICの基板と電池の基板を取り付けた。枠はピンでつなぐようになっており多少ガタがあるので、補強用のブロックを追加してある。

ハードウエア:
散歩のお供で作成したものをそのまま使用する。超音波の送信機を接続していた端子をセンサーの入力に使うことにした。

センサー:
ボディの回転を検出して制御するよう、ジャイロの角速度センサーを調達し実験してみた。ボディの傾きを知るために角速度を積分してみたが、データの扱いがうまくないためかすぐに発散してしまい使い物にならない。次は加速度センサで実験してみた。ボディの重心付近に加速度センサを90度の角度差で2つ取り付け、ボディの傾きを検出して制御しようとしてみたが、これもうまくいかない。
ボディの動きがギクシャクしているせいなのか、データの扱いがうまくないのか、制御のやりかたがうまくないのかわからないが、いきあたありばったりではうまくいかないかとあきらめようとしたが、散歩のお供で使った超音波が使えるのではないかと思いつき、さっそく実験してみた。
ボディの前後にそれぞれ超音波の送信機と受信機を取り付け、床からの反射音で距離を測定し、ボディの傾きを検出して逆方向に車輪を動かすようにした。センサーをチェックするタイミングやモーターを駆動する強さを調整し、なんとか立たせることに成功した。
ボディがどんな動きをしていてもボディの傾きを直接検出できるので、いいかげんな制御でもなんとか立つことができると思われる。

ソフトウエア:
前と後ろの床からの距離の測定、モーター駆動、が主な処理。
距離測定の間隔はボリュームで設定する、10ms程度に設定してある。距離測定のため、前と後ろ同時に40KHzの超音波を3サイクル送信する。タイマーをスタートし、前と後ろの受信信号でそれぞれ割り込みをかけ、それぞれの割り込みでタイマーの値を記録しておく。両方とも割り込みが完了したら記録したタイマーの値を比べると、小さいほうに傾いていることがわかる。タイマーの値の差をもとにモーター駆動のPWMのデューティーを決める。
傾いた方向と逆に動くよう、モーターを駆動する。左右のモーターは同じ条件で駆動している。

課題:
いいかげんな制御なので、立つのがやっとという状況である。ちょっとつつくと倒れるし、歩かせようとしてみてもすぐに倒れてしまう。
また、床からの距離でボディの傾きを検出しているため、床が平らでないと立てないし、カーペットだと超音波が反射せず立てない、などの難点もある。
少し勉強して改善できるか再挑戦してみる予定。

孫の反応:
動かそうとしてみたところ、なにやら気もち悪そうな顔つきだったので、「これは走らないから大丈夫だよ」と言って動かしたところ、「あっ立った立った」「すごいねえ」と喜んでくれた。良かった良かった。

0 件のコメント:

コメントを投稿