- 追加された行はこの色です。
- 削除された行はこの色です。
目次
#contents
*ロボットについて [#u62a9aac]
私たちが今回作成したのはライントレースマシンである。これは線を引いた上を走るというロボットである。図にあるようなライントレースマシンは前回作った別のロボットの設計問題(字を書く際に紙が動いてしまう...etc)を考慮しながら作成していった。今回工夫したのは光センサーが反応する位置と動かなければならない位置との距離を短くするためにモータのある位置付近に光センサーを設置した。また場所によって光センサーの反応する値の変化を少なくするために光センサーと地面との距離を短くした。
#ref(image2.JPG)
私たちが今回作成したのはライントレースマシンである。これは線を引いた上を走るというロボットである。図にあるようなライントレースマシンは前回作った別のロボットの設計問題(字を書く際に紙が動いてしまう...etc)を考慮しながら作成していった。今回工夫したのは光センサーが反応する位置と動かなければならない位置との距離を短くするためにモータのある位置付近に光センサーを設置した。また場所によって光センサーの反応する値の変化を少なくするために黄色の円の場所に光センサーと地面との距離を短くした。
#ref(image2(1).JPG)
*プログラミング [#gd0a47e1]
今回のプログラムは黒い線の恥に沿って動き、交差点の差し掛かる回数でロボットの向かう方向を変えていくというものである。これを行う際にはカウンタとタイマーという機能を活用した。タイマーで黒い線にいる場合の値を計測し、ある一定の値以上になった場合交差点であるという判断をさせるようにし、カウンタで交差点が通りかかった回数を数え、その状況に応じた動きをさせるようにした。
#ref(line.png)
~●スピードや動かす方向を定義したもの
#define THRESHOLD 49//33(黒線に対して光センサーが反応した値)+65(白に対して光センサーが反応した値)÷2
#define SPEED_L 50//モーターの50%の出力
#define SPEED 25//モーターの25%の出力
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);//前後左右に動かせる
#define go_forward OnRL(SPEED_L,SPEED_L);//直進
#define turn_left1 OnRL(SPEED_L,-SPEED_L);//左旋回
#define turn_left0 OnRL(SPEED_L,-SPEED);//若干左に回る
#define turn_right0 OnRL(-SPEED,SPEED_L);//若干右に回る
#define turn_right1 OnRL(-SPEED_L,SPEED_L);//右旋回
SetSensorLight(S3);//()は光センサーがつながっている。
long t0=CurrentTick();//currentTick()で現在の時刻が得られる。
int nOnline=0;//交差点を通った回数
●交差点以外の行動するプログラム
while(true){
if(CurrentTick()-t0<tMAX){
if(SENSOR_3<THRESHOLD-9){
turn_left1;
if(CurrentTick()-t0<tMAX){//tMAX=350>CurrentTick()-t0すなわち交差点以外の場合
if(SENSOR_3<THRESHOLD-9){//黒線の上にあるとき
turn_left1;//左旋回
}else{
if(SENSOR_3<THRESHOLD-5){
turn_left0;
}else if(SENSOR_3<THRESHOLD+5){
go_forward;
}else if(SENSOR_3<THRESHOLD+9){
turn_right1;
if(SENSOR_3<THRESHOLD-5){//黒よりの境界線上にあるとき
turn_left0;//若干左に回る
}else if(SENSOR_3<THRESHOLD+5){//白よりの境界線上にあるとき
go_forward;//まっすぐ進む
}else if(SENSOR_3<THRESHOLD+9){//白にあるとき
turn_right1;//右旋回
}else{
turn_right0;
turn_right0;//若干右に回る
}t0=CurrentTick();
Wait(STEP);
}
}
●交差点に差しかかった時のプログラム
#define STEP 1
#define tMAX 350
#define STEP 1//0.001秒
#define tMAX 350//通常の道における許容できる繰り返しの最大値
#define short_break Off(OUT_BC);Wait(1000);//少しの間待つ
#define CROSS_TIME 200//交差点を直進する時の時間
#define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break;//ちょ
#define MOVE_TIME 500
else{
●左右に振れた分を修正し、交差点に対してまっすぐにする
Off(OUT_BC);
turn_right0;
Wait(275);
‣一回目の交差点(赤)
if(nOnline<1){
‣一回目の交差点(赤):左に曲がる
if(nOnline<1){//交差点にかかった回数
turn_left1;
Wait(500);
}
‣二回目の交差点(橙)
else if(nOnline<2){
‣二回目の交差点(橙):右に曲がる
else if(nOnline<2){//交差点にかかった回数
turn_right1;
Wait(520);
}
‣三回目の交差点(青)
else if(nOnline<3){
‣三回目の交差点(青):左に曲がる
else if(nOnline<3){//交差点にかかった回数
turn_left1;
Wait(500);
}
‣四回目の交差点(緑)
else if(nOnline<4){
‣四回目の交差点(緑):まっすぐ進む
else if(nOnline<4){//交差点にかかった回数
go_forward;
Wait(200);
}
go_forward;
Wait(200);
nOnline++;
t0=CurrentTick();
Wait(STEP);
}
}
}
*作成時における問題と解決方法 [#v06b571b]
場所により光センサーの反応する値が変化する。 ⇒ 光センサーと地面の距離を短くした。
~ 交差点の通る回数ごとに動きを変化することが出来なかった。 ⇒ タイマーとカウンタを併用した。
*結果・感想[#j39f5243]
結果としては課題通りに動かすことが出来た。しかし、交差点に通りかかり次の道に移る際に曲がりすぎたりしてコースから外れることがたまにあった。今回の行ったライントレースマシンは来年行うかもしれないものであり、プログラミングやロボットの作成の際に起こった問題や改善方法を活かしていこうと思った。
結果としては課題通りにマシンを動かすことが出来た。しかし、交差点に通りかかり次の道に移る際に曲がりすぎたりしてコースから外れることがたまにあった。今回の行ったライントレースマシンは私の学部が来年行うかもしれないものであり、プログラミングやロボットの作成の際に起こった問題の改善方法を活かしていきたいと感じた。