2010年3月末で仕事が終わりになり時間ができたので、3才の孫(男の子)が遊べるおもちゃを作ることにした。動くものに限ると思いあれこれ検討した結果、以前息子用に買ってあったレゴのマインドストームを使うことに決めた。制御は自作することにしてネットでCPUの調査を行い、昔ながらのDIPのパッケージが自作向きなのでPICを使うことにした。 いくつかおもちゃを作成し、自分用のメモを作っておくことにしたがついでなのでブログを作成して公開することにした。 写真と動画を見て笑っていただきたい。 なお、1ページで表示できなくなってきたので、以前のものを見る場合は、このページの最後の「前の投稿」をクリックしてください。
2010年7月19日月曜日
3.0 偽バイク
バイクをつくろうと思いネットでレゴテクニックのバイク(Lego Technic 8291)を購入してあったし、逆立ち2輪車が行き詰ったので、気分転換にバイクを作ることにした。まず説明書通りにダートバイクとチョッパーを作ってみたが、チェーンもついていたりしてけっこう気分が出ているし、手で動かすとエンジンのピストンが動く、など面白い。孫はダートバイクのほうが気に入ったようで、動かしてみたりして遊んでいた。
バイクを立たせることができるかに挑戦する。車輪をモーターで動かし、ハンドルもモーターで動くように車体を作った。ハンドルを切るとボディの重心が左右に移動するので、これでバランスが取れないか試してみる。センサーは逆立ちと同じ超音波を使用。ハンドルを切ると重心が移動するように前輪を作ってみたが、ハンドルを切るとボディが左右に傾くことが発覚、しかも普通に作ると重心の移動と傾きが逆向きになる。重心の移動と傾きが同じ方向になるように前輪を調整してみたが、バイクらしくない形になってしまう。
しかたなく、ハンドルを固定して錘を左右に動かしてバランスをとってみようとした。メカをシンプルにするため、錘を歯車に取り付けて円運動で錘を動かしたところ、錘が左右だけでなく上下に動くので錘の動きがスムーズでなくうまくいかない。
こちらも行き詰ってしまったが、せっかくバイクのボディを作ったので、これを走らせることにした。倒れないように補助輪をつけたので偽バイクとなってしまったが、、、。
コントロールはパナソニックの古いDVDレコーダのリモコンを使うことにした。ネットでリモコンのデータフォーマットを探してみたところすぐに見つかった。次にリモコンの信号を受信する受光素子を探してみたところ、ロームの製品で受光素子とアンプなどが一体になっており、38KHzのキャリアも取り除いてくれてデータがシリアルで出力されるものがあるのを発見。マルツで販売していることもわかり、すぐに調達してきた。
受光素子をボディに取り付ける基板を作成し、ソフトの開発にかかる。今回はやればできることが分かっているので安心して進められた。
ソフトウエア:
メインループでリモコンの信号をチェックし、入力が変化したら処理を行う。リーダー部検出、データ検出、エンドマーク検出を行い、エンドマークが検出されたらデータのコードにしたがって処理を行う。
コントロール:
上下のカーソルキーで前進・後退、決定ボタンで停止、再生ボタンでスピードアップ、停止ボタンでスピードダウンを行う。
左右のカーソルキーでハンドルを左右に動かす。モーターが回り続けないよう、約100msでモーターを停止させる。
孫の反応:
バイクを置いてあるのを見つけると、「バイクやろう」と言ってリモコンを持って動かしている。あまり感動している様子は見えないので、他のしかけも考える必要がありそう。
2010年7月16日金曜日
2.0 逆立ち2輪車
次はやはりスリルがあるものに挑戦したいと思い、2輪車を立たせることにした。ネットを見たところ、新しいレゴのマインドストームでは倒立2輪車が走っておりレースもやっているらしいし、他にも倒立2輪車のキットがあり、スムーズに立ち上がったり歩いたりしていることがわかった。車体をモデル化し、運動方程式を解いて制御しているらしいが、当方はそのような難しいことは苦手なので、いきあたりばったりの制御で立たせることができるかに挑戦することにした。
ボディ:
車輪を2つ平行に配置し、それぞれをモーターで駆動する。モーターの上に枠を作り、そこにPICの基板と電池の基板を取り付けた。枠はピンでつなぐようになっており多少ガタがあるので、補強用のブロックを追加してある。
ハードウエア:
散歩のお供で作成したものをそのまま使用する。超音波の送信機を接続していた端子をセンサーの入力に使うことにした。
センサー:
ボディの回転を検出して制御するよう、ジャイロの角速度センサーを調達し実験してみた。ボディの傾きを知るために角速度を積分してみたが、データの扱いがうまくないためかすぐに発散してしまい使い物にならない。次は加速度センサで実験してみた。ボディの重心付近に加速度センサを90度の角度差で2つ取り付け、ボディの傾きを検出して制御しようとしてみたが、これもうまくいかない。
ボディの動きがギクシャクしているせいなのか、データの扱いがうまくないのか、制御のやりかたがうまくないのかわからないが、いきあたありばったりではうまくいかないかとあきらめようとしたが、散歩のお供で使った超音波が使えるのではないかと思いつき、さっそく実験してみた。
ボディの前後にそれぞれ超音波の送信機と受信機を取り付け、床からの反射音で距離を測定し、ボディの傾きを検出して逆方向に車輪を動かすようにした。センサーをチェックするタイミングやモーターを駆動する強さを調整し、なんとか立たせることに成功した。
ボディがどんな動きをしていてもボディの傾きを直接検出できるので、いいかげんな制御でもなんとか立つことができると思われる。
ソフトウエア:
前と後ろの床からの距離の測定、モーター駆動、が主な処理。
距離測定の間隔はボリュームで設定する、10ms程度に設定してある。距離測定のため、前と後ろ同時に40KHzの超音波を3サイクル送信する。タイマーをスタートし、前と後ろの受信信号でそれぞれ割り込みをかけ、それぞれの割り込みでタイマーの値を記録しておく。両方とも割り込みが完了したら記録したタイマーの値を比べると、小さいほうに傾いていることがわかる。タイマーの値の差をもとにモーター駆動のPWMのデューティーを決める。
傾いた方向と逆に動くよう、モーターを駆動する。左右のモーターは同じ条件で駆動している。
課題:
いいかげんな制御なので、立つのがやっとという状況である。ちょっとつつくと倒れるし、歩かせようとしてみてもすぐに倒れてしまう。
また、床からの距離でボディの傾きを検出しているため、床が平らでないと立てないし、カーペットだと超音波が反射せず立てない、などの難点もある。
少し勉強して改善できるか再挑戦してみる予定。
孫の反応:
動かそうとしてみたところ、なにやら気もち悪そうな顔つきだったので、「これは走らないから大丈夫だよ」と言って動かしたところ、「あっ立った立った」「すごいねえ」と喜んでくれた。良かった良かった。
2010年7月15日木曜日
1.1 テーブル歩き
散歩のお供で作ったボディで何か他のことができないか考えてみた。部屋の中を勝手に動き回って障害物に近付いたら避けてぶつからずに歩く、というのも考えたが、これでは平凡でつまらないので、もうひとひねりしてテーブルの上を勝手に歩き回り、端っこにきたら後ろに下がり落そうで落ちない、というのを作ることにした。
センサーは同じ超音波を使用する。散歩のお供では前の車からの超音波を受信するため受信用のセンサーは前方を向けていたが、今回は床(テーブル)との距離を測定するため、センサーの取り付け部を回転させてセンサーが下を向くようにする。前輪の前方・外側のテーブルの距離を測定できるよう、送信機・受信機のセットを左右に配置し、位置も前輪の前方・外側になるよう調整した。
ソフトウエア:
散歩のお供のソフトを修正。動く方向の決定、テーブルとの距離の測定、車輪の駆動、が主な処理。
動く方向は前進のみとし、直進・右・左を一定間隔(約1秒)毎に乱数で決定する。テーブルとの距離の測定は、右・左それぞれ超音波送信の一定時間後に反射音の入力をチェックし、入力がONならテーブル上、入力がOFFならテーブルからはずれた、と判断する。
左右ともテーブル上にある場合は乱数による方向にしたがって車輪を駆動し、左右いずれかがテーブルから外れた場合は約1秒間後退し、その後外れた方向と反対側に動くようにする。
これでなんとか落ちずに歩き回るようになったが、テスト中に油断していたら落ちてしまいボディがバラバラになってしまったこともあり、とてもスリルがあって面白かった。
丸いテーブルならほとんど落ちることなく歩き回るようになったが、四角くて角のあるテーブルだと角の部分に向かっていくと逃げ場を失って落ちることがある。
センサーは同じ超音波を使用する。散歩のお供では前の車からの超音波を受信するため受信用のセンサーは前方を向けていたが、今回は床(テーブル)との距離を測定するため、センサーの取り付け部を回転させてセンサーが下を向くようにする。前輪の前方・外側のテーブルの距離を測定できるよう、送信機・受信機のセットを左右に配置し、位置も前輪の前方・外側になるよう調整した。
ソフトウエア:
散歩のお供のソフトを修正。動く方向の決定、テーブルとの距離の測定、車輪の駆動、が主な処理。
動く方向は前進のみとし、直進・右・左を一定間隔(約1秒)毎に乱数で決定する。テーブルとの距離の測定は、右・左それぞれ超音波送信の一定時間後に反射音の入力をチェックし、入力がONならテーブル上、入力がOFFならテーブルからはずれた、と判断する。
左右ともテーブル上にある場合は乱数による方向にしたがって車輪を駆動し、左右いずれかがテーブルから外れた場合は約1秒間後退し、その後外れた方向と反対側に動くようにする。
これでなんとか落ちずに歩き回るようになったが、テスト中に油断していたら落ちてしまいボディがバラバラになってしまったこともあり、とてもスリルがあって面白かった。
丸いテーブルならほとんど落ちることなく歩き回るようになったが、四角くて角のあるテーブルだと角の部分に向かっていくと逃げ場を失って落ちることがある。
1.0 散歩のお供
何を作るかあれこれ考えたが、孫の後をついてくる車に決定。センサーはラジコンの無線も検討したが方向の検出が面倒そうなので、超音波を使うことにした。
孫が小さい車を引っ張って歩くとその後をもう1台の車がついてくる、という構成にした。
小さい車は定期的に超音波を送信し、後ろの車がそれを左右2つのセンサーで受信して左右の時間差で方向を検出する。また、後ろの車も超音波を送信し、前の車からの反射音が戻ってくるまでの時間で車の間の距離を測定する。距離がある程度(30cmくらい)に近付くとそこで止まるようにした。
ボディ:
送信側(小さい車)は受信側(後ろの車)からの超音波を反射しやすいように後面と側面後部を平らな面にし、小さい車輪をつけてひもで引っ張るようにした。
受信側は前輪2輪を別々にモーターで駆動する。後輪は曲がりやすくするために1輪とした。後輪が左右に曲がり、車輪がスムーズに回転し、しっかりボディに固定できる形を作るのに結構苦労した。
ハードウエア:
送信側は8ピンのPIC12F683を使用。単4電池2本から5Vに昇圧する電源とPICの他は超音波の送信機をドライブする部分にコンデンサが1つつくだけのシンプルな構成。
受信側は28ピンのPIC18F2431を使用。電源部、PIC、超音波センサー用のアンプ2チャンネル、モーター駆動用のIC(TA7291P)2つ、状態表示用のLED、設定用のボリュームとスイッチ等がある。
電源はPIC用は単4電池2つから5Vに昇圧、モーター用には別の基板に単3電池を4本用意し、ケーブルで接続する。
ソフトウエア:
送信側はPICの理解も兼ねアセンブラで作成した。超音波の発生はソフトのループで行う。
200ms毎に40KHzの超音波を50サイクル発生する。
受信側はCで作成。送信側からの超音波の受信と方向検出、超音波発生と反射音の受信による距離測定、モーター駆動、が主な処理。
方向測定は2つの超音波入力で割り込みをかけ、最初の割り込み時に右だけONなら右、左だけONなら左、両方ONなら中央と判断する、角度は気にしない。また、200ms以上受信信号が来ない場合は方向未定とする。
距離測定用の超音波発生は送信側と同じようにソフトで40KHzの超音波を10サイクル発生する。一定時間(約1ms)後に超音波入力をチェックし、左右どちらかがONなら距離近接と判断する。このアプリケーションでは左右同時測定で問題ないが、次のアプリケーションで左右別々に距離の測定を行う必要が生じたので、このアプリケーションでもまず右の距離を測定し、次に左の距離を測定している。
モーター駆動は、方向不明または距離近接なら停止、方向右なら左だけ駆動、方向左なら右だけ駆動、方向中央なら左右を駆動とする。
動作時に壁などに近付いて止まってしまうことがあり、ここからの救出のため距離近接時に送信側の方向が変化したら少し後ろに下がるようにした。壁で止まってしまったら壁と受信側の車の間に送信側の車を通すと、受信側がいったん後退しその後また送信側を追いかけてくる。
孫の反応:
クネクネ動くのが気持ち悪いのか、追いかけてくるのが怖いのか、「いやだいやだ」「やめてやめて」と言って逃げてしまった、、。嫌われてしまったがめげずに製作をつづけることにする。
開発環境
登録:
投稿 (Atom)