目次

課題2:ライントレースロボット

紙の上に描いたライン上をトレースし、なおかつ3週でストップするロボット

コース

TS3H0076.JPG

車体構造

KC390015.jpg
基本的な構造としては4輪車であり、自動車のようなステアリングを採用している。

ステアリング

KC390016.jpg
タイヤの支点をそれぞれ2つずつ作り、一方の位置を固定、もう一方を反対側のタイヤと横ギアで連動させることによって一つのモーターで二つのタイヤを同時に同じ方向に曲げている
モーターからの回転をそのまま伝えるのではなく下→中とモーターの下部に回転を伝え、 全体を下に持ってくることで複雑な構造を持ちながら頑丈な作りにすることができた

光センサー

光センサーは前輪の前部にそれぞれ1つずつ置くことで舵をとれるようにした。
二つのセンサーで黒線を挟み込み、どちらかが接するとその方向に曲がるしくみとした。

生じた問題と改善

プログラミング

スクリプト

#define MOTOR OUT_A+OUT_C
#define THRESHOLD  40
int sc = 0; // ストップカウント
int rt = 0; // 右折回数
int lt = 0 ; // 左折回数
task main (){
	  SetPower (OUT_A,2);
	  SetPower (OUT_B,7);
	  SetPower (OUT_C,2);
	  SetSensor(SENSOR_1,SENSOR_LIGHT);
	  SetSensor(SENSOR_2,SENSOR_LIGHT);
	  SetSensor(SENSOR_3,SENSOR_TOUCH); // 各センサーを指定
      while(sc <= 5){                                             //  回交差点を通るまで繰り返す
                if(SENSOR_3 == 1){                           // タッチセンサーが触れているとき
                	  OnRev(MOTOR);
                         Wait(60);
                         Off(MOTOR);
                         Wait(300);
                         } else {                                       // タッチセンサーがオフのとき
                         if(SENSOR_1 > THRESHOLD){ // 左が白上
                         if(SENSOR_2 > THRESHOLD){ // 右が白上
                         OnFwd(MOTOR);
                         } else {                                        // それ以外(右が黒線上のとき)
                         Off(MOTOR);
                         OnRev(OUT_B);
                         Wait(110);
                         OnFwd(OUT_A);
                         rt ++;                                         // 右折に+1
                         until(SENSOR_2 > THRESHOLD);
                         }
                         } else {                                       // それ以外(左が黒線上のとき)
                         if(SENSOR_2 > THRESHOLD){//かつ右が白上
                         Off(MOTOR);
                         OnFwd(OUT_B);
                         Wait(110);
                         OnFwd(OUT_C);
                         lt ++;                                        // 左折に+1
                         until(SENSOR_1 > THRESHOLD);                                            
                         }else{                                          // それ以外(左右ともに黒線上)
                         if(rt > lt){                                   // もし右折が左折より多ければ
                         Off(MOTOR);  
                         OnRev(OUT_B);                        //前輪をまっすぐに戻す                         
                         Wait(45);  
                         Off(OUT_B);                           
                         Wait(40);
                         OnFwd(MOTOR);                     
                         Wait(80);
                         Off(MOTOR);
                         sc ++;                                       // ストップカウントに+1
                         }
                         if(rt == lt){                                 //もし左折が右折と同じだったら
                         Off(MOTOR);  
                         OnFwd(OUT_B);                      //前輪をまっすぐに戻す
                         Wait(45);
                         Off(OUT_B);             
                         Wait(40);
                         OnFwd(MOTOR);
                         Wait(80);
                         Off(MOTOR);
                         sc ++;                                      //ストップカウントに+1
                         }}
                         }
                         }
                         }
                         }

解説

以下のプログラムをストップカウントが一定回数に達するまで繰り返すプログラムになっている

チャート式.jpg

基本的にプログラムはELSEでつなげ、直前の状態と背反のとき次の過程に進む構造となっている。
このプログラムでは基本的に左右のカウントが1ずつ増えていくので、最初に曲がった方向が常に逆の方向よりカウントが1多い状態になる。
今回は先に右折をさせるプログラムとしてある。
交差点に止まったときは、カウントによって前輪がどちらを向いているかわかるので、タイヤをまっすぐにに戻し、直進する。

生じた問題と改善

苦労した点

コメント

コメントお願いします


オリジナリティがある良いレポートです。 3周できる様にプログラムを組んでみてください。


添付ファイル: fileチャート式.jpg 293件 [詳細] fileKC390016.jpg 298件 [詳細] fileKC390015.jpg 314件 [詳細]

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