2017b/Member/onodera/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
目次
#contents
*課題 [#n95b1eaf]
ライントレースマシーンの作成
#ref(./2017b-mission2.png,80%,コース)
私は第三コースを担当した。第三コースは、
Aをスタート
Bを直進
Cを直進
D地点の紙コップを取得して来たコース戻りCへ向かう
Cを左折
Fを直進
Rを左折(一時停止)
Pを直進
X地点に紙コップを置いてコースに戻る
Qを左折
Sを右折(一時停止)
Fを左折(一時停止)
Cを右折(一時停止)
D地点へ(ゴール)
というコースです。
*ロボットの説明 [#bcf1227f]
&ref(./DSC_0139.JPG,50%,全体);&ref(./DSC_0138.JPG,50%,前)...
本体は基本的な3輪型のロボットで基盤の部分に直接アームを...
ロボット本体とセンサーをなるべく近づけ小回りがきくように...
また、アーム部分は複雑な構造にせずコップを囲むだけのよう...
*プログラムについて [#xfe70714]
**プログラム全体 [#eef9cbcc]
#define SPEED_H 40
#define SPEED_L 25
#define THRESHOLD 45
#define turn_right0 OnFwd(OUT_C,SPEED_L);OnFwd(OUT_A,-SP...
#define turn_right1 OnFwd(OUT_C,SPEED_L);Off(OUT_A)
#define go_forward OnFwd(OUT_AC,SPEED_H)
#define turn_left0 OnFwd(OUT_A,SPEED_L);OnFwd(OUT_C,-SPE...
#define turn_left1 OnFwd(OUT_A,SPEED_L);Off(OUT_C)
sub follow_line0()
{
if(SENSOR_4<THRESHOLD-6) {
turn_left0;
}else if(SENSOR_4<THRESHOLD-3){
turn_left1;
} else if(SENSOR_4<THRESHOLD+3) {
go_forward;
} else if(SENSOR_4<THRESHOLD+6) {
turn_right1;
} else{
turn_right0;
}
}
sub follow_line1(int nMAX)
{
SetSensorLight(S4);
int nOnline=0;
while(nOnline<nMAX){
if(SENSOR_4<THRESHOLD-6) {
turn_left0;
nOnline++;
} else{
if(SENSOR_4<THRESHOLD-3){
turn_left1;
} else if(SENSOR_4<THRESHOLD+3) {
go_forward;
} else if(SENSOR_4<THRESHOLD+6) {
turn_right1;
} else{
turn_right0;
}
nOnline=0;
}
}
}
sub follow_line2(long time)
{
SetSensorLight(S4);
long t0;
t0=CurrentTick();
while(CurrentTick()-t0<time){
follow_line0();
}
follow_line1(300);
}
sub follow_line3(long time)
{
SetSensorLight(S4);
long t1;
t1=CurrentTick();
while(CurrentTick()-t1<time){
follow_line0();
}
Off(OUT_AC);
}
sub sound()
{
Off(OUT_AC);
Wait(200);
PlaySound(SOUND_CLICK);
Wait(1000);
}
sub cross_right(int cross_time)
{
turn_right0;
Wait(cross_time);
OnFwd(OUT_AC,SPEED_H);
Wait(300);
}
sub cross_left()
{
turn_left0;
Wait(500);
OnFwd(OUT_AC,SPEED_H);
Wait(200);
}
sub catch_cup()
{
turn_right0;
Wait(300);
Off(OUT_AC);
Wait(200);
OnFwd(OUT_AC,SPEED_H);
Wait(500);
Off(OUT_AC);
Wait(200);
RotateMotor(OUT_B,10,50);
OnFwd(OUT_AC,-SPEED_H);
Wait(800);
turn_right0;
Wait(700);
OnFwd(OUT_AC,SPEED_H);
Wait(350);
}
sub release_cup()
{
turn_right0;
Wait(1300);
Off(OUT_AC);
Wait(200);
OnFwd(OUT_AC,SPEED_H);
Wait(500);
Off(OUT_AC);
Wait(200);
RotateMotor(OUT_B,-10,60);
OnFwd(OUT_AC,-SPEED_H);
Wait(900);
turn_left0;
Wait(700);
}
task main()
{
follow_line1(300);
Off(OUT_AC);
Wait(100);
catch_cup();
follow_line2(16000);
sound();
turn_left0;
Wait(500);
OnFwd(OUT_AC,SPEED_H);
Wait(200);
follow_line2(1500);
cross_right(400);
follow_line3(3500);
release_cup();
follow_line2(4000);
sound();
cross_right(600);
follow_line1(300);
sound();
cross_left();
follow_line2(2000);
sound();
cross_right(1500);
OnFwd(OUT_AC,SPEED_H);
Wait(1000);
Off(OUT_AC);
}
**マクロ [#jb7afe51]
#define SPEED_H 40 //速く移動...
#define SPEED_L 25 //遅く移動...
#define THRESHOLD 45 //しきい値45
#define turn_right0 OnFwd(OUT_C,SPEED_L);OnFwd(OUT_A,-S...
#define turn_right1 OnFwd(OUT_C,SPEED_L);Off(OUT_A) ...
#define go_forward OnFwd(OUT_AC,SPEED_H) ...
#define turn_left0 OnFwd(OUT_A,SPEED_L);OnFwd(OUT_C,-SP...
#define turn_left1 OnFwd(OUT_A,SPEED_L);Off(OUT_C) ...
**サブ関数 [#gfb98a48]
交差点を判断するうえで重要になってくるwhile内の nOnline<n...
1. nOnline<nMAX について
交差点の判断ではカウンタを利用した。nOnlineという引数が連...
2.CurrentTick()-t0<time について
CurrentTick()は行われているサブ関数が開始してから現在まで...
sub follow_line0() //ひたすらト...
{
if(SENSOR_4<THRESHOLD-6) {
turn_left0;
}else if(SENSOR_4<THRESHOLD-3){
turn_left1;
} else if(SENSOR_4<THRESHOLD+3) {
go_forward;
} else if(SENSOR_4<THRESHOLD+6) {
turn_right1;
} else{
turn_right0;
}
}
sub follow_line1(int nMAX) //交差点を...
{
SetSensorLight(S4);
int nOnline=0;
while(nOnline<nMAX){
if(SENSOR_4<THRESHOLD-6) {
turn_left0;
nOnline++;
} else{
if(SENSOR_4<THRESHOLD-3){
turn_left1;
} else if(SENSOR_4<THRESHOLD+3) {
go_forward;
} else if(SENSOR_4<THRESHOLD+6) {
turn_right1;
} else{
turn_right0;
}
nOnline=0;
}
}
}
sub follow_line2(long time) //指定した時...
{
SetSensorLight(S4);
long t0;
t0=CurrentTick();
while(CurrentTick()-t0<time){
follow_line0();
}
follow_line1(300);
}
sub follow_line3(long time) //指定した時間...
{
SetSensorLight(S4);
long t1;
t1=CurrentTick();
while(CurrentTick()-t1<time){
follow_line0();
}
Off(OUT_AC);
}
sub sound() //音を鳴らす関数
{
Off(OUT_AC);
Wait(200);
PlaySound(SOUND_CLICK);
Wait(1000);
}
sub cross_right(int cross_time) //交差点、T字...
{
turn_right0;
Wait(cross_time);
OnFwd(OUT_AC,SPEED_H);
Wait(300);
}
sub cross_left() //交差点、T字路を識...
{
turn_left0;
Wait(500);
OnFwd(OUT_AC,SPEED_H);
Wait(200);
}
sub catch_cup() //コップを取りに行き、...
{
turn_right0;
Wait(300);
Off(OUT_AC);
Wait(200);
OnFwd(OUT_AC,SPEED_H);
Wait(500);
Off(OUT_AC);
Wait(200);
RotateMotor(OUT_B,10,50);
OnFwd(OUT_AC,-SPEED_H);
Wait(800);
turn_right0;
Wait(700);
OnFwd(OUT_AC,SPEED_H);
Wait(350);
}
sub release_cup() //コップを指定された場所...
{
turn_right0;
Wait(1300);
Off(OUT_AC);
Wait(200);
OnFwd(OUT_AC,SPEED_H);
Wait(500);
Off(OUT_AC);
Wait(200);
RotateMotor(OUT_B,-10,60);
OnFwd(OUT_AC,-SPEED_H);
Wait(900);
turn_left0;
Wait(700);
}
**メイン関数 [#rc1b99b4]
この課題を成功させるうえで上でもっとも重要なことは交差点...
task main()
{
follow_line1(300); //Aをスタート...
Off(OUT_AC);
Wait(100);
catch_cup(); //コップを取り...
follow_line2(16000); //DからRまでい...
sound(); //音を出す
turn_left0; //左旋回
Wait(500);
OnFwd(OUT_AC,SPEED_H); //前進(これで...
Wait(200);
follow_line2(1500); //RからPまで行...
cross_right(400); //PのT字路を通過
follow_line3(3500); //PからPとQの間...
release_cup(); //コップを指定さ...
follow_line2(4000); //コースに戻った...
sound(); //音を出す
cross_right(600); //右に旋回し交差...
follow_line1(300); //SからFまで行く
sound(); //音を出す
cross_left(); //左旋回して左折...
follow_line2(2000); //FからCまで行く
sound(); //音を出す
cross_right(1500); //右折してT字路を...
OnFwd(OUT_AC,SPEED_H); //前進してゴール
Wait(1000);
Off(OUT_AC);
}
*まとめ [#d1fa0513]
ロボット本体については、思い切ってほぼゼロから組み立てた...
プログラムについては、しきい値とそのプラスマイナスの値で...
反省点は、電池の残量によって動くスピードが変わってしまう...
前回の習字ロボットではうまくいかなかったが今回は本番でも...
終了行:
目次
#contents
*課題 [#n95b1eaf]
ライントレースマシーンの作成
#ref(./2017b-mission2.png,80%,コース)
私は第三コースを担当した。第三コースは、
Aをスタート
Bを直進
Cを直進
D地点の紙コップを取得して来たコース戻りCへ向かう
Cを左折
Fを直進
Rを左折(一時停止)
Pを直進
X地点に紙コップを置いてコースに戻る
Qを左折
Sを右折(一時停止)
Fを左折(一時停止)
Cを右折(一時停止)
D地点へ(ゴール)
というコースです。
*ロボットの説明 [#bcf1227f]
&ref(./DSC_0139.JPG,50%,全体);&ref(./DSC_0138.JPG,50%,前)...
本体は基本的な3輪型のロボットで基盤の部分に直接アームを...
ロボット本体とセンサーをなるべく近づけ小回りがきくように...
また、アーム部分は複雑な構造にせずコップを囲むだけのよう...
*プログラムについて [#xfe70714]
**プログラム全体 [#eef9cbcc]
#define SPEED_H 40
#define SPEED_L 25
#define THRESHOLD 45
#define turn_right0 OnFwd(OUT_C,SPEED_L);OnFwd(OUT_A,-SP...
#define turn_right1 OnFwd(OUT_C,SPEED_L);Off(OUT_A)
#define go_forward OnFwd(OUT_AC,SPEED_H)
#define turn_left0 OnFwd(OUT_A,SPEED_L);OnFwd(OUT_C,-SPE...
#define turn_left1 OnFwd(OUT_A,SPEED_L);Off(OUT_C)
sub follow_line0()
{
if(SENSOR_4<THRESHOLD-6) {
turn_left0;
}else if(SENSOR_4<THRESHOLD-3){
turn_left1;
} else if(SENSOR_4<THRESHOLD+3) {
go_forward;
} else if(SENSOR_4<THRESHOLD+6) {
turn_right1;
} else{
turn_right0;
}
}
sub follow_line1(int nMAX)
{
SetSensorLight(S4);
int nOnline=0;
while(nOnline<nMAX){
if(SENSOR_4<THRESHOLD-6) {
turn_left0;
nOnline++;
} else{
if(SENSOR_4<THRESHOLD-3){
turn_left1;
} else if(SENSOR_4<THRESHOLD+3) {
go_forward;
} else if(SENSOR_4<THRESHOLD+6) {
turn_right1;
} else{
turn_right0;
}
nOnline=0;
}
}
}
sub follow_line2(long time)
{
SetSensorLight(S4);
long t0;
t0=CurrentTick();
while(CurrentTick()-t0<time){
follow_line0();
}
follow_line1(300);
}
sub follow_line3(long time)
{
SetSensorLight(S4);
long t1;
t1=CurrentTick();
while(CurrentTick()-t1<time){
follow_line0();
}
Off(OUT_AC);
}
sub sound()
{
Off(OUT_AC);
Wait(200);
PlaySound(SOUND_CLICK);
Wait(1000);
}
sub cross_right(int cross_time)
{
turn_right0;
Wait(cross_time);
OnFwd(OUT_AC,SPEED_H);
Wait(300);
}
sub cross_left()
{
turn_left0;
Wait(500);
OnFwd(OUT_AC,SPEED_H);
Wait(200);
}
sub catch_cup()
{
turn_right0;
Wait(300);
Off(OUT_AC);
Wait(200);
OnFwd(OUT_AC,SPEED_H);
Wait(500);
Off(OUT_AC);
Wait(200);
RotateMotor(OUT_B,10,50);
OnFwd(OUT_AC,-SPEED_H);
Wait(800);
turn_right0;
Wait(700);
OnFwd(OUT_AC,SPEED_H);
Wait(350);
}
sub release_cup()
{
turn_right0;
Wait(1300);
Off(OUT_AC);
Wait(200);
OnFwd(OUT_AC,SPEED_H);
Wait(500);
Off(OUT_AC);
Wait(200);
RotateMotor(OUT_B,-10,60);
OnFwd(OUT_AC,-SPEED_H);
Wait(900);
turn_left0;
Wait(700);
}
task main()
{
follow_line1(300);
Off(OUT_AC);
Wait(100);
catch_cup();
follow_line2(16000);
sound();
turn_left0;
Wait(500);
OnFwd(OUT_AC,SPEED_H);
Wait(200);
follow_line2(1500);
cross_right(400);
follow_line3(3500);
release_cup();
follow_line2(4000);
sound();
cross_right(600);
follow_line1(300);
sound();
cross_left();
follow_line2(2000);
sound();
cross_right(1500);
OnFwd(OUT_AC,SPEED_H);
Wait(1000);
Off(OUT_AC);
}
**マクロ [#jb7afe51]
#define SPEED_H 40 //速く移動...
#define SPEED_L 25 //遅く移動...
#define THRESHOLD 45 //しきい値45
#define turn_right0 OnFwd(OUT_C,SPEED_L);OnFwd(OUT_A,-S...
#define turn_right1 OnFwd(OUT_C,SPEED_L);Off(OUT_A) ...
#define go_forward OnFwd(OUT_AC,SPEED_H) ...
#define turn_left0 OnFwd(OUT_A,SPEED_L);OnFwd(OUT_C,-SP...
#define turn_left1 OnFwd(OUT_A,SPEED_L);Off(OUT_C) ...
**サブ関数 [#gfb98a48]
交差点を判断するうえで重要になってくるwhile内の nOnline<n...
1. nOnline<nMAX について
交差点の判断ではカウンタを利用した。nOnlineという引数が連...
2.CurrentTick()-t0<time について
CurrentTick()は行われているサブ関数が開始してから現在まで...
sub follow_line0() //ひたすらト...
{
if(SENSOR_4<THRESHOLD-6) {
turn_left0;
}else if(SENSOR_4<THRESHOLD-3){
turn_left1;
} else if(SENSOR_4<THRESHOLD+3) {
go_forward;
} else if(SENSOR_4<THRESHOLD+6) {
turn_right1;
} else{
turn_right0;
}
}
sub follow_line1(int nMAX) //交差点を...
{
SetSensorLight(S4);
int nOnline=0;
while(nOnline<nMAX){
if(SENSOR_4<THRESHOLD-6) {
turn_left0;
nOnline++;
} else{
if(SENSOR_4<THRESHOLD-3){
turn_left1;
} else if(SENSOR_4<THRESHOLD+3) {
go_forward;
} else if(SENSOR_4<THRESHOLD+6) {
turn_right1;
} else{
turn_right0;
}
nOnline=0;
}
}
}
sub follow_line2(long time) //指定した時...
{
SetSensorLight(S4);
long t0;
t0=CurrentTick();
while(CurrentTick()-t0<time){
follow_line0();
}
follow_line1(300);
}
sub follow_line3(long time) //指定した時間...
{
SetSensorLight(S4);
long t1;
t1=CurrentTick();
while(CurrentTick()-t1<time){
follow_line0();
}
Off(OUT_AC);
}
sub sound() //音を鳴らす関数
{
Off(OUT_AC);
Wait(200);
PlaySound(SOUND_CLICK);
Wait(1000);
}
sub cross_right(int cross_time) //交差点、T字...
{
turn_right0;
Wait(cross_time);
OnFwd(OUT_AC,SPEED_H);
Wait(300);
}
sub cross_left() //交差点、T字路を識...
{
turn_left0;
Wait(500);
OnFwd(OUT_AC,SPEED_H);
Wait(200);
}
sub catch_cup() //コップを取りに行き、...
{
turn_right0;
Wait(300);
Off(OUT_AC);
Wait(200);
OnFwd(OUT_AC,SPEED_H);
Wait(500);
Off(OUT_AC);
Wait(200);
RotateMotor(OUT_B,10,50);
OnFwd(OUT_AC,-SPEED_H);
Wait(800);
turn_right0;
Wait(700);
OnFwd(OUT_AC,SPEED_H);
Wait(350);
}
sub release_cup() //コップを指定された場所...
{
turn_right0;
Wait(1300);
Off(OUT_AC);
Wait(200);
OnFwd(OUT_AC,SPEED_H);
Wait(500);
Off(OUT_AC);
Wait(200);
RotateMotor(OUT_B,-10,60);
OnFwd(OUT_AC,-SPEED_H);
Wait(900);
turn_left0;
Wait(700);
}
**メイン関数 [#rc1b99b4]
この課題を成功させるうえで上でもっとも重要なことは交差点...
task main()
{
follow_line1(300); //Aをスタート...
Off(OUT_AC);
Wait(100);
catch_cup(); //コップを取り...
follow_line2(16000); //DからRまでい...
sound(); //音を出す
turn_left0; //左旋回
Wait(500);
OnFwd(OUT_AC,SPEED_H); //前進(これで...
Wait(200);
follow_line2(1500); //RからPまで行...
cross_right(400); //PのT字路を通過
follow_line3(3500); //PからPとQの間...
release_cup(); //コップを指定さ...
follow_line2(4000); //コースに戻った...
sound(); //音を出す
cross_right(600); //右に旋回し交差...
follow_line1(300); //SからFまで行く
sound(); //音を出す
cross_left(); //左旋回して左折...
follow_line2(2000); //FからCまで行く
sound(); //音を出す
cross_right(1500); //右折してT字路を...
OnFwd(OUT_AC,SPEED_H); //前進してゴール
Wait(1000);
Off(OUT_AC);
}
*まとめ [#d1fa0513]
ロボット本体については、思い切ってほぼゼロから組み立てた...
プログラムについては、しきい値とそのプラスマイナスの値で...
反省点は、電池の残量によって動くスピードが変わってしまう...
前回の習字ロボットではうまくいかなかったが今回は本番でも...
ページ名: