編集中
#contents
*ハード設計 [#u0e00523]
**形状 [#k00cbc2b]
今回は二輪車型を採用した。ラインという道路を走るので、この形状が一番適しているのはいうまでもない。
**アーム [#l05776ac]
ボールをうまく掴むために、今回は以下のような機構を用意した。~
&ref(A.jpeg);
左右両側から覆うような構造にしたため、動作中で多少角度にブレが生じても、ボールを捕捉できる確率が高くなるようにした。
この気候は、ボールを話した状態ではボールを弾いてキックすることもできる。
&ref(B.jpeg);
**工夫点 [#td425d48]
+本体とラインセンサーの距離を「近くに置いた」。~
プログラムの項目で説明するが、これは加減が重要で、前回私が作成した文字を書くロボットのペン先の位置と同様に、回転軸の中心にラインセンサーを置いたのでは、プログラム設計上の問題が生じる。プログラムを計画通りに動かすには、回転軸中心の少し前方にラインセンサーを置かなくてはならない。
+比重の高いギアを採用した。~
プログラムを作成していくうちに、一連の課題を「早く」終了するためには、「速い動き」ではなく、「正確な動き」である必要があるとわかった。要するに、安定性のためには低速である必要があるということである。





*プログラム全文 [#w34c4c3b]
 #define BLACK 37
 #define BLACKandGLAY 45
 #define GLAYandWHITE 55
 #define WHITE 60
 #define go OnRev(OUT_BC,35);
 #define turn_leftFwd OnRev(OUT_B,35);Off(OUT_C);
 #define turn_rightFwd Off(OUT_B);OnRev(OUT_C,35);
 #define turn_left OnRev(OUT_B,35);OnFwd(OUT_C,35);
 #define turn_right OnFwd(OUT_B,35);OnRev(OUT_C,35);
 #define short_break Off(OUT_BC);Wait(1000);
 #define back OnFwd(OUT_BC,35); 

 sub Rside_trace()
 {

    long t0 = CurrentTick();
    while(CurrentTick()-t0<150) {
     if (SENSOR_3 < BLACK) {
       turn_right;
     } else if (SENSOR_3 < BLACKandGLAY) {
       t0=CurrentTick();turn_rightFwd;
     } else if (SENSOR_3 < GLAYandWHITE) {
       t0=CurrentTick();go;    
     } else if (SENSOR_3 < WHITE) {
       t0=CurrentTick();turn_leftFwd;
     } else {
      turn_left;t0=CurrentTick();
     }}
   Off(OUT_BC);
  }
 sub Lside_trace()
 {
    long t0 = CurrentTick();
    while(CurrentTick()-t0<150) {
     if (SENSOR_3 < BLACK) {
       turn_left;
     } else if (SENSOR_3 < BLACKandGLAY) {
       t0=CurrentTick();turn_leftFwd;
     } else if (SENSOR_3 < GLAYandWHITE) {
       t0=CurrentTick();go;    
     } else if (SENSOR_3 < WHITE) {
       t0=CurrentTick();turn_rightFwd;
     } else {
      turn_right;t0=CurrentTick();
     }}
   Off(OUT_BC);
  }

 sub Rcross_line()
 {
 OnRev(OUT_C,60);Wait(800);
 Off(OUT_BC);
 }
 sub Lcross_line()
 {
 OnRev(OUT_B,60);Wait(800);
 Off(OUT_BC);
 }
 sub cross_line()
 {
 OnRev(OUT_BC,50);Wait(350);
 Off(OUT_BC);
 }
 task main()
 {
 SetSensorLight(S3);
 while(SENSOR_3>BLACKandGLAY){
 go;}
 go;Wait(800);//AーBへ直進
 Rside_trace();//B~Cを右端走行
 PlaySound(SOUND_CLICK);//Cを斜め横断する合図
 Lcross_line();//Cを左斜めに横断
 Lside_trace();//C~Dを左側走行
 short_break;//Dで一時停止
 PlaySound(SOUND_CLICK);//Dを横断する合図
 cross_line();//Dをまっすぐ渡る
 Lside_trace();//D~Gを左側走行
 PlaySound(SOUND_CLICK);//横断する合図
 OnFwd(OUT_B,30);OnRev(OUT_C,60);Wait(1300);
 int n=0;//円周上で横断する回数を定義
 while(n<2){  //H,Iで二回。Jで違う挙動を取りたい。
  Rside_trace();//円周を右側(外側)走行
  n++;//交差点通過時にカウントを1追加
  PlaySound(SOUND_CLICK);//横断する合図
  OnRev(OUT_B,60);Wait(500);;//交差点通過
  }
 Rside_trace();//円周を右側(外側)走行
 PlaySound(SOUND_CLICK);//横断する合図
 OnFwd(OUT_B,30);OnRev(OUT_C,70);Wait(900);//JKの右側へ出る
 Rside_trace();//J~Kを右側走行
 PlaySound(SOUND_CLICK);//横断する合図
 OnFwd(OUT_C,30);OnRev(OUT_B,70);Wait(1300);//KLの左側へ出る
 int a=0;
 int b=0;
 while((a<2000)&&(b<2500)){
       if (SENSOR_3 < BLACK) {
       b++;turn_left;
     } else if (SENSOR_3 < BLACKandGLAY) {
       a++;b++;turn_leftFwd;
     } else if (SENSOR_3 < GLAYandWHITE) {
       a++;go;    
     } else if (SENSOR_3 < WHITE) {
       a++;b++;turn_rightFwd;
     } else {
       b++;turn_right;}}//K~Lを左側走行(回数指定で距離を制限)
 Off(OUT_BC);OnFwd(OUT_A,100);Wait(700);Off(OUT_A);//  
 turn_left OnRev(OUT_B,35);OnFwd(OUT_C,35);Wait(300);
 Rside_trace();//L~Mを右側走行(白の場合右回転なので方向修正の回転もこれに含まれる)
 cross_line();//Kを横断
 Rside_trace();//K~Mを右側走行
 short_break;//Mで一時停止
 OnRev(OUT_A,100);Wait(700);Off(OUT_A);//ボールを離す
 OnRev(OUT_BC,-100);Wait(1000);Off(OUT_BC);//後退
 OnRev(OUT_A,-100);Wait(700);Off(OUT_A);//アームもどす
 OnRev(OUT_BC,100);Wait(1000);Off(OUT_BC);//前進
 OnRev(OUT_A,100);Wait(700);Off(OUT_A);//ボールを撃つ
 OnRev(OUT_BC,100);Wait(500);Off(OUT_BC);//進む
 }
 
*完成!!!! [#d9fa0eec]
https://youtu.be/Uj9U_WkvzWQ


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS