2016a/Member

目次

課題内容

kadai.png

・A地点からB地点へ

   A地点 → P直進 → Q直進 → Q直進 → R左折 → B地点

・B地点からC地点へ

   B地点 → R右折 → Q直進 → Q直進 →P右折 → S右折 → C地点

・C地点からA地点へ

   C地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点

私は1番目のルートを通るプログラミング(A地点からB地点)作りました。

course.jpeg

機体について

前回の課題を行い、機体が重たいと電池の消耗が激しくなることや、動くスピードが遅くなることがわかったため、今回は前回の反省を活かしてシンプルな機体にしました。

up1.jpeg
naname1.jpeg

また、機体の裏と床が触れ合う所は摩擦が少なくなるように工夫しました。
なめらかな面でできている部品を使ってあります。

ura1.jpeg

プログラミング

 #define straight 5
 #define carb 2   
 #define set_straight SetPower(OUT_AC,straight);
 #define set_carb SetPower(OUT_AC,carb);
 #define go_forward set_straight; OnFwd(OUT_AC);
 #define turn_leftL set_carb; OnFwd(OUT_C); OnRev(OUT_A);
 #define turn_leftS set_carb; OnFwd(OUT_C); Off(OUT_A);
 #define turn_rightS set_carb; OnFwd(OUT_A); Off(OUT_C);
 #define turn_rightL set_carb; OnFwd(OUT_A); OnRev(OUT_C);
 #define black 38
 #define glayA 42
 #define glayB 45
 #define glayC 48
 #define white 50
 #define kazu 13
 #define OTO1 8
 #define OTO2 20
 #define OTO3 4
 #define OTO_A 1047
 #define OTO_B 988
 #define OTO_C 698
 #define OTO_D 659  //定義
 task play_music()  //fff r fff r frfmmmdmmmdmdm
 {
 PlayTone(OTO_A,OTO1); Wait(OTO2);
 PlayTone(OTO_A,OTO1); Wait(OTO2);
 PlayTone(OTO_A,OTO1); Wait(OTO2);
 PlayTone(587,OTO3); Wait(OTO2-8);
 PlayTone(OTO_A,OTO3); Wait(OTO2-8);
 PlayTone(OTO_A,OTO1); Wait(OTO2);
 PlayTone(587,OTO1); Wait(OTO2);
 PlayTone(OTO_A,OTO3); Wait(OTO2-8);
 PlayTone(587,OTO3); Wait(OTO2-8);
 PlayTone(OTO_A,OTO3); Wait(OTO2-8);//10048
 PlayTone(OTO_B,OTO1); Wait(OTO2);//m
 PlayTone(OTO_B,OTO1); Wait(OTO2);//m
 PlayTone(OTO_B,OTO1); Wait(OTO2);//m
 PlayTone(523,OTO3); Wait(OTO2-8);//d
 PlayTone(OTO_B,OTO3); Wait(OTO2-8);//m
 PlayTone(OTO_B,OTO1); Wait(OTO2);//m
 PlayTone(523,OTO1); Wait(OTO2);//d
 PlayTone(OTO_B,OTO3); Wait(OTO2-8);//m
 PlayTone(523,OTO3); Wait(OTO2-8);//d
 PlayTone(OTO_B,OTO3); Wait(OTO2-8);//m
 }    //マリオカートでスターが出た時の音
 sub massugu()
 {
 Off(OUT_AC);
 Wait(100);
 PlaySound(SOUND_UP);
 go_forward;
 Wait(70);
 }   //交差点に来た時、まっすぐに進む命令のサブルーチン
 sub hidari()
 {
 Off(OUT_AC);
 Wait(70);
 PlaySound(SOUND_DOWN);
 turn_leftS;
 Wait(145);
 }   //交差点に来た時、まっすぐに進む命令のサブルーチン
 sub natural()
 {
  while (FastTimer(0) <= kazu) {
    if (SENSOR_2 < black) {           //20
     turn_leftL; 
    } else if (SENSOR_2 < glayA) {
     turn_leftS;
      ClearTimer(0);  
    } else if (SENSOR_2 < glayB) {
     go_forward;  
     ClearTimer(0); 
    } else  {
     turn_rightL; 
     ClearTimer(0);                     //30
    } 
    Wait(1);
    }
  }   //通常のライントレースをさせる命令のサブルーチン
 task main()
{ 
 SetSensor(SENSOR_2,SENSOR_LIGHT);
 repeat(3){  
ClearTimer(0);
 natural();
 massugu();
}   //3回交差点で真っ直ぐにいかせる
ClearTimer(0);
 natural();
 hidari();  //最後の交差点で左に曲がらせる
ClearTimer(0);
 natural();
 massugu();  //Bの枠内に入れるために少し進ませる。
 repeat(2) {
  start play_music;
  }
 Off(OUT_AC);}       //終わりの曲♪

結果

最後までゴールすることができました。(42.43秒)
交差点で止まる際に、止まるまでの時間の調整がとても細かくて大変でしたが、それは地道に実験しながら探っていきました。
具体的に図で説明すると以下のようになります。
(グレー:コース、青:機体、赤:光センサー)

trace.png
stop.jpeg

ここで止まるのが理想だが、時間が長すぎると、交差点だと判断する前に曲がってしまう⇓

magaru.jpeg

数値を0.1ずつ変えていき、適当な値を見つけることができました。

感想と反省

今回は、サブルーチンやリピートなども使えて、手応えを感じました。
光の量を判断して、ラインのギリギリを走らせるという発想は、とてもおもしろかったです。
ですが、それ故とても繊細で、緻密な数値が大事になってくるのだということも理解しました。
終わりのメロディも楽しいものになり(マリオカートのスターが出た時の音)、全体的に良かったと思います。


添付ファイル: filetrace.png 207件 [詳細] filestop.jpeg 165件 [詳細] filetrace.jpeg 118件 [詳細] filemagaru.jpeg 207件 [詳細] fileup1.jpeg 156件 [詳細] filenaname1.jpeg 175件 [詳細] filecourse.jpeg 221件 [詳細] filekadai.png 204件 [詳細] fileura1.jpeg 193件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-07-07 (木) 22:55:39