- 追加された行はこの色です。
- 削除された行はこの色です。
*目次 [#cc0b6d67]
#contents
*課題2:ライントレースロボット [#d800b9da]
**車体構造 [#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 FWD OUT_A+OUT_C
#define THRESHOLD 40
int rt ; // 交差点を通った回数を変数で記録
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);
SetSensor(SENSOR_3,SENSOR_TOUCH); // センサーをそれぞれセット
while(true){
if(SENSOR_3 == 1){
OnRev(MOTOR);
if(SENSOR_3 == 1){ // バンパーに当たっているとき
OnRev(FWD);
Wait(60);
Off(MOTOR);
Off(FWD);
Wait(300);
} else {
if(SENSOR_1 > THRESHOLD){
if(SENSOR_2 > THRESHOLD){
OnFwd(MOTOR);
} else {
Off(MOTOR);
OnRev(OUT_B);
if(SENSOR_1 > THRESHOLD){ // 左が白上
if(SENSOR_2 > THRESHOLD){ // かつ右が白上
OnFwd(FWD);
} else { // 右が黒線上の時
Off(FWD);
OnRev(OUT_B); // ステアリングを左に回転
Wait(90);
OnFwd(MOTOR);
OnFwd(FWD);
until(SENSOR_2 > THRESHOLD);
}
} else {
if(SENSOR_2 > THRESHOLD){
Off(MOTOR);
} else { // 左が黒線上の時
if(SENSOR_2 > THRESHOLD){ // かつ右が白上の時
Off(FWD);
OnFwd(OUT_B);
Wait(90);
OnFwd(MOTOR);
OnFwd(FWD);
until(SENSOR_1 > THRESHOLD);
}else{
Off(MOTOR);
}else{ // 左右が黒線上の時
Off(FWD); // 優先道路で止まる
Wait(80);
OnFwd(MOTOR);
Wait(80);
Off(MOTOR);
rt ++;
if(rt = ){
OnFwd(FWD);
Wait(150);
Off(FWD);
rt ++; // 交差点を通った回数を+1
if(rt = ){ // 回数が 会の時
Off(OUT_A+OUT_B+OUT_C);}
}
}
}
}}
**生じた問題 [#c52794ce]
-最初は曲がるとき後輪を止めないプログラムだったが、そのまま黒線上を通りすぎでしまったので、ステアリングの回転時後輪を止めるプログラムとした。
-曲がるときにステアリングだけでなく、後輪の回転を逆にして曲がりやすくしようと試みたが、前輪の流れとかみ合わずうまくいかなかった。