- 追加された行はこの色です。
- 削除された行はこの色です。
[[2013b/MemberOnly/進行状況]]
#contents
三缶積んだあとにゴールまでライントレースするプログラム
*課題について [#h089b76b]
**コース [#o1980176]
**攻略方針 [#j8a3743e]
//↓缶の発見及び積み上げのための定義↓//
#define CONN 1
#define SIGNAL_A 11
#define SIGNAL_B 12
#define SIGNAL_C 13
#define SIGNAL_D 14
#define SIGNAL_E 15
#define SIGNAL_F 16
#define SIGNAL_G 17
#define go_forward OnFwd(OUT_AB,50);//出力50%で前進
#include "koushin.nxc"
#define tr OnFwdSync(OUT_AB,60,100);
#define tl OnFwdSync(OUT_AB,60,-100);
#define go OnFwdSync(OUT_AB,75,0)
#define unko 60
#define direction 13
#define measure_time 10
*ロボットについて [#wa039a17]
**ボツ案 [#ge64f99a]
**ドライブベース [#k33deb4d]
**アーム [#m2da0dde]
**ハンド [#sc19a7ef]
*プログラムについて [#xe5d81a7]
**缶の探知 [#p1f9ffc3]
**缶の積み上げ [#jfe2a74d]
**ライントレース [#ybe867ea]
三缶積んだあとにゴールまでライントレースするプログラム
//↓ライントレース用の定義↓//
#define BB 37 //閾値
#define BW 47
#define WB 53
#define WW 60
#define OnRL(speedR,speedL) OnFwd(OUT_A,speedR);OnFwd(OUT_B,speedL);
#define FWD OnRL(40,40); //前進
#define T_LEFT OnRL(40,0); //左折
#define T_RIGHT OnRL(0,40); //右折
#define Q_LEFT OnRL(30,-30); //左旋回
#define Q_RIGHT OnRL(-30,30); //右旋回
#define STEP 5 //一回の判断で行う動作の長さ
#define nMAX 20 //カウンタの最大値
#define SB Off(OUT_AB);Wait(500); //小休止
#define cross_line RotateMotorEx(OUT_AB,40,500,0,true,true); //交差点通過
int Online1=0; //交差点通過ためのカウントの変数
int Next=0; //動作変更のための変数
sub CROSS_1() //黒線の右の縁に沿って動き、ゴールを目指す。
{
while(Online1<nMAX){
if(SENSOR_1<BB){
Q_RIGHT;
Online1++;
} else {
if(SENSOR_1<BW){
T_RIGHT;
} else if(SENSOR_1<WB){
FWD;
} else if(SENSOR_1<WW){
T_LEFT;
} else {
Q_LEFT;
}
Online1=0;
}
Wait(STEP);
}
Next++; //T字路と交差点を通過した回数を追加(それぞれ一回ずつ)
SB;
cross_line;
Online1=0; //カウンタをリセット
}
sub can_tsumu()
{//缶を積み、持ち上げるサブルーチン
//↓缶の発見及び積み上げのための定義↓//
#define CONN 1
#define SIGNAL_A 11
#define SIGNAL_B 12
#define SIGNAL_C 13
#define SIGNAL_D 14
#define SIGNAL_E 15
#define SIGNAL_F 16
#define SIGNAL_G 17
#define go_forward OnFwd(OUT_AB,50);//出力50%で前進
#include "koushin.nxc"
#define tr OnFwdSync(OUT_AB,60,100);
#define tl OnFwdSync(OUT_AB,60,-100);
#define go OnFwdSync(OUT_AB,75,0)
#define unko 60
#define direction 13
#define measure_time 10
//↓ライントレース用の定義↓//
#define BB 37 //閾値
#define BW 47
#define WB 53
#define WW 60
#define OnRL(speedR,speedL) OnFwd(OUT_A,speedR);OnFwd(OUT_B,speedL);
#define FWD OnRL(40,40); //前進
#define T_LEFT OnRL(40,0); //左折
#define T_RIGHT OnRL(0,40); //右折
#define Q_LEFT OnRL(30,-30); //左旋回
#define Q_RIGHT OnRL(-30,30); //右旋回
#define STEP 5 //一回の判断で行う動作の長さ
#define nMAX 20 //カウンタの最大値
#define SB Off(OUT_AB);Wait(500); //小休止
#define cross_line RotateMotorEx(OUT_AB,40,500,0,true,true); //交差点通過
int Online1=0; //交差点通過ためのカウントの変数
int Next=0; //動作変更のための変数
sub CROSS_1() //黒線の右の縁に沿って動き、ゴールを目指す。
{
while(Online1<nMAX){
if(SENSOR_1<BB){
Q_RIGHT;
Online1++;
} else {
if(SENSOR_1<BW){
T_RIGHT;
} else if(SENSOR_1<WB){
FWD;
} else if(SENSOR_1<WW){
T_LEFT;
} else {
Q_LEFT;
}
Online1=0;
}
Wait(STEP);
}
Next++; //T字路と交差点を通過した回数を追加(それぞれ一回ずつ)
SB;
cross_line;
Online1=0; //カウンタをリセット
}
sub can_tsumu()
{//缶を積み、持ち上げるサブルーチン
SendRemoteNumber(CONN,MAILBOX1,SIGNAL_B);
/*Sのメールボックス1にSIGNAL_Bを送信(缶を載せ、離し、アームを最上部へ)*/
Off(OUT_AB);//モータAB停止
receive(MAILBOX2,"SIGNAL_F");
/*Sからメールボックス2にSIGNAL_Fを受信*/
OnRev(OUT_AB,50);Wait(1500);//1.5秒後退
Off(OUT_AB);//モータAB停止
SendRemoteNumber(CONN,MAILBOX1,SIGNAL_A);
/*Sのメールボックス1にSIGNAL_Aを送信(再び缶を掴み、上部へ)*/
Off(OUT_AB);//モータAB停止
receive(MAILBOX2,"SIGNAL_C");
/*Sからメールボックス2にSIGNAL_Cを受信*/
OnFwd(OUT_AB,40);Wait(1000);//1秒前進
OnFwd(OUT_AB,40);Wait(1000);//1秒前進
Off(OUT_AB);Wait(3000);//3秒停止
Off(OUT_AB);Wait(3000);//3秒停止
sendmsg(CONN,MAILBOX1,MAILBOX2,"SIGNAL_D","SIGNAL_E");
/*Sのメールボックス1にSIGNALDを送信*/
sendmsg(CONN,MAILBOX1,MAILBOX2,"SIGNAL_D","SIGNAL_E");
/*Sのメールボックス1にSIGNALDを送信*/
}
task main()
{
SetSensorLight(S1); //光センサーを設定
SetSensorLowspeed(S4); //超音波センサーを設定
while(Next<1){ //T字路を渡ったら缶の積み上げに入る
CROSS_1();
}
while(Next==1){
}
task main()
{
OnFwdSync(OUT_AB,40,0); //缶を見つけるまで前進
if(SensorUS(S4)<=12){
TextOut(0,LCD_LINE2,"while(hakken==1)");
can_tsumu();
Next++;
}
}
while(Next==2){ //交差点についたら缶を置く
CROSS_1();
}
while(Next==3){
RotateMotorEx(OUT_AB,40,580,100,true,true); //向きをゴールの方へ向ける
SB; //小休止(連続して動作させると変な動きをするので)
RotateMotorEx(OUT_AB,-40,800,0,true,true); //ゴール内に缶を置けるように後退
SendRemoteNumber(CONN,MAILBOX1,SIGNAL_G); //缶を下ろす
Next++;
}
}
SetSensorLight(S1); //光センサーを設定
SetSensorLowspeed(S4); //超音波センサーを設定
while(Next<1){ //T字路を渡ったら缶の積み上げに入る
CROSS_1();
}
while(Next==1){
OnFwdSync(OUT_AB,40,0); //缶を見つけるまで前進
if(SensorUS(S4)<=12){
TextOut(0,LCD_LINE2,"while(hakken==1)");
can_tsumu();
Next++;
}
}
while(Next==2){ //交差点についたら缶を置く
CROSS_1();
}
while(Next==3){
RotateMotorEx(OUT_AB,40,580,100,true,true); //向きをゴールの方へ向ける
SB; //小休止(連続して動作させると変な動きをするので)
RotateMotorEx(OUT_AB,-40,800,0,true,true); //ゴール内に缶を置けるように後退
SendRemoteNumber(CONN,MAILBOX1,SIGNAL_G); //缶を下ろす
Next++;
}
}