[[2018a/Member]]
#contents
*課題2 [#k917450e]
#ref(2018a/Member/yama/Mission2/課題2の図.png,50%)
Aをスタート

Bを直進

Cで一時停止の後、直進

Dで一時停止の後、Xの空き缶をキャッチしてD地点に戻る

DからEに向かい、Eを直進

Fを左折

Gで一時停止の後、左折

Hで一時停止の後、右折

Iで一時停止の後、右折

Lを直進

Kを直進

Jで一時停止の後、空き缶をYに置きてJに戻りBに向かう

Bで一時停止の後、左折

Aで停止
*ロボット [#c64d1868]
#ref(2018a/Member/yama/Mission2/ロボット2全体.jpg,50%)
ロボットは小回りが利くように小さめに作った。ライトセンサーも車輪の近くにつけた。
#ref(2018a/Member/yama/Mission2/ロボット2アーム.jpg,50%)
缶をつかむのはアーム型にした。アームが閉じすぎてしまってもいいように、左右の高さを変えた。また、アームが重たくてバランスが悪かったので下に支えをつけた。

*プログラミング [#h6e08c3d]
**define [#s00c7340]
 #define shiro_made SetSensor(SENSOR_2,SENSOR_LIGHT);OnFwd(OUT_AC);until(SENSOR_2>=49); Off(OUT_AC);Wait(20);  //白まで進む
 #define kuro_made OnFwd(OUT_AC);until(SENSOR_2<=42);Off(OUT_AC);Wait(20);  //黒まで進む
 #define sasetu OnFwd(OUT_C);OnRev(OUT_A);Wait(45);Off(OUT_AC);  //左回転90度
 #define usetu OnFwd(OUT_A);OnRev(OUT_C);Wait(45);Off(OUT_AC);     //右回転90度
 #define tukamu OnFwd(OUT_B);Wait(5);Off(OUT_B);    //アームを閉じる
 #define hanasu OnRev(OUT_B);Wait(5);Off(OUT_B);    //アームを開く

**ライントレースと交差点 [#i9411a74]
ライントレースは5段階に分けた。3段階で分けた場合では、前に進まなかったり半径の小さい円を曲がりきることができなかった。

ライントレースは、ライトセンサーで地面の色を判断しながら行う。ライトセンサーは0から100までの値で色の明るさを図る。数字が大きいほど明るい色である。
 sub line1()  //左側
 {
    SetSensor(SENSOR_2,SENSOR_LIGHT);
    ClearTimer(0);              //タイマーをリセット
    while(FastTimer(0)<28){          //タイマーが0.28秒になるまで括弧の中を続ける
    
     if(SENSOR_2>=51){           //ライトセンサーが51以上(白のとき)の時
    OnFwd(OUT_A);
    OnRev(OUT_C);          //右に旋回
    Wait(5);
    Off(OUT_AC);
    ClearTimer(0);        //タイマーリセット 
    }
 
    else if(SENSOR_2>=48){       //ライトセンサーが51未満48以上(少し黒の白)の時
    OnFwd(OUT_A);        //左側の車輪だけを前進し少し右へ
    Wait(5);
    Off(OUT_AC);
    ClearTimer(0);               //タイマーリセット
    }
    
    else if(SENSOR_2>=43){       //ライトセンサーが48未満43以上(黒と白の真ん中)の時
    OnFwd(OUT_AC);        //前進
    Wait(5);
    Off(OUT_AC);
    ClearTimer(0);               //タイマーリセット
    }
 
    else if(SENSOR_2>=41){       //ライトセンサーが43未満41以上(少し白の黒)の時
    OnFwd(OUT_C);                //右側の車輪だけを前進させ少し左へ
    Wait(5);
    Off(OUT_AC);
    }
    
    else{                        //ライトセンサーが41未満(黒のとき)の時
    OnFwd(OUT_C);
   OnRev(OUT_A);                 //左に旋回
    Wait(5);
    Off(OUT_AC);
      }
    }
 }
左側のライントレースは、もし地面が「白」だったら右に旋回、「少し黒の白」ならば左側の車輪だけを前進し少し右へ、「黒と白の真ん中」なら直進、「少し白の黒」なら右側の車輪だけを前進させ少し左へ、「黒」だったら左に旋回して線に沿って進むようにした。「黒」以外では毎回タイマーをリセットしているので、結果的に黒が連続した時間が得られ、それを判断基準に使っている。直線の場合は0.28秒以内に「黒」から出るので、タイマーがリセットされタイマーが0.28秒を超えることが無いのでライントレースを続ける。しかし、交差点の場合では「白」に出ようとするが、「黒」が続きタイマーがリセットされずに0.28秒を超えるのでライントレースを終了させ停止する。
左側のライントレースは、もし地面が「白」だったら右に旋回、「少し黒の白」ならば左側の車輪だけを前進し少し右へ、「黒と白の真ん中」なら直進、「少し白の黒」なら右側の車輪だけを前進させ少し左へ、「黒」だったら左に旋回して線に沿って進むようにした。「黒」以外では毎回タイマーをリセットしているので、結果的に黒が連続した時間が得られ、それを判断基準に使っている。直線の場合は0.28秒以内に「黒」から出るので、タイマーがリセットされタイマーが0.28秒を超えることが無いのでライントレースを続ける。しかし、交差点の場合では「白」に出ようとするが、「黒」が続きタイマーがリセットされずに0.28秒を超えるのでライントレースを終了させ停止する。このように交差点を判断する。


左側を走るライントレースと同じように右側も作った。
 sub line0()  //右側
 {
    SetSensor(SENSOR_2,SENSOR_LIGHT);          //左側のライントレースと同様
    ClearTimer(0);
    while(FastTimer(0)<28){
    
     if(SENSOR_2>=51){
    OnFwd(OUT_C);
    OnRev(OUT_A);
    Wait(5);
    Off(OUT_AC);
    ClearTimer(0);
     }
 
    else if(SENSOR_2>=48){
    OnFwd(OUT_C);
    Wait(5);
    Off(OUT_AC);
    ClearTimer(0);
    }
    
    else if(SENSOR_2>=43){
    OnFwd(OUT_AC);
    Wait(5);
    Off(OUT_AC);
    ClearTimer(0);
     }
 
    else if(SENSOR_2>=41){
    OnFwd(OUT_A);
    Wait(5);
    Off(OUT_AC);
    }
    
    else{
    OnFwd(OUT_A);
   OnRev(OUT_C);
    Wait(5);
    Off(OUT_AC);
      }
    }
 }
waitを少しの時間だけ途中に入れることで、動作の連続にならず、動きがスムーズになった。

**プログラム [#n5168aed]
 task main()
 {
    SetSensor(SENSOR_2,SENSOR_LIGHT);
    
    kuro_made;       //スタートしてから黒がくるまで進む
    shiro_made;   //白になるまで進む
    
    line1();    //左側のライントレース
    Wait(100);   //1秒間停止
    shiro_made;    //白になるまで進む,{「C到着」
交差点で止まったら白まで直進し、再びライントレースをやることによって進んでいく。
    line1();    //左側のライントレース
    shiro_made;    //白まで進む
    Wait(50);
直角に曲がるときは、ただ旋回するだけではうまくいかなかったので、一度直進してから反対側のライントレースをすることで、うまく曲がれた。
    line0();     //右側のライントレース,「D到着」
    Wait(100);  //1秒間停止
 
    tukamu;   //アームを閉める
    Wait(100);   //1秒間停止
 
    sasetu;   //左旋回90度
    sasetu;      //左旋回90度
    shiro_made;  //白まで進む
    Wait(100);   //1秒間停止
    line1();    //左側をライントレース,「E到着」
 
    shiro_made;   //白まで進む
    line1();   //左側をライントレース,「F到着」
    Wait(100);   //1秒間停止
 
    sasetu;    //左旋回90度
    line1();    //左側をライントレース,「G到着」
    Wait(20);
    shiro_made;   //白まで進む
    line0();     //右側をライントレース
 
    Wait(20);
 
    shiro_made;   //白まで進む
    line1();     //左側をライントレース
    Wait(20);
 
    shiro_made;   //白まで進む
    line0();     //右側をライントレース
 
    Wait(100);     //1秒間停止
    shiro_made;   //白まで進む
    line1();   //左側をライントレース,「H到着」
    Wait(100);    //1秒間停止
 
    usetu;      //右旋回90度
    usetu;           //右旋回90度
    shiro_made;   //白まで進む
    line0();     //右側をライントレース
    Wait(100);   //1秒間停止,「I到着」
 
    line0();   //右側をライントレース,「L到着」
     
    shiro_made;  //白まで進む
    line0();   //右側をライントレース,「K到着」
 
    shiro_made;  //白まで進む
    line0();    //右側をライントレース,「J到着」
    Wait(100);   //1秒間停止
    
    sasetu;    //左旋回90度
    sasetu;        //左旋回90度
    hanasu;        //アームを開く
 
    usetu;     //右旋回90度
    usetu;         //右旋回90度
 
    shiro_made;  //白まで進む
    line1();    //左側をライントレース
    Wait(100);   //1秒間停止,「B到着」
 
    shiro_made;   //白まで進む
    line0();  //右側をライントレース,「ゴール」
 }



*感想 [#ga3572de]
今回はロボットを作るのはそれほど難しくなかった。しかし、プログラミングが難しく時間がかかった。うまく進んでくれたり、変な動きをしたりしておもしろかった.また、プログラミングの難しさを改めて知らされた。一応プログラムは作れたが長くなってしまい、きれいにまとめることができなかった。いろんな苦労があったけど楽しかった。また機会があれば挑戦したいと思った。

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS