*目次 [#l128b0a2] #contents *課題 [#w780b81c] **黒い線に沿って動くロボット [#nd37b6f5] 各チームで作成したコースに沿って動くロボットを作成する。ただし、 交差点で優先側を走っていない場合には、一時停止すること~ 前方にあるもう一台のロボットに接触した場合には停止して相手のロボットが行き過ぎる、あるいは距離が離れるのを待つこと~ ~コースを2周したら自動的に止まること~ **課題を行うにあたって [#i1fea5d3] 以下の動作をするロボットを製作する~ ・光センサーを用い、進行状況に応じて方向を変える~ ・タッチセンサーによって他のロボットとの接触を感知する~ ・交差点の数を認識し、2周すると自動で停止する ~ *コース [#y7284442] #ref(4.jpg) 急なカーブもなく、走りやすいラインです。優先道路も二機とも通るようにしてあります。~ 最初はラインの幅が狭く、光センサの誤認が多かったので、その後ラインの幅を太く改善しました。~ 写真は改善後のものです。~ *ロボットの説明 [#l5de41a5] **全体 [#m3cb6487] 今回の課題は小刻みの方向転換を繰り返すことを想定して補助輪を作成、使用。~ パーツも極力少なくし、軽量化を意識しました。~ ラインを挟むように光センサーを左右に取り付け,これによってロボットがラインから外れるのを防止し、スムーズにカーブを曲がることができます。~ マジックによる光の反射を考慮して光センサーを出来るだけ車体の中心に近づけ、コースに光センサーが触れたら直ぐに反応できるようにしました。 ~ こちらは試作一号機 こちらが二号機です ~&ref(081127_1728~01.jpg); &ref(2.jpg); 【一号機】 ~補助輪による滑らかな旋回を予定していましたが、後輪が自由に動いてしまい車体をプログラム通りに操縦するのが困難であった。 ~【二号機】 ~車体を安定して操縦できるように、四輪に変更しました。四輪にしたことで、車体自体が安定して、タッチセンサーと光センサーの補強も同時にできました。 **横から見た状態 [#u26eb9fb] やや斜めからの撮影となっていますが、横の図です。 ~ こちらは試作一号機 こちらが二号機です ~&ref(081127_1729~01.jpg); &ref(1.jpg); 【一号機】 ~車輪は大振りのものを利用し、モーターに直接接続してしまったので、スピードがかなりでました。スピードの出すぎにより、光センサーが機能しなかった。 ~【二号機】 ~車輪は大振りなものから小さめの車輪を利用し、基本形にもどしました。これにより、車体が低くなり光センサーの感知が良くなりました。~ **センサーの部分 [#i5717ab4] 黄色い部品がタッチセンサ、青い部品が光センサです。~ ~ こちらは試作一号機 こちらが改善したもの ~&ref(081127_1730~01.jpg); &ref(3.jpg); タッチセンサの接触部分と土台の所が補強されています。~ *プログラム [#d1b1899a] **プログラムの概要 [#tf3f3f3a] #define T 40 #define Run_time 780 task main() { SetSensor(SENSOR_2,SENSOR_TOUCH); //タッチセンサーを2にセットする。 while(true){ if(SENSOR_2 == 1){ //タッチセンサーが反応する。 stop light; //light内のプログラムを止める。 Off(OUT_A+OUT_C);Wait(50); //機体を静止させる。 OnRev(OUT_A+OUT_C) ; Wait(100); //機体を1秒間バックさせる。 Off(OUT_A+OUT_C);Wait(50); //機体を静止させる。 start light; //light内のプログラムを起動する。 } } } task light() { SetSensor(SENSOR_1,SENSOR_LIGHT); //光センサーを1と3にセットする。 SetSensor(SENSOR_3,SENSOR_LIGHT); ClearTimer(0); while(Timer(0) <= Run_time){ //無限ループ if(SENSOR_1>T){ //光センサが2個とも白紙上にあるとき、直進 if(SENSOR_3>T){ OnFwd(OUT_C); OnFwd(OUT_A); } else{ if(SENSOR_1>T){ //左だけ白紙上にあるとき、右にターン OnFwd(OUT_A); Off(OUT_C); } } } else{ if(SENSOR_3>T){ //右だけ白紙上にあるとき、左にターン OnFwd(OUT_C); Off(OUT_A); } else{ //両方コース上にあるとき、0.5秒静止し、前進 Off(OUT_A+OUT_C); Wait(50); OnFwd(OUT_A+OUT_C); Wait(50); } } } Off(OUT_A+OUT_C); } ~(試作品) *改善点 [#e01bedcb] **プログラムについて [#j2389c07] ~【苦労した点】 ~・main1つだけのタスクを利用して作ろうと思っていたが、タッチセンサーのプログラムを上手く取り込めなかった。旧相方にアドバイスを頂き、サブルーチンのような仕組みでプログラムを組むことで、改善することができました。しかし、初めに作っていたプログラムの中に、新たなプログラムを入れたので、「}」がどこで切れているのか分からなくなり、思いどうりに無限ループさせることができなかった。プログラムするときは「{」と「}」は、文章ごとに列を合わせれば見やすくなると思い、そのように書きました。 ~【工夫した点】 ~・できるだけ説明文を書き、何を行うプログラムなのかを分かりやすくしました。 ~・文章の始めと終わりの括弧を列で合わせました。 ~・関数を使い、「ロボットが停止した回数がX回になったときに止まる」というプログラムを考えたが、タッチセンサーが起動するたびにカウントがリセットされてしまったので、タイマーを使いました。そこで、1周するのにかかる時間を計り、そこから計算して止めるようにしました。 ~【今後の課題】 ~・タイマーを使い、丁度2周で止められるように工夫したい。 ~・作動にエラーが起こらないように、プログラムを関数などを使いよりコンパクトに作りたいです。 ~・要らないプログラムを削ること。 **ロボットについて [#wa74e6a1] ~【苦労した点】 ~・写真のところでも触れたように、一号機を目指してプログラムを組んでいたのでロボットを変えることでプログラムの変更も余儀なくされた。 ~・後輪が自由に回転してしまい、機体の動きが後輪に左右されてしまった。そこで、四輪(二号機)に変えました。 ~【工夫した点】 ~・光センサーを写真のように装着するところ。 ~・ダブルバンパーにすることで、様々な高さの障害に対して反応するようにした。 ~・ダブルバンパーするところで、H字のパーツを使い強度UPを図った。 ~・回転するパーツを、パーツ同士で挟み固定したところ。 ~・四輪にしたことで、タッチセンサーの部分と光センサーの固定を頑丈にすることが出来た。 ~【今後の課題】 ~・四輪にしたため、速度が劣ってしまった。そこで、三輪で安定した動きをしてくれるロボットも作ってみようと思いました。 *コメント [#z71fda3b] コメントをお願いします - コメントのテストです -- [[ハマダ]] &new{2008-11-27 (木) 16:52:52}; #comment