[[2014b/Member]]
 
目次(作成途中)
目次
#contents
 

*課題2の内容 [#y92e66c5]
黒い線で作成したコースに沿って動くロボットを製作する。

ただし交差点では次のような動きをさせる。

一人目
一回目に交差点にさしかかったときは直進~
二回目は左折~
三回目は直進~
四回目は右折~
五回目は右折 → ゴールへ~
#br
二人目~
一回目に交差点にさしかかったときは左折~
二回目は右折~
三回目は左折~
四回目は直進~
五回目は直進 → ゴールへ~
#br
以下を参照

[[課題2:http://yakushi.shinshu-u.ac.jp/robotics/?2014b%2FMission2]]
#br
自分は二人目の動作をさせた。


*ロボット本体 [#d49c5481]
最初の冊子にのっていたライントレース用のロボットは、カーブでセンサーが黒線から外れてしまったので、光センサーを本体からなるべく近くに設置しなおした。~
これによってセンサーが外れることはなくなった。

*プログラム [#v47f2d49]
基本的には冊子に乗っていたライントレースのプログラムを利用した。

**使用したマクロ [#p70c0e10]
***しきい値と各スピード [#bbf908d2]
 #define THRESHOLD 45  //センサーのしきい値
 #define SPEED_H 50  //前進するときのモーターのスピード
 #define SPEED_L 25  //曲がるときのモーターのスピード
***ライントレース [#hb24930a]

 #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
前進
 #define go_forward OnRL(SPEED_H,SPEED_H);
左に曲がる(両輪)
 #define turn_left1 OnRL(SPEED_L,-SPEED_L);
左に曲がる(片輪)
 #define turn_left0 OnRL(SPEED_L,0);
右に曲がる(片輪)
 #define turn_right0 OnRL(0,SPEED_L);
右に曲がる(両輪)
 #define turn_right1 OnRL(-SPEED_L,SPEED_L);
 
***交差点での動き [#q51ab62c]
 #define STEP 1
 
交差点のしきい値
 #define nMAX 150
 
1秒止まる
 #define short_break Off(OUT_BC);Wait(1000);
 
交差点を渡る時間
 #define CROSS_TIME 200
 
交差点を渡る
 #define closs_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break;
 
 
**main関数 [#m6bf1a0f]
 
 
 task main()
 
 {
 
   SetSensorLight(S3);
 
   int nOnline=0,closs_number=1;
   int nOnline=0;
   int closs_number=1;  //交差点の番号(何回目の交差点か)
 
***ライントレースと、交差点の判断 [#ofa8e48e]
 
 
   while(true){
 
     while(nOnline < nMAX){
 
       if(SENSOR_3 < THRESHOLD-15){  //ほぼ黒線上
 
          turn_left1;
 
          PlaySound(SOUND_LOW_BEEP);
          PlaySound(SOUND_LOW_BEEP);  //低いビープ音を鳴らす
 
 	  nOnline++;
 
       }else{
 
 	  if(SENSOR_3 < THRESHOLD-7){  //黒に近い
 
             turn_left0;
 
       }else if(SENSOR_3 < THRESHOLD+7){  //中間
 
           go_forward;
 
       }else if(SENSOR_3 < THRESHOLD+15){  //白に近い
 
 	    turn_right0;
 
       }else{  //ほぼ白
       }else{  //ほとんど白
 
   	    turn_right1;
 
            PlaySound(SOUND_LOW_BEEP);
            PlaySound(SOUND_LOW_BEEP);  //低いビープ音を鳴らす
 
       }
 
      nOnline=0;
 
     }
 
     Wait(STEP);
 
     }
 
***交差点における判断 [#g414f9c3]

   /*交差点であるとき*/
 
    if(closs_number != 3){
    if(closs_number != 3){  //3回目の交差点のとき、曲がる(回数はとりあえず)
 
       short_break;
 
       turn_right1;Wait(nMAX*STEP);
 
       closs_line;
 
       nOnline=0;
       nOnline=0;  //回数を1増やす
 
       closs_number++;
       closs_number++;  //交差点の番号を1増やす
 
       PlaySound(SOUND_CLICK);
       PlaySound(SOUND_CLICK);  //クリック音を鳴らす
 
    }
 
    else
    else  //そうでないとき
 
    {
 
       nOnline=0;
       nOnline=0;  //回数をリセット
 
       closs_number++;
       closs_number++;  //交差点の番号を1増やす
  
       PlaySound(SOUND_UP);
       PlaySound(SOUND_UP);  //「テレレー↑」という音をならす
 
    }
 
   }
 
 }

*問題点 [#oab0db83]
いくつか問題が発生して、解決できたものとできなかったものがあった
**問題:交差点の判断ができない(解決済み) [#tc869301]
交差点を正しく認識できなくなった。何度も走らせて確かめたところ、毎回交差点を曲がり角と誤認して左に曲がってしまっていた。
***解決法 [#pb7429cf]
(完全に黒線上にいた回数) < (交差点の判断基準となる回数) となっているはずなので、交差点の判断基準であるnMAXの値を300から150に変更したところ、正常に判断できるようになった。


**問題:小さいカーブを曲がれない(未解決) [#h747523c]
センサーを近くしたことで大きなカーブでは問題なく黒線を追えるようになったが、小さい円の部分を曲がるときにセンサーが外れてしまった。このときのタイヤの動きを観察したところ、外側のタイヤのみが回転して曲がっていたため、内輪差でセンサーが外れてしまっていることがわかった。
***解決法 [#wb019f31]
外側のタイヤの回転だけでは曲がりきれないので、内側のタイヤを逆回転させればよいと思われる。(時間切れで実装に至らなかった。)
*考察・感想 [#v919e07e]
プログラムの問題を修正することに時間がかかってしまい、結局目的の動きをさせることはできなかった。交差点の判断はできているはずなので、あとはカーブを曲がれるようになればあとは「いまが何回目の交差点か」をかぞえて、if文を使って曲がる or 曲がらないの判断をすれば、課題は達成できると思う。~
問題に気づくのが遅れてしまい、対策を考えるのが遅くなったので、次回はもっと早めに試す機会を作るようにしたい。


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