2010年12月9日木曜日

5.1 つっつくと動く三輪車




車体をつっつくと動くしかけを作ることにした。車体は前回と同じ三輪車。
センサーは3軸の加速度センサーを使う。車体に直接取り付けようかと思ったが、目立ちやすいように棒を立ててその先にセンサーを取り付けた。
センサーの出力をオシロで見たところ、棒の先につけたので動きが大きくなっており、つっつくと出力が最大値・最小値になることが判明。突っついた方向に向かって動いていくことにし、X軸とY軸の出力の組み合わせで以下のように動きを決めた。
X軸 Y軸 動作
最小 -  前進
最小 最大 右前
最小 最小 左前
最大 -  後退
最大 最大 右後
最大 最小 左後
-  最大 右回転
-  最小 左回転

ソフトウエア
メインループで1ms毎にセンサーの値をAD変換してチェックする。4回連続してX・Yどちらかが最大値または最小値となったらつつかれたと判断し、モーターを1秒間駆動する。駆動中はセンサーはチェックしない。

つっつきの反応
前進・後退・右回転・左回転はうまく反応するが、右前・左前・右後・左後はたまにしか反応しない。X・Y両方が最大値・最小値という組み合わせが起きにくいということだが、調整するほどでもないのでこのままにしておく。

孫の反応
残念ながらあまり興味を持った様子はない。ちょっと突っついてはみたがそれよりもレゴテクニックのバイクやフォークリフトで遊んだり、ブロックで車を作ったりするほうが面白いようである。

2010年12月3日金曜日

5.0 リモコンで動く三輪車




三輪車が偽バイクと同じようにリモコンで動く仕組みを組み込んだ。
また、リモコンの操作イベントをタイムスタンプつきで記録し、それを再生することで記録時と同じ動きを再現できるようにした。
PICにはEEPROMがあるので、操作イベントを4セットEEPROMに記録しておき、それを呼びだして動作を再現する仕組みも組み込んだ。

イベントの時間管理
最初のイベント発生からの絶対時間で管理する。時間の精度は40msとした。時間管理のタイマーは8ビットなので、タイマーが255(約10秒)になったらタイマーオーバーフローを示すイベントを記録し、タイマーを0にリセットする。

記録データフォーマット
1つのイベントを2バイトで記録する。1バイト目は時間を示すタイマー値、2バイト目はコマンドコード。
タイマーオーバーフローのイベントは、0xff, 0xffとする。
イベントの終了を示すため、0xff, 0xfeを最後に記録しておく。

孫の反応
最初はテーブル歩きの車体で動かしてみたところ、あまり気に入らない様子であった。次回は超音波センサーを取り外して多少スッキリした車体にしてみたところ、リモコンを離さず動かして遊んでいた。車体の形で好き嫌いにかなり差があるらしい。

1.2 テーブル歩き修正版




久しぶりに最初に作った三輪車に戻ることにした。
テーブル歩きは角が丸いテーブルなら上手に歩けるが、角がシャープな四角いテーブルだと落ちてしまうことがあったので、まず四角いテーブルでも落ちないように制御を修正することにした。

バージョン2
テーブルの端に来た時、車体の向きがテーブルの端と直角になる方向に後退し、反対方向に回転するようにした。これでほとんど落ちることはなくなったがたまに落ちる。

バージョン3
テーブルの端に来た時、テーブルの端に対してできるだけ直角の角度で後退するよう、回転しながらの後退と前進を繰り返すようにした。落ちることはなくなったが、無駄な動きが多く同じところを行ったり来たりするので美しさは劣る。

孫の反応
動かして見せたところ、ちょっと見た後「もういい」と言って自分でスイッチを切って止めてしまった。どうもこのボディの動きは気にいらないらしい、、、。