2013b/Member/trtr/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2013b/Member]]
*課題2 [#gde868f5]
**課題のポイント [#h7f5fefb]
#ref(2013b/Member/trtr/Mission2/robocon2013b.png,17.4kb,...
***缶を運ぶ…ライントレースの技術や運んでいく方法が試され...
***缶を積む…どんな方法で積むか、確実に積むことができるか...
***二台のロボットを使ってその連携ができているか…一台ずつ...
**ロボットについて [#t636a00b]
僕達のグループは二台のグループで缶を運ぶ役と缶を積み上げ...
***試作品について[#e927d353]
今回の課題で積み上げを行うロボットを作る際に一番の壁はモ...
#ref(2013b/Member/trtr/Mission2/写真6.JPG,32KB,robot6)
***ロボコン当日のロボット [#h8112edb]
ロボットの全体図。
#ref(2013b/Member/trtr/Mission2/写真.JPG,104kb,robot1)
横のアームで缶を挟みながらロボットの背中の部分にあるタイ...
#ref(2013b/Member/trtr/Mission2/写真 3.JPG,104kb,robot2)
駆動輪の部分。DFとストッパーを使い左輪の後ろ回転を止める...
#ref(2013b/Member/trtr/Mission2/写真 4.JPG,116kb,robot3)
ここからが缶を運ぶロボット。写真だけ載せておくが詳細は下...
[http://yakushi.shinshu-u.ac.jp/robotics/?2013b%2FMember%...
[http://yakushi.shinshu-u.ac.jp/robotics/?2013b%2FMember%...
#ref(2013b/Member/trtr/Mission2/写真 5.JPG,160kb,robot4)
#ref(2013b/Member/trtr/Mission2/bou2.JPG,88kb,robot5)
**プログラムについて [#m9cfc359]
***缶を積み上げるロボット [#z08f6162]
#define HP 3
#define LP 0
#define THRESHOLD 36//ライントレース用閾値
#define turn_right1 OnFwd(OUT_A);//右折マクロ
#define go_forward OnFwd(OUT_AC);//直進マクロ
#define turn_left1 OnFwd(OUT_C);//左折マクロ
#define TIME_TRACE1 3//トレースの1回の判断で待つ時間
#define TIME_TRACE2 500//下記「//4.〜5.」で本体を90度回...
#define NB_COUNT 4//交差点識別用の黒の回数を数える値
#define MESSSAGE_CAN 11//缶が運ばれてきたことを判断する...
缶を積むサブルーチン
sub stack_can() {
OnRev(OUT_B);
*/このサブルーチンを走らせる前ではアームユニットは上がっ...
ユニットを降下させつつアームを開く/*
Wait(120);
Off(OUT_B);
OnFwd(OUT_B);//缶をつかみつつ持ち上げる
Wait(120);
Off(OUT_B);
}
プログラム本体
task main()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
int nbk=0//閾値以下となった回数をカウントする変数
int ncros=0//交差点の回数をカウントする変数
SetPower(OUT_AB,LP);
SetPower(OUT_C,HP);
//1.黒線に当たるまで前進
OnFwd(OUT_AC);
until (SENSOR_2>=THRESHOLD);
//2.左折しライントレース
turn_left1;OnRev(OUT_A);
Wait(80);//90度旋回
ClearTimer(0);
while(ncros=0){//交差点を通過するまでライントレース(この...
while(nbk<NB_COUNT){
if(SENSOR_2<THRESHOLD-3){turn_left1;nbk++;}
else if(SENSOR_2<THRESHOLD+3){OnFwd(OUT_AC);nbk=0;}
else{turn_right1;nbk=0;}
Wait(TIME_TRACE1);
}
Off(OUT_AC);
turn_left1;
Wait(nbk*TIME_TRACE1);
}
//3.交差点を通過後缶を掴んで持ち上げる
OnFwd(OUT_B);
Wait(120);
Off(OUT_B);
//4.タイマーをリセットし適当な地点につくまでライントレース
ClearTimer(0);
while(FastTimer(0)<TIME_TRACE2){//1
if(SENSOR_2<THRESHOLD-3){turn_left1;}
else if(SENSOR_2<THRESHOLD+3){OnFwd(OUT_AC);}
else{turn_right1;}
Wait(TIME_TRACE1);
}//1
//5.90度右旋回し半円の中央にある缶を回収する
turn_right1;Wait(80);//90度右旋回
OnFwd(OUT_AC);
repeat(2){
until(SENSOR_2<THRESHOLD);
until(SENSOR_2>THRESHOLD);
}//ラインを2回またぐ
Off(OUT_AC);
stackile_can();//缶を積む
turn_right1;Wait(90);//90度+a旋回
//6.ゴール直前の交差点までライントレース
ncros=0;
while(ncros<2){//1
while(nbk<NB_COUNT){//2
if(SENSOR_2<THRESHOLD-3){turn_left1;nbk++;}
else if(SENSOR_2<THRESHOLD+3){OnFwd(OUT_AC);}
else{turn_right1;}
Wait(TIME_TRACE1);
}//2
Wait(50);
turn_right1;Wait(NB_COUNT*TIME_TRACE1);
nbk=0;
ncros++;;
}//1
//7.ゴール中央へ移動し待機
turn_left1;Wait(NB_COUNT*TIME_TRACE1/2);
OnFwd(OUT_C);OnRev(OUT_A);Wait(40);//90度左旋回
go_forward;Wait(60);
OnRev(OUT_A);Wait(120);//135度左旋回
//8.通信をして缶を回収し積み上げる動作を繰り返す
ClearMessage();
repeat(2){
until(Message()==MESSAGE_CAN);
stackile can();
ClearMessage();
}
//9.缶を置いてゴールから出る
OnRev(OUT_B);
Wait(120);
Off(OUT_B);
OnRev(OUT_AC);
Wait(400)
Off(OUT_AC);
}
***改正版 [#h7f70a7d]
****関数 [#w22e7054]
#define HP 7
#define LP 2
#define THRESHOLD 36//ライントレース用閾値
#define turn_right1 OnFwd(OUT_A);
#define go_forward OnRev(OUT_A);
#define TIME_TRACE1 3//トレースの1回の判断で待つ時間
#define TIME_TRACE2 500//「4」で本体を90度回転させる地点...
#define NB_COUNT 4//交差点識別用の値
#define STACK 11//
某コンビニの入店音
task play_music()
{
PlayTone(740,28);Wait(5);
PlayTone(587,28);Wait(5);
PlayTone(440,28);Wait(5);
PlayTone(587,28);Wait(5);
PlayTone(659,28);Wait(5);
PlayTone(880,61);Wait(5);
PlayTone(440,28);Wait(5);
PlayTone(659,28);Wait(5);
PlayTone(740,28);Wait(5);
PlayTone(659,28);Wait(5);
PlayTone(440,28);Wait(5);
PlayTone(587,80);
}
****プログラムの本体 [#g03f46f4]
task main()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
SetPower(OUT_A,HP);
int nbk=0;
int ncros=0;
1.黒線に当たるまで前進
OnRev(OUT_A);
until (SENSOR_2<=THRESHOLD);
2.左折しライントレース
turn_right1;
Wait(400);
ClearTimer(0);
while(FastTimer(0)<=1000){
if(SENSOR_2<THRESHOLD){go_forward;}
else{turn_right1;}
Wait(TIME_TRACE1);
}
//缶積み
start play_music;
SetPower(OUT_BC,2);
OnFwd(OUT_B);Wait(68);Off(OUT_B);
stop play_music;
while(ncros<2){//1
while(nbk<NB_COUNT){//2
if(SENSOR_2<THRESHOLD){go_forward;nbk++;}
else{turn_right1;nbk=0;}
Wait(TIME_TRACE1);
}//2
Wait(50);
turn_right1;Wait(NB_COUNT*TIME_TRACE1);
nbk=0;
ncros++;
go_forward;Wait(60);
}//1
while(nbk<NB_COUNT){//1
if(SENSOR_2<THRESHOLD){go_forward;nbk++;}
else{turn_right1;nbk=0;}
Wait(TIME_TRACE1);
}//1
turn_right1;Wait(350);
go_forward;Wait(200);
turn_right1;Wait(170);
until(Message()==STACK);
start play_music;
OnFwd(OUT_C);Wait(1000);
OnRev(OUT_B);Wait(68);Off(OUT_BC);
stop play_music;
turn_right1;Wait(350);Off(OUT_A);
ClearMessage();
repeat(2){
until(Message()==STACK);
OnFwd(OUT_B);Wait(68);Off(OUT_B);
ClearMessage();
until(Message()==STACK);
OnFwd(OUT_C);Wait(1000);
OnRev(OUT_B);Wait(68);Off(OUT_BC);
turn_right1;Wait(350);Off(OUT_A);
ClearMessage();
}
OnRev(OUT_A);
Wait(170);
go_forward;
Wait(600);
Off(OUT_A);
}
***缶を運ぶロボット [#k60cc7cf]
•定義文
#define WHITE 46//白の値
#define BLACK 40//黒(ライン上)の値
//境界の値は上の二つから+、-をもちいて作っています。
#define CATCH 44 //缶をつかんだ時の光センサー3の値
#define power SetPower(OUT_AC,1);//モーターの出力を7段階...
#define go_forward power;OnFwd(OUT_AC);//パワーを抑えた...
#define go_back power;OnRev(OUT_AC);//パワーを抑えた後退
#define LEFT power;OnRev(OUT_A);OnFwd(OUT_C); ...
#define left power;Off(OUT_A);OnFwd(OUT_C); /...
#define RIGHT power;OnFwd(OUT_A);OnRev(OUT_C); ...
#define right power;OnFwd(OUT_A);Off(OUT_C); //...
#define PUSH power;OnRev(OUT_B);Wait(3);Off(OUT_B);Wait(...
//缶を押し出す動作です。モーターの向きからOnRevで棒が飛...
•サブルーチン
ライントレース(右側)
sub trace1_R(){
if (SENSOR_1 < BLACK){
RIGHT;
} else if (SENSOR_1 < BLACK +2){ //黒寄りの境界...
right;
} else if (SENSOR_1 > WHITE -2){ //白寄りの境界...
left;
} else if (SENSOR_1 > WHITE){
LEFT;
}
}
ライントレース(左側)
sub trace1_L(){
if (SENSOR_1 < BLACK){
LEFT;
} else if (SENSOR_1 < BLACK +2){
left;
} else if (SENSOR_1 > WHITE -2){
right;
} else if (SENSOR_1 > WHITE){
RIGHT;
}
}
交差点を判断するライントレース(右側)
sub trace2_R(){
while (FastTimer(0) < 25){ //交差点と判断するま...
if (SENSOR_1 < BLACK){
RIGHT;
}else if (SENSOR_1 < BLACK +2){
ClearTimer(0);
right;
}else if (SENSOR_1 > WHITE -2){
ClearTimer(0);
left;
}else if (SENSOR_1 > WHITE){
ClearTimer(0);
LEFT;
}else{
ClearTimer(0);
go_forward;
}
}
if(FastTimer(0) >= 25){ //交差点での動作です。
ClearTimer(0);
LEFT;
Wait(40);
go_forward;
Wait(20);
Off(OUT_AC);
ClearTimer(0);
}
}
交差点を判断するライントレース(左側)
sub trace2_L(){
while (FastTimer(0) < 25){
if (SENSOR_1 < BLACK){
LEFT;
}else if (SENSOR_1 < BLACK +2){
ClearTimer(0);
left;
}else if (SENSOR_1 > WHITE -2){
ClearTimer(0);
right;
}else if (SENSOR_1 > WHITE){
ClearTimer(0);
RIGHT;
}else{
ClearTimer(0);
go_forward;
}
}
if(FastTimer(0) >= 25){
ClearTimer(0);
RIGHT;
Wait(40);
go_forward;
Wait(20);
Off(OUT_AC);
ClearTimer(0);
}
}
缶の受け渡し(右側トレース時)
sub trace3_R(){
while (FastTimer(0) < 25){
if (SENSOR_1 < BLACK){
RIGHT;
}else if (SENSOR_1 < BLACK +2){
ClearTimer(0);
right;
}else if (SENSOR_1 > WHITE -2){
ClearTimer(0);
left;
}else if (SENSOR_1 > WHITE){
ClearTimer(0);
LEFT;
}else{
ClearTimer(0);
go_forward;
}
}
if(FastTimer(0) >= 25){
go_forward;
Wait(10);
LEFT;
Wait(70);
Off(OUT_AC);
Wait(100);
PUSH;
go_back; //ハサミの接触を避けるため
Wait(100);
Off(OUT_AC);
ClearTimer(0);
}
}
缶の受け渡し(左側)
sub trace3_L(){
while (FastTimer(0) < 25){
if (SENSOR_1 < BLACK){
LEFT;
}else if (SENSOR_1 < BLACK +2){
ClearTimer(0);
left;
}else if (SENSOR_1 > WHITE -2){
ClearTimer(0);
right;
}else if (SENSOR_1 > WHITE){
ClearTimer(0);
RIGHT;
}else{
ClearTimer(0);
go_forward;
}
}
if(FastTimer(0) >= 25){
RIGHT;
Wait(70);
Off(OUT_AC);
PUSH;
go_back;
Wait(50);
Off(OUT_AC);
ClearTimer(0);
}
}
メインタスク
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_3, SENSOR_LIGHT);
ClearTimer(0);
int n=0;
while(n==0){
Wait(100); //相手を待つ時間
until(SENSOR_1 < BLACK){ //黒になるまで...
go_forward;}
Off(OUT_AC);
Wait(100);
go_back; //感知から動作までに進んで...
Wait(15);
Off(OUT_AC);
Wait(30);
n++;
}
while(n==1){
if (SENSOR_3 > CATCH){
PlaySound(SOUND_UP); //缶をつか...
ClearTimer(0);
until(FastTimer(0) > 500){ //?で...
trace1_R();}
LEFT; //?で渡るときの動...
Wait(55);
go_forward;
Wait(20);
until(SENSOR_1 < BLACK){
go_forward;}
ClearTimer(0);
until(FastTimer(0) > 500){ //?を渡...
trace1_R();}
ClearTimer(0);
trace3_R();
n++;
} else if (SENSOR_1 < BLACK){
RIGHT;
} else if (SENSOR_1 < BLACK +2){
right;
} else if (SENSOR_1 > WHITE -2){
left;
} else if (SENSOR_1 > WHITE){
LEFT;
}
}
while(n==2){ //二つ目の缶を運ぶプログラムです。
RIGHT;
Wait(40);
go_forward;
Wait(150);
until(SENSOR_1 < BLACK){
right;}
if (SENSOR_3 > CATCH){
until(SENSOR_1 < BLACK){
LEFT;}
ClearTimer(0);
trace3_L();
n++;
} else if (SENSOR_1 < BLACK){
LEFT;
} else if (SENSOR_1 < BLACK +2){
left;
} else if (SENSOR_1 > WHITE -2){
right;
} else if (SENSOR_1 > WHITE){
RIGHT;
}
}
}
**反省 [#g0c01249]
今回の課題は結果からいうととてもよかったものとは言えない...
終了行:
[[2013b/Member]]
*課題2 [#gde868f5]
**課題のポイント [#h7f5fefb]
#ref(2013b/Member/trtr/Mission2/robocon2013b.png,17.4kb,...
***缶を運ぶ…ライントレースの技術や運んでいく方法が試され...
***缶を積む…どんな方法で積むか、確実に積むことができるか...
***二台のロボットを使ってその連携ができているか…一台ずつ...
**ロボットについて [#t636a00b]
僕達のグループは二台のグループで缶を運ぶ役と缶を積み上げ...
***試作品について[#e927d353]
今回の課題で積み上げを行うロボットを作る際に一番の壁はモ...
#ref(2013b/Member/trtr/Mission2/写真6.JPG,32KB,robot6)
***ロボコン当日のロボット [#h8112edb]
ロボットの全体図。
#ref(2013b/Member/trtr/Mission2/写真.JPG,104kb,robot1)
横のアームで缶を挟みながらロボットの背中の部分にあるタイ...
#ref(2013b/Member/trtr/Mission2/写真 3.JPG,104kb,robot2)
駆動輪の部分。DFとストッパーを使い左輪の後ろ回転を止める...
#ref(2013b/Member/trtr/Mission2/写真 4.JPG,116kb,robot3)
ここからが缶を運ぶロボット。写真だけ載せておくが詳細は下...
[http://yakushi.shinshu-u.ac.jp/robotics/?2013b%2FMember%...
[http://yakushi.shinshu-u.ac.jp/robotics/?2013b%2FMember%...
#ref(2013b/Member/trtr/Mission2/写真 5.JPG,160kb,robot4)
#ref(2013b/Member/trtr/Mission2/bou2.JPG,88kb,robot5)
**プログラムについて [#m9cfc359]
***缶を積み上げるロボット [#z08f6162]
#define HP 3
#define LP 0
#define THRESHOLD 36//ライントレース用閾値
#define turn_right1 OnFwd(OUT_A);//右折マクロ
#define go_forward OnFwd(OUT_AC);//直進マクロ
#define turn_left1 OnFwd(OUT_C);//左折マクロ
#define TIME_TRACE1 3//トレースの1回の判断で待つ時間
#define TIME_TRACE2 500//下記「//4.〜5.」で本体を90度回...
#define NB_COUNT 4//交差点識別用の黒の回数を数える値
#define MESSSAGE_CAN 11//缶が運ばれてきたことを判断する...
缶を積むサブルーチン
sub stack_can() {
OnRev(OUT_B);
*/このサブルーチンを走らせる前ではアームユニットは上がっ...
ユニットを降下させつつアームを開く/*
Wait(120);
Off(OUT_B);
OnFwd(OUT_B);//缶をつかみつつ持ち上げる
Wait(120);
Off(OUT_B);
}
プログラム本体
task main()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
int nbk=0//閾値以下となった回数をカウントする変数
int ncros=0//交差点の回数をカウントする変数
SetPower(OUT_AB,LP);
SetPower(OUT_C,HP);
//1.黒線に当たるまで前進
OnFwd(OUT_AC);
until (SENSOR_2>=THRESHOLD);
//2.左折しライントレース
turn_left1;OnRev(OUT_A);
Wait(80);//90度旋回
ClearTimer(0);
while(ncros=0){//交差点を通過するまでライントレース(この...
while(nbk<NB_COUNT){
if(SENSOR_2<THRESHOLD-3){turn_left1;nbk++;}
else if(SENSOR_2<THRESHOLD+3){OnFwd(OUT_AC);nbk=0;}
else{turn_right1;nbk=0;}
Wait(TIME_TRACE1);
}
Off(OUT_AC);
turn_left1;
Wait(nbk*TIME_TRACE1);
}
//3.交差点を通過後缶を掴んで持ち上げる
OnFwd(OUT_B);
Wait(120);
Off(OUT_B);
//4.タイマーをリセットし適当な地点につくまでライントレース
ClearTimer(0);
while(FastTimer(0)<TIME_TRACE2){//1
if(SENSOR_2<THRESHOLD-3){turn_left1;}
else if(SENSOR_2<THRESHOLD+3){OnFwd(OUT_AC);}
else{turn_right1;}
Wait(TIME_TRACE1);
}//1
//5.90度右旋回し半円の中央にある缶を回収する
turn_right1;Wait(80);//90度右旋回
OnFwd(OUT_AC);
repeat(2){
until(SENSOR_2<THRESHOLD);
until(SENSOR_2>THRESHOLD);
}//ラインを2回またぐ
Off(OUT_AC);
stackile_can();//缶を積む
turn_right1;Wait(90);//90度+a旋回
//6.ゴール直前の交差点までライントレース
ncros=0;
while(ncros<2){//1
while(nbk<NB_COUNT){//2
if(SENSOR_2<THRESHOLD-3){turn_left1;nbk++;}
else if(SENSOR_2<THRESHOLD+3){OnFwd(OUT_AC);}
else{turn_right1;}
Wait(TIME_TRACE1);
}//2
Wait(50);
turn_right1;Wait(NB_COUNT*TIME_TRACE1);
nbk=0;
ncros++;;
}//1
//7.ゴール中央へ移動し待機
turn_left1;Wait(NB_COUNT*TIME_TRACE1/2);
OnFwd(OUT_C);OnRev(OUT_A);Wait(40);//90度左旋回
go_forward;Wait(60);
OnRev(OUT_A);Wait(120);//135度左旋回
//8.通信をして缶を回収し積み上げる動作を繰り返す
ClearMessage();
repeat(2){
until(Message()==MESSAGE_CAN);
stackile can();
ClearMessage();
}
//9.缶を置いてゴールから出る
OnRev(OUT_B);
Wait(120);
Off(OUT_B);
OnRev(OUT_AC);
Wait(400)
Off(OUT_AC);
}
***改正版 [#h7f70a7d]
****関数 [#w22e7054]
#define HP 7
#define LP 2
#define THRESHOLD 36//ライントレース用閾値
#define turn_right1 OnFwd(OUT_A);
#define go_forward OnRev(OUT_A);
#define TIME_TRACE1 3//トレースの1回の判断で待つ時間
#define TIME_TRACE2 500//「4」で本体を90度回転させる地点...
#define NB_COUNT 4//交差点識別用の値
#define STACK 11//
某コンビニの入店音
task play_music()
{
PlayTone(740,28);Wait(5);
PlayTone(587,28);Wait(5);
PlayTone(440,28);Wait(5);
PlayTone(587,28);Wait(5);
PlayTone(659,28);Wait(5);
PlayTone(880,61);Wait(5);
PlayTone(440,28);Wait(5);
PlayTone(659,28);Wait(5);
PlayTone(740,28);Wait(5);
PlayTone(659,28);Wait(5);
PlayTone(440,28);Wait(5);
PlayTone(587,80);
}
****プログラムの本体 [#g03f46f4]
task main()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
SetPower(OUT_A,HP);
int nbk=0;
int ncros=0;
1.黒線に当たるまで前進
OnRev(OUT_A);
until (SENSOR_2<=THRESHOLD);
2.左折しライントレース
turn_right1;
Wait(400);
ClearTimer(0);
while(FastTimer(0)<=1000){
if(SENSOR_2<THRESHOLD){go_forward;}
else{turn_right1;}
Wait(TIME_TRACE1);
}
//缶積み
start play_music;
SetPower(OUT_BC,2);
OnFwd(OUT_B);Wait(68);Off(OUT_B);
stop play_music;
while(ncros<2){//1
while(nbk<NB_COUNT){//2
if(SENSOR_2<THRESHOLD){go_forward;nbk++;}
else{turn_right1;nbk=0;}
Wait(TIME_TRACE1);
}//2
Wait(50);
turn_right1;Wait(NB_COUNT*TIME_TRACE1);
nbk=0;
ncros++;
go_forward;Wait(60);
}//1
while(nbk<NB_COUNT){//1
if(SENSOR_2<THRESHOLD){go_forward;nbk++;}
else{turn_right1;nbk=0;}
Wait(TIME_TRACE1);
}//1
turn_right1;Wait(350);
go_forward;Wait(200);
turn_right1;Wait(170);
until(Message()==STACK);
start play_music;
OnFwd(OUT_C);Wait(1000);
OnRev(OUT_B);Wait(68);Off(OUT_BC);
stop play_music;
turn_right1;Wait(350);Off(OUT_A);
ClearMessage();
repeat(2){
until(Message()==STACK);
OnFwd(OUT_B);Wait(68);Off(OUT_B);
ClearMessage();
until(Message()==STACK);
OnFwd(OUT_C);Wait(1000);
OnRev(OUT_B);Wait(68);Off(OUT_BC);
turn_right1;Wait(350);Off(OUT_A);
ClearMessage();
}
OnRev(OUT_A);
Wait(170);
go_forward;
Wait(600);
Off(OUT_A);
}
***缶を運ぶロボット [#k60cc7cf]
•定義文
#define WHITE 46//白の値
#define BLACK 40//黒(ライン上)の値
//境界の値は上の二つから+、-をもちいて作っています。
#define CATCH 44 //缶をつかんだ時の光センサー3の値
#define power SetPower(OUT_AC,1);//モーターの出力を7段階...
#define go_forward power;OnFwd(OUT_AC);//パワーを抑えた...
#define go_back power;OnRev(OUT_AC);//パワーを抑えた後退
#define LEFT power;OnRev(OUT_A);OnFwd(OUT_C); ...
#define left power;Off(OUT_A);OnFwd(OUT_C); /...
#define RIGHT power;OnFwd(OUT_A);OnRev(OUT_C); ...
#define right power;OnFwd(OUT_A);Off(OUT_C); //...
#define PUSH power;OnRev(OUT_B);Wait(3);Off(OUT_B);Wait(...
//缶を押し出す動作です。モーターの向きからOnRevで棒が飛...
•サブルーチン
ライントレース(右側)
sub trace1_R(){
if (SENSOR_1 < BLACK){
RIGHT;
} else if (SENSOR_1 < BLACK +2){ //黒寄りの境界...
right;
} else if (SENSOR_1 > WHITE -2){ //白寄りの境界...
left;
} else if (SENSOR_1 > WHITE){
LEFT;
}
}
ライントレース(左側)
sub trace1_L(){
if (SENSOR_1 < BLACK){
LEFT;
} else if (SENSOR_1 < BLACK +2){
left;
} else if (SENSOR_1 > WHITE -2){
right;
} else if (SENSOR_1 > WHITE){
RIGHT;
}
}
交差点を判断するライントレース(右側)
sub trace2_R(){
while (FastTimer(0) < 25){ //交差点と判断するま...
if (SENSOR_1 < BLACK){
RIGHT;
}else if (SENSOR_1 < BLACK +2){
ClearTimer(0);
right;
}else if (SENSOR_1 > WHITE -2){
ClearTimer(0);
left;
}else if (SENSOR_1 > WHITE){
ClearTimer(0);
LEFT;
}else{
ClearTimer(0);
go_forward;
}
}
if(FastTimer(0) >= 25){ //交差点での動作です。
ClearTimer(0);
LEFT;
Wait(40);
go_forward;
Wait(20);
Off(OUT_AC);
ClearTimer(0);
}
}
交差点を判断するライントレース(左側)
sub trace2_L(){
while (FastTimer(0) < 25){
if (SENSOR_1 < BLACK){
LEFT;
}else if (SENSOR_1 < BLACK +2){
ClearTimer(0);
left;
}else if (SENSOR_1 > WHITE -2){
ClearTimer(0);
right;
}else if (SENSOR_1 > WHITE){
ClearTimer(0);
RIGHT;
}else{
ClearTimer(0);
go_forward;
}
}
if(FastTimer(0) >= 25){
ClearTimer(0);
RIGHT;
Wait(40);
go_forward;
Wait(20);
Off(OUT_AC);
ClearTimer(0);
}
}
缶の受け渡し(右側トレース時)
sub trace3_R(){
while (FastTimer(0) < 25){
if (SENSOR_1 < BLACK){
RIGHT;
}else if (SENSOR_1 < BLACK +2){
ClearTimer(0);
right;
}else if (SENSOR_1 > WHITE -2){
ClearTimer(0);
left;
}else if (SENSOR_1 > WHITE){
ClearTimer(0);
LEFT;
}else{
ClearTimer(0);
go_forward;
}
}
if(FastTimer(0) >= 25){
go_forward;
Wait(10);
LEFT;
Wait(70);
Off(OUT_AC);
Wait(100);
PUSH;
go_back; //ハサミの接触を避けるため
Wait(100);
Off(OUT_AC);
ClearTimer(0);
}
}
缶の受け渡し(左側)
sub trace3_L(){
while (FastTimer(0) < 25){
if (SENSOR_1 < BLACK){
LEFT;
}else if (SENSOR_1 < BLACK +2){
ClearTimer(0);
left;
}else if (SENSOR_1 > WHITE -2){
ClearTimer(0);
right;
}else if (SENSOR_1 > WHITE){
ClearTimer(0);
RIGHT;
}else{
ClearTimer(0);
go_forward;
}
}
if(FastTimer(0) >= 25){
RIGHT;
Wait(70);
Off(OUT_AC);
PUSH;
go_back;
Wait(50);
Off(OUT_AC);
ClearTimer(0);
}
}
メインタスク
task main()
{
SetSensor(SENSOR_1, SENSOR_LIGHT);
SetSensor(SENSOR_3, SENSOR_LIGHT);
ClearTimer(0);
int n=0;
while(n==0){
Wait(100); //相手を待つ時間
until(SENSOR_1 < BLACK){ //黒になるまで...
go_forward;}
Off(OUT_AC);
Wait(100);
go_back; //感知から動作までに進んで...
Wait(15);
Off(OUT_AC);
Wait(30);
n++;
}
while(n==1){
if (SENSOR_3 > CATCH){
PlaySound(SOUND_UP); //缶をつか...
ClearTimer(0);
until(FastTimer(0) > 500){ //?で...
trace1_R();}
LEFT; //?で渡るときの動...
Wait(55);
go_forward;
Wait(20);
until(SENSOR_1 < BLACK){
go_forward;}
ClearTimer(0);
until(FastTimer(0) > 500){ //?を渡...
trace1_R();}
ClearTimer(0);
trace3_R();
n++;
} else if (SENSOR_1 < BLACK){
RIGHT;
} else if (SENSOR_1 < BLACK +2){
right;
} else if (SENSOR_1 > WHITE -2){
left;
} else if (SENSOR_1 > WHITE){
LEFT;
}
}
while(n==2){ //二つ目の缶を運ぶプログラムです。
RIGHT;
Wait(40);
go_forward;
Wait(150);
until(SENSOR_1 < BLACK){
right;}
if (SENSOR_3 > CATCH){
until(SENSOR_1 < BLACK){
LEFT;}
ClearTimer(0);
trace3_L();
n++;
} else if (SENSOR_1 < BLACK){
LEFT;
} else if (SENSOR_1 < BLACK +2){
left;
} else if (SENSOR_1 > WHITE -2){
right;
} else if (SENSOR_1 > WHITE){
RIGHT;
}
}
}
**反省 [#g0c01249]
今回の課題は結果からいうととてもよかったものとは言えない...
ページ名: