2015b/Member/rmsun/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2015b/Member]]
目次
#contents
*ライントレースするロボット [#p5d41d92]
黒い線に沿って動くロボットを制作した。
**走行する経路 [#i456d28d]
#ref(2015b/Member/rmsun/Mission2/2015b-mission2.png,716*5...
上の図を、「B地点 → P右折 → Q右折 → P左折 → Q左折 → Q直進...
*ロボット本体 [#oc260a58]
初期ロボットに光センサを付けた構造
#ref(2015b/Member/rmsun/Mission2/IMG_1320.JPG, 480*360)
モータBは右のタイヤに、モータCは左のタイヤに取り付けた。
*定義、サブルーチン [#fc43c816]
**マクロ [#ed90eab8]
#define THRESHOLD 50 //閾値
#define STEP 1 //Waitの引数として使う
**引数を変数に代入する「scan_move」「scan_angle」 [#cfa98...
***scan_moveで使うための変数 [#nd1c0e86]
変数target...交差点かどうかを判別するための数値
変数speed3...ロボットが直進するときの、モータのパワー
int target; //交差点かどうかを判断するとき、基準とする数値
int speed3; //直進するときの、モータのパワーに使用
***引数でとった値を、target, speed3に代入する「scan_move...
sub scan_move(int aim, int power) { //引数にとった値を、...
target = aim; //引数aimを、targetに代入
speed3 = power; //引数powerを、speed3に代入
}
***scan_angleで使うための変数 [#l26dabd8]
次の3つの変数は、交差点にぶつかった後、どんな動作をする...
int R_ang; //交差点で右旋回するときの、モータの回転角
int L_ang; //交差点で左旋回するときの、モータの回転角
int GO_ang; //交差点で直進するときの、モータの回転角
***引数でとった値を、L_ang, GO_ang, R_angに代入する「scan...
sub scan_angle(int l, int g, int r) { //引数にとった値を...
L_ang = l; //引数lを、L_angに代入
GO_ang = g; //引数gを、GO_angに代入
R_ang = r; //引数rを、R_angに代入
}
**左旋回、右旋回、直進をする「turn_left」「turn_right」「...
***モータのパワーを引数にとって、左旋回する「turn_left」 ...
sub turn_left(int speedA, int speedB) { //左に曲がる
OnFwd(OUT_B,speedA); //引数speedAのパワーで、モータB...
OnRev(OUT_C,speedB); //引数speedBのパワーで、モータC...
}
***モータのパワーを引数にとって、右旋回する「turn_right」...
sub turn_right(int speedA, int speedB) { //右に曲がる
OnFwd(OUT_C,speedB); //引数speedBのパワーで、モータC...
OnRev(OUT_B,speedA); //引数speedAのパワーで、モータB...
}
***モータのパワーを引数にとって、直進する「go_forward」 [...
sub go_forward(int speed3) { //まっすぐ進む
OnFwd(OUT_BC,speed3); //speed3のパワーで、モータBCを...
}
**交差点にぶつかったときの動作「cross_action」 [#x441724f]
交差点にぶつかった際、1秒間停止したあと、その交差点を直進...
「cross_action」は、「scan_ang」で値が代入された「L_ang」...
sub cross_action(int speed1, int L_ang, int R_ang, int G...
Off(OUT_BC); //モーター停止
Wait(1000); //1秒間−?
RotateMotorEx(OUT_BC, speed1, L_ang, -100, true, true);...
Wait(100); //間にWaitを挟まないと誤作動するため
RotateMotorEx(OUT_BC, speed1, R_ang, 100, true, true); ...
Wait(100); //誤作動を防ぐため
RotateMotorEx(OUT_BC, speed1, GO_ang, 0, true, true); ...
}
上のプログラムの動作を説明すると
?1秒間ロボットを停止させる
?モータをL_ang度回転させて、その場左旋回
?モータをR_ang度回転させて、その場右旋回
?モータをGO_ang度回転させて、直進
の順に実行される
「モータが0度動く = 動かない」と考えると
・R_ang = 0, GO_ang = 0のとき、交差点を左折する(?が実行さ...
・L_ang = 0, R_ang = 0のとき、交差点を直進する(?が実行さ...
・L_ang = 0のとき、交差点を右折する(?→?の順で実行される)
*メイン関数 [#pc00e5c2]
task main()
{
**メイン関数で新しく使う変数 [#e21b6be8]
変数count...交差点にぶつかった回数を代入
変数tacho...モータBの回転数を蓄積する
SetSensorLight(S2);
int speed1 = 20; //モータのパワー用
int speed2 = 15; //モータのパワー用(speed1より少し弱...
int count = 0; //何回交差点にぶつかったかを代入する
int tacho = 0; //「その場で左旋回する」動作をし続...
long t; //タイマーを使うときに使用
**count < 8 の間だけ繰り返す [#vd93a9c5]
while (count < 8){ //count < 8 の間、ループを続ける
***交差点ごとに動作を変える [#p37e981a]
ここでの操作は、「交差点の判別」や「交差点にぶつかった際...
switch(count) { //countの値によって動作が変わる
//例:case countの値 : scan_move(targetの値,s...
case 0 : scan_move(20, 50); scan_angle(0, 70, 50); b...
case 1 : scan_move(28, 60); scan_angle(0, 80, 20); b...
case 2 : scan_move(10000, 40); break;
case 3 : scan_move(20, 45); scan_angle(40, 0, 0); br...
case 4 : scan_move(30, 50); scan_angle(160, 0, 0); b...
case 5 : scan_move(20, 50); scan_angle(0, 50, 0); br...
case 6 : scan_move(20, 60); break;
case 7 : scan_move(25, 40); scan_angle(0, 0, 0); bre...
default : break;
}
countの値から、今何個目の交差点にいるのかを判断
例えば、countが0のときは、「1個目の交差点までの、ロボット...
&ref(2015b/Member/rmsun/Mission2/2015b-mission2a.png,480*...
&ref(2015b/Member/rmsun/Mission2/2015b-mission2c.png,480*...
上図より、橙(count=0)→黄(count=1)→黄緑(count=2)→緑(count=...
count=2の時だけは、交差点に到達する前にcountが切り替わる。
***黒い線に沿って動くためのプログラム [#w024bec7]
t = CurrentTick(); //ここで現在時刻をtに...
while ((tacho < target) && ((count != 2) || (CurrentTi...
/*「target(指定した角度)をタイヤの回転数が超えない」 ...
↑の条件を満たしている間だけループを続ける*/
//つまり、count != 2の時は、tacho >= targetを満たすと...
count = 2の時は、22.5秒経過した...
if (SENSOR_2 < THRESHOLD -15){ //光センサの数...
turn_left(speed1, speed1); //左右のモータをspeed1...
} else if (SENSOR_2 < THRESHOLD -7) { //光センサの数...
tacho = 0; //tacho(turn_left1し続けた時の、タイ...
turn_left(speed1, speed2); //右モータをspeed1、左...
} else if (SENSOR_2 < THRESHOLD +7){ //光センサの数値...
tacho = 0; //tachoを0にする−?
go_forward(speed3); //左右のモータをspeed3にして...
} else if (SENSOR_2 < THRESHOLD +15){ //光センサの数...
tacho = 0; //tachoを0にする−?
turn_right(speed1, speed2); //右モータをspeed2、左...
} else { //光センサの数値が、THRESHOLD+15より高い...
tacho = 0; //tachoを0にする−?
turn_right(speed1, speed1); //左右のモータをspeed1...
}
Wait(STEP); //STEP(0.001)秒だけ動く
if (SENSOR_2 >= THRESHOLD-15) { //光センサの数値が、...
ResetTachoCount(OUT_B); //モータの回転数をリセット...
}
tacho += MotorTachoCount(OUT_B); //tachoに、モータの...
}
tachoは、「モータBが回転した角度」を蓄積するための変数。t...
?「SENSOR_2 < THRESHOLD(閾値) - 15」以外のとき、tachoを0...
?「SENSOR_2 < THRESHOLD(閾値) - 15」以外のとき、TachoCoun...
?tacho += MotorTachoCount(OUT_B) は、「モータBが回転した...
の?,?,?が成り立つ
?、?より、tachoに0以外の値が代入されるのは、「SENSOR_2 < ...
?より、一度でも「SENSOR_2 < THRESHOLD - 15」を満たさなか...
つまり、tacho > targetとなるのは、連続的に「SENSOR_2 < TH...
***交差点にぶつかった際の動作 [#iaee8719]
//↓↓以下は「ライントレースするループ」を抜けだした時の...
if ((count != 2) && (count != 7)) { //countの値が、2or...
cross_action(speed1, L_ang, R_ang, GO_ang); //サブル...
}
count++; //countに1を加える
tacho = 0; //tachoを0にする
ResetTachoCount(OUT_B); //モータの回転角をリセット(交...
}
**すべてのループが終わった後の動作 [#p21d902b]
//↓↓以下は、すべてのループが終わった時の動作↓↓
Off(OUT_BC); //ロボットを停止させる
}
*メイン関数のまとめ [#t51b7b45]
プログラムを一つ一つ説明したため、プログラムの全体像がつ...
/*task main()
{
count = 0; //交差点にぶつかった回数を代入する
tacho = 0; //モータBの回転角の合計
long t;
while (count < 8){ //count < 8 の間、ループを続ける
switch(count) { //countの値によって動作を変える
/*countごとで、?target(交差点の判断基準)
?speed3(直進時のパワー)
?L_ang, R_ang, GO_ang(交差点に当たった際の動作)
を決める*/
}
while ((tacho < target) && ((count != 2) || (CurrentTi...
//光センサを使って、実際にライントレース
//(SENSOR_2 >= THRESHOLD-15)のと...
//モータBが動いたとき、その回転数が「MotorTachoCount(O...
if (SENSOR_2 >= THRESHOLD-15) { //光センサの数値が、...
ResetTachoCount(OUT_B); //モータの回転数をリセット...
}
tacho += MotorTachoCount(OUT_B); //tachoに、モータの...
}
//↓↓以下は「ライントレースするループ」を抜けだした時の...
if ((count != 2) && (count != 7)) { //countの値が、2or...
cross_action(speed1, L_ang, R_ang, GO_ang); //サブル...
}
count++; //countに1を加える
tacho = 0; //tachoを0にする
ResetTachoCount(OUT_B); //モータの回転角をリセット(交...
}
//↓↓以下は、すべてのループが終わった時の動作↓↓
Off(OUT_BC);
} */
*工夫点 [#ffe0873a]
・授業で習ったプログラムと基本的に同じだが、交差点を判別...
・右旋回、左旋回、直進の組み合わせで、交差点での進み方(右...
*反省点 [#tc347190]
・条件分岐や、サブルーチンを無駄に多く使っている(case文で...
・TachoCountを信用しすぎていた。誤差がかなりあったので、...
終了行:
[[2015b/Member]]
目次
#contents
*ライントレースするロボット [#p5d41d92]
黒い線に沿って動くロボットを制作した。
**走行する経路 [#i456d28d]
#ref(2015b/Member/rmsun/Mission2/2015b-mission2.png,716*5...
上の図を、「B地点 → P右折 → Q右折 → P左折 → Q左折 → Q直進...
*ロボット本体 [#oc260a58]
初期ロボットに光センサを付けた構造
#ref(2015b/Member/rmsun/Mission2/IMG_1320.JPG, 480*360)
モータBは右のタイヤに、モータCは左のタイヤに取り付けた。
*定義、サブルーチン [#fc43c816]
**マクロ [#ed90eab8]
#define THRESHOLD 50 //閾値
#define STEP 1 //Waitの引数として使う
**引数を変数に代入する「scan_move」「scan_angle」 [#cfa98...
***scan_moveで使うための変数 [#nd1c0e86]
変数target...交差点かどうかを判別するための数値
変数speed3...ロボットが直進するときの、モータのパワー
int target; //交差点かどうかを判断するとき、基準とする数値
int speed3; //直進するときの、モータのパワーに使用
***引数でとった値を、target, speed3に代入する「scan_move...
sub scan_move(int aim, int power) { //引数にとった値を、...
target = aim; //引数aimを、targetに代入
speed3 = power; //引数powerを、speed3に代入
}
***scan_angleで使うための変数 [#l26dabd8]
次の3つの変数は、交差点にぶつかった後、どんな動作をする...
int R_ang; //交差点で右旋回するときの、モータの回転角
int L_ang; //交差点で左旋回するときの、モータの回転角
int GO_ang; //交差点で直進するときの、モータの回転角
***引数でとった値を、L_ang, GO_ang, R_angに代入する「scan...
sub scan_angle(int l, int g, int r) { //引数にとった値を...
L_ang = l; //引数lを、L_angに代入
GO_ang = g; //引数gを、GO_angに代入
R_ang = r; //引数rを、R_angに代入
}
**左旋回、右旋回、直進をする「turn_left」「turn_right」「...
***モータのパワーを引数にとって、左旋回する「turn_left」 ...
sub turn_left(int speedA, int speedB) { //左に曲がる
OnFwd(OUT_B,speedA); //引数speedAのパワーで、モータB...
OnRev(OUT_C,speedB); //引数speedBのパワーで、モータC...
}
***モータのパワーを引数にとって、右旋回する「turn_right」...
sub turn_right(int speedA, int speedB) { //右に曲がる
OnFwd(OUT_C,speedB); //引数speedBのパワーで、モータC...
OnRev(OUT_B,speedA); //引数speedAのパワーで、モータB...
}
***モータのパワーを引数にとって、直進する「go_forward」 [...
sub go_forward(int speed3) { //まっすぐ進む
OnFwd(OUT_BC,speed3); //speed3のパワーで、モータBCを...
}
**交差点にぶつかったときの動作「cross_action」 [#x441724f]
交差点にぶつかった際、1秒間停止したあと、その交差点を直進...
「cross_action」は、「scan_ang」で値が代入された「L_ang」...
sub cross_action(int speed1, int L_ang, int R_ang, int G...
Off(OUT_BC); //モーター停止
Wait(1000); //1秒間−?
RotateMotorEx(OUT_BC, speed1, L_ang, -100, true, true);...
Wait(100); //間にWaitを挟まないと誤作動するため
RotateMotorEx(OUT_BC, speed1, R_ang, 100, true, true); ...
Wait(100); //誤作動を防ぐため
RotateMotorEx(OUT_BC, speed1, GO_ang, 0, true, true); ...
}
上のプログラムの動作を説明すると
?1秒間ロボットを停止させる
?モータをL_ang度回転させて、その場左旋回
?モータをR_ang度回転させて、その場右旋回
?モータをGO_ang度回転させて、直進
の順に実行される
「モータが0度動く = 動かない」と考えると
・R_ang = 0, GO_ang = 0のとき、交差点を左折する(?が実行さ...
・L_ang = 0, R_ang = 0のとき、交差点を直進する(?が実行さ...
・L_ang = 0のとき、交差点を右折する(?→?の順で実行される)
*メイン関数 [#pc00e5c2]
task main()
{
**メイン関数で新しく使う変数 [#e21b6be8]
変数count...交差点にぶつかった回数を代入
変数tacho...モータBの回転数を蓄積する
SetSensorLight(S2);
int speed1 = 20; //モータのパワー用
int speed2 = 15; //モータのパワー用(speed1より少し弱...
int count = 0; //何回交差点にぶつかったかを代入する
int tacho = 0; //「その場で左旋回する」動作をし続...
long t; //タイマーを使うときに使用
**count < 8 の間だけ繰り返す [#vd93a9c5]
while (count < 8){ //count < 8 の間、ループを続ける
***交差点ごとに動作を変える [#p37e981a]
ここでの操作は、「交差点の判別」や「交差点にぶつかった際...
switch(count) { //countの値によって動作が変わる
//例:case countの値 : scan_move(targetの値,s...
case 0 : scan_move(20, 50); scan_angle(0, 70, 50); b...
case 1 : scan_move(28, 60); scan_angle(0, 80, 20); b...
case 2 : scan_move(10000, 40); break;
case 3 : scan_move(20, 45); scan_angle(40, 0, 0); br...
case 4 : scan_move(30, 50); scan_angle(160, 0, 0); b...
case 5 : scan_move(20, 50); scan_angle(0, 50, 0); br...
case 6 : scan_move(20, 60); break;
case 7 : scan_move(25, 40); scan_angle(0, 0, 0); bre...
default : break;
}
countの値から、今何個目の交差点にいるのかを判断
例えば、countが0のときは、「1個目の交差点までの、ロボット...
&ref(2015b/Member/rmsun/Mission2/2015b-mission2a.png,480*...
&ref(2015b/Member/rmsun/Mission2/2015b-mission2c.png,480*...
上図より、橙(count=0)→黄(count=1)→黄緑(count=2)→緑(count=...
count=2の時だけは、交差点に到達する前にcountが切り替わる。
***黒い線に沿って動くためのプログラム [#w024bec7]
t = CurrentTick(); //ここで現在時刻をtに...
while ((tacho < target) && ((count != 2) || (CurrentTi...
/*「target(指定した角度)をタイヤの回転数が超えない」 ...
↑の条件を満たしている間だけループを続ける*/
//つまり、count != 2の時は、tacho >= targetを満たすと...
count = 2の時は、22.5秒経過した...
if (SENSOR_2 < THRESHOLD -15){ //光センサの数...
turn_left(speed1, speed1); //左右のモータをspeed1...
} else if (SENSOR_2 < THRESHOLD -7) { //光センサの数...
tacho = 0; //tacho(turn_left1し続けた時の、タイ...
turn_left(speed1, speed2); //右モータをspeed1、左...
} else if (SENSOR_2 < THRESHOLD +7){ //光センサの数値...
tacho = 0; //tachoを0にする−?
go_forward(speed3); //左右のモータをspeed3にして...
} else if (SENSOR_2 < THRESHOLD +15){ //光センサの数...
tacho = 0; //tachoを0にする−?
turn_right(speed1, speed2); //右モータをspeed2、左...
} else { //光センサの数値が、THRESHOLD+15より高い...
tacho = 0; //tachoを0にする−?
turn_right(speed1, speed1); //左右のモータをspeed1...
}
Wait(STEP); //STEP(0.001)秒だけ動く
if (SENSOR_2 >= THRESHOLD-15) { //光センサの数値が、...
ResetTachoCount(OUT_B); //モータの回転数をリセット...
}
tacho += MotorTachoCount(OUT_B); //tachoに、モータの...
}
tachoは、「モータBが回転した角度」を蓄積するための変数。t...
?「SENSOR_2 < THRESHOLD(閾値) - 15」以外のとき、tachoを0...
?「SENSOR_2 < THRESHOLD(閾値) - 15」以外のとき、TachoCoun...
?tacho += MotorTachoCount(OUT_B) は、「モータBが回転した...
の?,?,?が成り立つ
?、?より、tachoに0以外の値が代入されるのは、「SENSOR_2 < ...
?より、一度でも「SENSOR_2 < THRESHOLD - 15」を満たさなか...
つまり、tacho > targetとなるのは、連続的に「SENSOR_2 < TH...
***交差点にぶつかった際の動作 [#iaee8719]
//↓↓以下は「ライントレースするループ」を抜けだした時の...
if ((count != 2) && (count != 7)) { //countの値が、2or...
cross_action(speed1, L_ang, R_ang, GO_ang); //サブル...
}
count++; //countに1を加える
tacho = 0; //tachoを0にする
ResetTachoCount(OUT_B); //モータの回転角をリセット(交...
}
**すべてのループが終わった後の動作 [#p21d902b]
//↓↓以下は、すべてのループが終わった時の動作↓↓
Off(OUT_BC); //ロボットを停止させる
}
*メイン関数のまとめ [#t51b7b45]
プログラムを一つ一つ説明したため、プログラムの全体像がつ...
/*task main()
{
count = 0; //交差点にぶつかった回数を代入する
tacho = 0; //モータBの回転角の合計
long t;
while (count < 8){ //count < 8 の間、ループを続ける
switch(count) { //countの値によって動作を変える
/*countごとで、?target(交差点の判断基準)
?speed3(直進時のパワー)
?L_ang, R_ang, GO_ang(交差点に当たった際の動作)
を決める*/
}
while ((tacho < target) && ((count != 2) || (CurrentTi...
//光センサを使って、実際にライントレース
//(SENSOR_2 >= THRESHOLD-15)のと...
//モータBが動いたとき、その回転数が「MotorTachoCount(O...
if (SENSOR_2 >= THRESHOLD-15) { //光センサの数値が、...
ResetTachoCount(OUT_B); //モータの回転数をリセット...
}
tacho += MotorTachoCount(OUT_B); //tachoに、モータの...
}
//↓↓以下は「ライントレースするループ」を抜けだした時の...
if ((count != 2) && (count != 7)) { //countの値が、2or...
cross_action(speed1, L_ang, R_ang, GO_ang); //サブル...
}
count++; //countに1を加える
tacho = 0; //tachoを0にする
ResetTachoCount(OUT_B); //モータの回転角をリセット(交...
}
//↓↓以下は、すべてのループが終わった時の動作↓↓
Off(OUT_BC);
} */
*工夫点 [#ffe0873a]
・授業で習ったプログラムと基本的に同じだが、交差点を判別...
・右旋回、左旋回、直進の組み合わせで、交差点での進み方(右...
*反省点 [#tc347190]
・条件分岐や、サブルーチンを無駄に多く使っている(case文で...
・TachoCountを信用しすぎていた。誤差がかなりあったので、...
ページ名: