2008b/MemberOnly/進行状況A

目次

課題

''●各チームで作成したコースに沿って動くロボットを作成せよ● ''・・・ただし
・速さと正確さを追求すること
・交差点で優先側を走っていない場合には、一時停止すること
・前方にあるもう一台のロボットに接触した場合には停止して相手のロボットが行き過ぎる、あるいは距離が離れるのを待つこと
・コースを2周したら自動的に止まること

ロボットの紹介

摩擦の関係上三輪車に変更。前方にぶつかった時のためのタッチセンサーを設置。そのすぐ後ろに線を認識するための光センサーを設置。

図解

CIMG4130.JPG

全体図

CIMG4131.JPG

タッチセンサーバンパーにもう一方のロボットが接触すると行ったんバックしてまた進む形になっている。

CIMG4132.JPG

抵抗を少なくするため三輪に改造。補助輪。

CIMG4133.JPG

光センサー。 左右に取り付けたひかりセンサーでマジックの黒い線と真っ白な紙を認識し、黒を認識すると線に沿って曲がる。この原理を利用して線に沿ってロボットは動くことができる。

工夫点

はじめに問題点としては、摩擦である。今までどうりの四輪だと摩擦が強く小回りが利かないため、三輪に改造することにした。今までのマシンからタイヤを二つ外し、三つ目のタイヤに小さめの物を装着し、補助タイヤとすることで摩擦の問題は解決した。さらにもう二つのタイヤも小さな物に変えることのよりスピードを上げることにも成功。だが、スピードを上げるたため、安定性が無く残念なほど暴走気味に走るようになってしまった。そのため、結局スピードは断念して安定性をとることのし、ギアを変更。その結果スピードは無いが安定したマシンが完成実際走らせてみると光りセンサーの幅が広すぎてうまくいかなかったため、幅を調整。しかしまた問題発生。後は相手にぶつかった時のためのタッチセンサーを前方に装着。これは特に問題なく終了。

作成プログラム

#define RUN_TIME 1500
#define L1 45
#define L3 45

task main() {

    SetSensor(SENSOR_2,SENSOR_TOUCH);
    
    SetSensor(SENSOR_1,SENSOR_LIGHT);
    SetSensor(SENSOR_3,SENSOR_LIGHT);
    //センサーセット。2がタッチ、1、3が光/
    
    ClearTimer(0);
   
    int runtime=RUN_TIME,tim2=-5;/最初はTimer(0)-tim2の差を5にしたいため、初期値は−5/
    OnRev(OUT_A+OUT_C);
    
    
    while(Timer(0)<=runtime){
                             if((SENSOR_1<=L1 && SENSOR_3<=L3 && (Timer(0)-tim2>10)) || (SENSOR_2==1)){
                                                   //両方が黒線に乗るか、タッチセンサーが入ったとき
                                             //停止し、バックし、その分の時間追加で動けるようにする  
                                                      ClearTimer(1);
                                             Off(OUT_A+OUT_C);
                                             Wait(50);
                                    OnFwd(OUT_A+OUT_C);
                                    Wait(30);
                                     Off(OUT_A+OUT_C);
                                             Wait(50);
                                    tim2=Timer(0);
                                      
                                            runtime=runtime+Timer(1);
                                             
                             }
                             else if((SENSOR_1<=L1)&&(SENSOR_3>L3)){
                                             //センサー1のみ黒線のとき
                                            //タイヤを片方ストップさせる
                                             Off(OUT_C);
                                             OnRev(OUT_A);
                             }
                             else if((SENSOR_3<=L3)&&(SENSOR_1>L1)){
                                             //センサー3のみ黒線のとき
                                            //同じくタイヤを片方ストップ
                                             Off(OUT_A);
                                             OnRev(OUT_C);
                             }
                             else if(SENSOR_1>L1 && SENSOR_3>L3){
                                           //両方白線のとき
                          //直進させる
                                                                  OnRev(OUT_AOUT_C);
                             }
    }
    Off(OUT_A+OUT_C);

}

                                             

両方のセンサーが白い紙を認識していると、直進する。両方のセンサーが黒い線を認識すると一旦バックして、その黒い線を超えるための時間の間、また直進する。 バンパーがもう一方のロボットに接触すると、一旦バックし、また直進する。 片方のセンサーが黒い線を認識し、もう一方が白い紙を認識すると、黒い線を認識したセンサーの方向へカーブする。カーブするときは内輪がバックし、外輪が停止している。2周を超すためにRUN_TIMEを多めに1500にした。

                             
                                             

プログラムの工夫点

実際走らせてみると、そのとき、たまたまペンがなかったため、行き止まりの部分を広くのばすことができなかった。そこで交差する道を認識するといったんバックして、直進する時間によって、交差する道を通過することにより、コース通りに進むことにした。 その試行中、バックした後、直進してから、また同じ所を認識し、またバックしてしまったので、直進する時間を長くすることによってコース通りに走ることができるようになった。また何度も走らせることにより、ギアやタイヤを変更したためプログラムの調整が思ったより難しかった。

コースの写真

コース.JPG

コースの紹介

一見単純なコースに見えるがカーブが急だったり、コースとコースの間が狭い場所があったりと実際に走らせてみると意外に難しいコースになっていた。一時停止場所は横に線を入れずにプログラムでなんとかした。

「よろしければコメントをお願いします」



添付ファイル: fileCIMG4133.JPG 257件 [詳細] fileCIMG4132.JPG 227件 [詳細] fileCIMG4131.JPG 256件 [詳細] fileCIMG4130.JPG 237件 [詳細] fileコース.JPG 268件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-01-13 (火) 16:25:36 (3875d)