*目次 [#cc0b6d67]
#contents
*課題2:ライントレースロボット [#d800b9da]
紙の上に描いたライン上をトレースし、なおかつ3週でストップするロボット
**コース [#h02bc282]
#ref(2008a/A2/課題2左/TS3H0076.JPG)
**車体構造 [#kf279e17]
&ref(2008a/A2/課題2右/KC390015.jpg,15%);~
基本的な構造としては4輪車であり、自動車のようなステアリングを採用している。~
***ステアリング [#jbc10a21]
&ref(2008a/A2/課題2右/KC390016.jpg,15%);~
タイヤの支点をそれぞれ2つずつ作り、一方の位置を固定、もう一方を反対側のタイヤと横ギアで連動させることによって一つのモーターで二つのタイヤを同時に同じ方向に曲げている~
モーターからの回転をそのまま伝えるのではなく下→中とモーターの下部に回転を伝え、全体を下に持ってくることで複雑な構造を持ちながら頑丈な作りにすることができた~
ステアリングを用いることで非常に小回りのきいた走りが可能となった
モーターからの回転をそのまま伝えるのではなく下→中とモーターの下部に回転を伝え、 全体を下に持ってくることで複雑な構造を持ちながら頑丈な作りにすることができた~
***光センサー [#z4ca016e]
光センサーは前輪の前部にそれぞれ1つずつ置くことで舵をとれるようにした。~#define MOTOR OUT_A+OUT_C
#define THRESHOLD  40
int rt ;
task main (){
光センサーは前輪の前部にそれぞれ1つずつ置くことで舵をとれるようにした。~
二つのセンサーで黒線を挟み込み、どちらかが接するとその方向に曲がるしくみとした。
**生じた問題と改善 [#r9a1b15d]
-後輪の回転方向ではなく前輪の向きによって曲がる方向が決まり、また車体長がかなり長かったために大きく緩やかなカーブしか曲がることができなかったので、全体的に無駄な箇所を省き、車体長を短くしたところ、ある程度は小回りがきくようになった。
-前輪の前部に光センサーを設置すると、曲がったときなどに横の位置がずれて優先道路で止まることができなかったので、バンパーの根本のサイドに設置した。



*プログラミング [#x30c5dde]
**スクリプト [#l364152b]
 #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(true){
                 if(SENSOR_3 == 1){
                 		OnRev(MOTOR);
	  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){
                          } else {                                       // タッチセンサーがオフのとき
                          if(SENSOR_1 > THRESHOLD){ // 左が白上
                          if(SENSOR_2 > THRESHOLD){ // 右が白上
                          OnFwd(MOTOR);
                          } else {
                          } else {                                        // それ以外(右が黒線上のとき)
                          Off(MOTOR);
                          OnRev(OUT_B);
                          Wait(90);
                          OnFwd(MOTOR);
                          Wait(110);
                          OnFwd(OUT_A);
                          rt ++;                                         // 右折に+1
                          until(SENSOR_2 > THRESHOLD);
                          }
                          } else {
                          if(SENSOR_2 > THRESHOLD){
                          } else {                                       // それ以外(左が黒線上のとき)
                          if(SENSOR_2 > THRESHOLD){//かつ右が白上
                          Off(MOTOR);
                          OnFwd(OUT_B);
                          Wait(90);
                          OnFwd(MOTOR);
                          Wait(110);
                          OnFwd(OUT_C);
                          lt ++;                                        // 左折に+1
                          until(SENSOR_1 > THRESHOLD);                                            
                          }else{
                          Off(MOTOR);               
                          }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);
                          rt ++;
                          if(rt =  ){
                          Off(OUT_A+OUT_B+OUT_C);}
                          sc ++;                                      //ストップカウントに+1
                          }}
                          }
                          }
                          }
                          }}
                          }
**解説 [#hbea1508]
以下のプログラムをストップカウントが一定回数に達するまで繰り返すプログラムになっている~
#ref(2008a/A2/課題2右/チャート式.jpg,80%);~
基本的にプログラムはELSEでつなげ、直前の状態と背反のとき次の過程に進む構造となっている。~
このプログラムでは基本的に左右のカウントが1ずつ増えていくので、最初に曲がった方向が常に逆の方向よりカウントが1多い状態になる。~
今回は先に右折をさせるプログラムとしてある。~
交差点に止まったときは、カウントによって前輪がどちらを向いているかわかるので、タイヤをまっすぐにに戻し、直進する。
**生じた問題と改善 [#c52794ce]
-最初は曲がるとき後輪を止めないプログラムだったが、そのまま黒線上を通りすぎでしまったので、ステアリングの回転時後輪を止めるプログラムとした。
-曲がるときにステアリングだけでなく、後輪の回転を逆にして曲がりやすくしようと試みたが、前輪の流れとかみ合わずうまくいかなかった。
*苦労した点 [#h5353486]
-ほかの班とは全く違う車体構造だったので、プログラムが複雑化してしまった。
-二人で時間外に一緒に活動することがほとんどできなかった。
*コメント [#fce22233]
コメントお願いします~
#comment
オリジナリティがある良いレポートです。
3周できる様にプログラムを組んでみてください。


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