2010年03月21日

ETロボコン2010参戦記(番外編:サウンドセンサを使ってみる)

先日、子供の通う保育園にロボットを持っていったところ好評だったので
もういちど子供たちに見せびらかす科学少年魂を植え付けるために新たなプログラムを構想してみた。

要求事項
・ライントレースはしない
・通常は静止状態で、目の前に手をかざしたら後退する
・手を叩いたり、大きな音を出したらその場から逃げだす
・しばらくしたら静止する
・逃げている最中に前方に障害物があったらよける、または静止する

仕様
・光センサは使用しない
・サウンドセンサを使用する
・超音波センサを使用する
・静止モードと脱走モードを持つ
・静止モードでは走行しない
・静止モードでサウンドセンサに一定以上の入力があったら脱走モードに移行する
・静止モードで超音波センサに入力があったら後退する
・脱走モードでは一定速度で走行し、n秒継続して静止モードに移行する
・脱走モードで超音波センサに入力があったら左右どちらかに曲がる、またはUターンする、または静止モードに移行する

追加仕様(可能なら実現する)
・静止モードから脱走モードに移行する際に、左右をきょろきょろする
 (驚いて周りを見回すイメージ)
・脱走モードでサウンドセンサに入力があった場合、左右どちらかに90度カーブする
 (この場合、超音波センサの入力では静止が望ましい)

センサの確認
というわけで、まずはサウンドセンサにどういう入力値が入るのかをチェック。
ロボットの背中にサウンドセンサを取りつけて、光センサの配線をサウンドセンサに持っていく。
で、nxtway_gsを起動する。
静止状態でのセンサ値は1000前後を示している。
手を叩いたり、大きな声を出すと600〜700程度を示す。
ということでサウンドセンサの入力閾値は700ぐらいかな。

設計する
状態を二つ、静止状態と脱走状態とする。追加でびっくり状態(左右をきょろきょろする)を追加するかも。
脱走状態は3秒継続、サウンドセンサの閾値を700に設定。
脱走状態での超音波センサの検知(30cm)で右に回転する。
回転の継続時間を200ms継続する。

実装する
再びnxtway_gsをベースに改造することで実装する。
サウンドセンサ検知処理は超音波センサ検知処理と同様に OSEK_Task_ts2 で40msおきの起動にしてみた。
また、グローバル変数の定義と実態宣言を別ファイルで行うようにしてみた。

テストする
ロボットにダウンロードして実行してみると、いきなりぐるぐる回り出す。
なんとなく、起動時のサウンドに反応しているようだ。
また、脱走中のモータ音でサウンドセンサ値が500前後を指している。
これは閾値を400に下げておこう。
センサ値チェック時は揺れているだけだったから、モータ音が小さかったらしい。

と、コーディングミス発見。
サウンドセンサチェックの式のはずが、超音波センサチェックの関数を使用していた。単純なコピペミス。
超音波センサの返り値の最大値は255なのにそれが700以下で判定しているから、常に脱走モードになってしまってた。

もうひとつ、静止モードで超音波センサが反応した際に後退するようにしたまま、値をクリアしていなかった。
これじゃ超音波センサが反応しなくなっても後退しっぱなし。

ということで、修正して設計通り動くようになりました。

posted by 岩永 at 00:00| Comment(0) | TrackBack(0) | ソフトウェア | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。