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