#contents
*MISSION [#g57706c4]
自作したコースに沿って一周するするロボットを作成せよ。
ただし、次の点に注意すること
一人は時計回り用、もう一人は半時計回うり用のプログラムを作成すること(ロボット本体は同一のものを使う)。
次のステップでプログラムを作成すること。
-交差点をきちんと認識し、正しく判断して通過できるようにする。
-確実に一周できるようにする。スタート地点から出発して元にもどるようにする。
-空き缶を交差点から10cm以上離した線上に起き、それを一旦どけて再び元の位置にもどすように改良する。
-1個の空き缶でうまくいったら、2個の空き缶でやってみる。
**コース [#ke4b0572]
&ref(2013b/Member/mato/Mission1/route5.jpg);
私は左周りを担当する。
後のプログラムの説明のためにコースを3つに分ける。
右上の円を小円と呼ぶ
*ロボットの説明 [#ya482e58]
&ref(2013b/Member/mato/Mission1/IMG_0558 (3).jpg);
&ref(2013b/Member/mato/Mission1/ロボ.jpg,20%);
-バンパーを中心から離すことで、てこの原理によりタッチセンサが反応しやすくした。
-缶を一本のアームで掴むためにアームをかぎづめ型にした。
-モーターとアームの位置が離れているためゴムを使って動かせるようにした。
*プログラム [#m44b309f]
**定義 [#d1bdcea1]
#define THRESHOLD 43 //閾値
#define HIPOWER 2 //高速
#define LOWPOWER 1 //低速
#define set_power_H SetPower(OUT_AC,HIPOWER); //ACを高速で動かす
#define set_power_L SetPower(OUT_AC,LOWPOWER); //ACを低速で動かす
#define go_forward set_power_H; OnFwd(OUT_AC); //前進
#define turn_left1 set_power_L; Off(OUT_A); OnFwd(OUT_C); //左折
#define turn_left2 set_power_L; OnRev(OUT_A); OnFwd(OUT_C); //左旋回
#define turn_left3 set_power_L; OnRev(OUT_A); //右後進
#define turn_right1 set_power_L; Off(OUT_C); OnFwd(OUT_A); //右折
#define turn_right2 set_power_L; OnRev(OUT_C); OnFwd(OUT_A); //右旋回
#define arm_hold OnFwd(OUT_B);Wait(50);Off(OUT_B); //缶を掴む
#define arm_part OnRev(OUT_B);Wait(50);Off(OUT_B); //缶を離す
#define STEP 1
#define nMAX 4 //カウンタの最大数
#define short_break Off(OUT_AC);Wait(50); //小休止
#define CROSS_TIME 40 //交差点を渡る時間
#define cross_line set_power_L; OnFwd(OUT_AC); Wait(CROSS_TIME); short_break; //交差点を渡る
#define time0 2000 //�,了�間
#define time1 700 //�△了�間
**サブルーチン [#a2fda3b2]
-普通のライントレース(5段階評価)
sub normal_trace()
{
if (SENSOR_2 < THRESHOLD -1){
turn_left2;
} else if (SENSOR_2 < THRESHOLD +3){
turn_left1;
} else if (SENSOR_2 < THRESHOLD +7){
go_forward;
} else if (SENSOR_2 < THRESHOLD +8){
turn_right1;
} else {
turn_right2;
}
}
-交差点を渡るライントレース(4回連続で左旋回したら直進) [#l1c71e98]
-交差点を渡るライントレース(4回連続で左旋回したら直進)
sub across_line ()
{
int nOnline=0;
while(nOnline < nMAX ){
if(SENSOR_2< THRESHOLD -1) {
turn_left2;
nOnline++;
}else{
if(SENSOR_2< THRESHOLD ){
turn_left1;
}else if(SENSOR_2< THRESHOLD +4){
go_forward;
}else if(SENSOR_2< THRESHOLD +7){
turn_right1;
}else{
turn_right2;
}
nOnline=0;
}
Wait(STEP);
}short_break;PlaySound(2);
turn_right1;Wait(nMAX*STEP);
cross_line;
nOnline=0;
}
-小円の内側を渡るライントレース(右後進を駆使して曲がりきる) [#ib41f144]
-小円の内側を渡るライントレース(右後進を駆使して曲がりきる)
sub circle_trace()
{
ClearTimer(0);
while(FastTimer(0) <= time1){
if (SENSOR_2 < THRESHOLD -2){
turn_left3;
} else if (SENSOR_2 < THRESHOLD -1){
turn_left2;
} else if (SENSOR_2 < THRESHOLD +5){
go_forward;
} else {
turn_right1
}
}
}
-缶を退ける [#tf64d432]
-缶を退ける
sub can_turn ()
{
set_power_L ;
arm_hold;
OnFwd(OUT_AC); Wait(200);
turn_right2; Wait(500);
arm_part;
turn_left2 ; Wait(500);
}
**メインのプログラム [#yf4e269e]
task main()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
SetSensor(SENSOR_3, SENSOR_TOUCH);
ClearTimer(0); // タイマーをリセット
while(FastTimer(0) <= time0){ //�△泙念焚爾離廛蹈哀薀爐魴�り返す
if (SENSOR_3 == 1){ //タッチセンサが反応したら
PlaySound(2); //音をならして
can_turn(); //缶を退ける
} else { //タッチセンサが反応しなかったら
normal_trace(); // 通常のライントレース
}
}
repeat(3) { //�△僕茲燭藐鮑硬世鬘害鵑錣燭�
across_line();
}
circle_trace(); //��に来たら小円を回る
across_line(); //小円をぬける
while(true){
normal_trace(); //通常のライントレース
}
}
*工夫した点 [#l399870a]
+アームはモーター1つでかぎ爪の形にすることで、しっかりつかむことができるようになった。
+タイヤのモーターのスピードを2と1を使っているのは、最初は7と2を使っていたがスピードの差が大きいためロボットが左右にぶれて、なかなか前に進まないため変更した。
+交差点を渡る際にカウンタがうまく使えず、プログラムを見直したらミスを発見し、直すことができた。
+小円を回るのがうまくいかず円からはみ出すため、左のモーターだけバックさせるプログラムを組み込んだら回れるようになった。
+プログラムは無駄なく作れたと思う。
*改善点 [#y6b316fc]
-腕のモーターの機構が重くなってしまい、後ろのタイヤが浮いてしまったので、軽量化する必要がある。
-タイマーを使わないプログラムを組みたい。
-缶を1つしか退けれてないので、2つのプログラミングも作りたかった。
*感想 [#a4ad8d1c]
カウンタが使えずタイマーに頼ようと思ったが、まさか自分のプログラムが間違っているとは思わなかった。深く反省したい。
アームの製作があまり時間を取れず、簡易で壊れやすいものになってしまったのが少し心残りだった。
二人で協力してロボットを作っていればもう少し完成度が高くなったかもしれない。