2019b/Member/yamaji/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
目次
#contents
*課題3 [#fa13243d]
課題3は簡単にまとめると缶の上に乗っているボールを別の缶の...
*ロボットの説明 [#k0336c96]
私たちは効率を重視し、3つのボールを一度に運ぶロボットを作...
**ボールを確保し、貯めておく機構 [#ccbd3067]
#ref(2019b/Member/yamaji/Mission3/枠.jpg,50%,ゴム枠)
ボールを確保する機構は上の写真のように、ゴムを使って組み...
#ref(2019b/Member/yamaji/Mission3/キャッチ1.JPG,50%,ボー...
ボールを確保するにはゴム枠をボールに押し付ける。すると、...
ボールを確保したら、そのままゴム枠を上に上げることで、ゴ...
**ボールを缶の上に乗せる機構 [#sf44c204]
&ref(2019b/Member/yamaji/Mission3/アーム.jpg,50%,アーム);
&ref(2019b/Member/yamaji/Mission3/置く.jpg,50%,置く仕組み);
ボールを缶に乗せる時のポイントとなるのは左の写真のアーム...
1つは下に示す棒についてである。少し見えにくいが、この棒が...
#ref(2019b/Member/yamaji/Mission3/棒の役割.jpg,50%,アーム)
2つ目は、ボールを缶に乗せるときにゴム枠にボールが一つず...
#ref(2019b/Member/yamaji/Mission3/つっかえ.jpg,50%,アーム)
**センサ [#j26996ce]
缶の位置の把握には超音波センサを使った。超音波センサは付...
#ref(2019b/Member/yamaji/Mission3/初期位置1.jpg,50%,超音...
その他のセンサとしては、光センサをライントレースのために2...
**全体 [#vb9f84f1]
&ref(2019b/Member/yamaji/Mission3/全体像1.jpg,50%,全体像);
&ref(2019b/Member/yamaji/Mission3/コード.jpg,50%,キャスタ...
最終的な全体像はこのようになった。初めは写真のキャスター...
また、初めはボールを掴む機構と缶に置く機構を別々に逆方向...
*プログラムの説明 [#kf274dc0]
**旋回のプログラム [#hec2e5be]
その場で旋回するのはよく使うため、関数にしておいた。
void turnAng(long ang) //ang度の反時計回りの旋回
{
const float diameter = 5.45; //タイヤの直径
const float track = 11.05; //タイヤ間の幅
const float pi = 3.1415; //円周率
long angle;
angle = (track/diameter)*ang;
RotateMotorEx(OUT_AC,spd,angle,100*sign(ang),true,tr...
}
**前後移動のプログラム [#m2a6d8ad]
私たちのロボットは構造上、缶からボールを取ったあとも超音...
void fwd_back(float d) //距離dcm前進
{
const float diameter = 5.45; //タイヤの直径
const float track = 11.05; //タイヤ間の幅
const float pi = 3.1415; //円周率
long degree;
degree = d/(diameter*pi)*360.0;
RotateMotorEx(OUT_BC,spd,degree,0,true,true);
}
**ライントレースのプログラム [#r4ace34a]
ライントレースでは光センサを2つ使って制御した。
#define spd 35 //ロボットのスピード
#define white 52 //白
#define black 33 //黒
#define SIGNALON 11
#define SIGNALOFF 10
上のように閾値などを設定した。
void follow_line(long tmin, long tmax) //ライントレース(...
{
long t_start;
SetSensorLight(S1);
SetSensorLight(S2);
t_start = CurrentTick(); //この関数が動き始めた時間
float Sl_l, Sl_r; //光センサーの値
Sl_l = SENSOR_1;
Sl_r = SENSOR_2;
int msg; //メッセージを受け取ったあ...
//スタートからtmin以下ではライントレースのみ
while (CurrentTick() - t_start < tmin)
{
long t_start;
Sl_l = SENSOR_1;
Sl_r = SENSOR_2;
ReceiveRemoteNumber(MAILBOX2,true,msg); //メール...
if (msg == SIGNALON)
{
SendResponseNumber(MAILBOX3,SIGNALON);
break;
}
else if ((Sl_l >= white) && (Sl_r >= white) || (...
{
OnFwdSync(OUT_BC,spd,0);
}
else //比例制御をする(詳しくは下で説明する)
{
OnFwd(OUT_B,(spd / (white - black)) * (Sl_l...
OnFwd(OUT_C,(spd / (white - black)) * (Sl_r...
}
}
Off(OUT_BC);
//スタートからtmax以上では停止
while (CurrentTick() - t_start < tmax)
{
Sl_l = SENSOR_1;
Sl_r = SENSOR_2;
ReceiveRemoteNumber(MAILBOX2,true,msg); //メール...
if (msg == SIGNALON)
{
Off(OUT_BC);
SendResponseNumber(MAILBOX3,SIGNALON);
break;
}
else if ((Sl_l >= white) && (Sl_r >= white)) //左...
{
OnFwdSync(OUT_BC,spd,0);
}
else if ((Sl_l <= black - 5) || (Sl_r <= black - ...
{
break;
}
else //比例制御をする(下で説明)
{
OnFwd(OUT_B,(spd / (white - black)) * (Sl_l ...
OnFwd(OUT_C,(spd / (white - black)) * (Sl_r ...
}
}
Off(OUT_BC);
}
比例制御について説明する。
#ref(2019b/Member/yamaji/Mission3/図.JPG,50%,比例制御)
上の写真では光センサの閾値がwhiteに近づくほど出力が大きく...
**ボールを確保するプログラム [#fd9b4a0e]
void catch_ball() //ボールキャッチ
{
Wait(100);
ResetTachoCount(OUT_BC); //角度をリセット
OnFwd(OUT_BC,20); //アームとゴム枠を少し後...
Wait(100);
OnFwd(OUT_C,40); //アームを一番後ろまで移...
Wait(500);
OnFwd(OUT_B,-20); //ゴム枠を缶に当たるまで...
Wait(1700);
RotateMotor(OUT_B,20,150); //ゴム枠を戻してボールを...
OnFwd(OUT_C,-35); //下の3行で超音波センサを...
Wait(700);
RotateMotor(OUT_B,-20,30);
}
**ボールを缶に載せるプログラム [#g9f5cf21]
#define spd 20
void put_ball() //ボールを置く
{
RotateMotor(OUT_B,spd,30); //アームを動かすた...
OnFwd(OUT_C,2 * spd); //アームを一番後ろ...
Wait(1000);
RotateMotor(OUT_C,spd,-5); //アームを少し動か...
Wait(1500);
RotateMotor(OUT_B,spd,-120); //空き缶の上にゴム...
Wait(600);
RotateMotor(OUT_C,spd,-65); //アームでボールを...
Wait(400);
RotateMotor(OUT_B,spd + 10,50); //アームを下ろした...
Wait(500);
OnFwd(OUT_C,2 * spd); //アームを後ろに戻す
Wait(1000);
RotateMotor(OUT_B,spd,70); //下の3行で超音波セ...
RotateMotor(OUT_C,spd,-40);
RotateMotor(OUT_B,spd,-30);
}
**その他のプログラム [#sd3e9595]
***超音波センサの50回の平均値を求めるプログラム [#n3133bf0]
超音波センサはたまにおかしな値を出すときがあるため、より...
float Ultrasonic()
{
long sum = 0;
float Sus;
SetSensorLowspeed(S4);
for (int i = 1;i <= 50;i++) //50回超音波センサの値を...
{
sum = sum + SensorUS(S4);
}
Sus = sum / 50; //超音波センサの値の平均値を求める
return Sus; //超音波センサの平均値を返す
}
***超音波センサを初期位置に移動するプログラム [#a2f4d532]
ロボットを動かし始めたとき、どこに超音波センサがあっても...
#define spd 20
void initialize() //初期化
{
OnFwd(OUT_B,spd);
OnFwd(OUT_C,spd*2); //アームとゴム枠を限界ま...
Wait(1000);
Off(OUT_BC);
Wait(500);
ResetTachoCount(OUT_BC); //アームとゴム枠の角度...
RotateMotor(OUT_C,-spd,40); //アーム移動
Wait(700);
RotateMotor(OUT_B,-spd*2,45);//ゴム枠移動
}
***相互通信をしてボールを確保するプログラム(master側) [...
メインプログラムをすっきりさせたかったので通信からボール...
void catchandgo_m()
{
int msg1_1; //メッセージ...
float Sus = Ultrasonic(); //動き始めた...
Wait(300);
SendRemoteNumber(subs,MAILBOX1,SIGNALON); //スレーブ...
while (true)
{
if (SensorUS(S4) < Sus * (3/5)) //超音波セン...
{
SendRemoteNumber(subs,MAILBOX2,SIGNALON);
}
ReceiveRemoteNumber(MAILBOX3,true,msg1_1); //ス...
if (msg1_1 == SIGNALON)
{
catch_ball();
Wait(500);
SendRemoteNumber(subs,MAILBOX4,SIGNALON);
break;
}
}
}
***相互通信をしてライントレースをするプログラム(slave側...
これもメインプログラムをすっきりさせるために一連の流れと...
void catchandgo_s()
{
int msg2_1,msg2_2; //メッセージを受け取っ...
while(true)
{
ReceiveRemoteNumber(MAILBOX1,true,msg2_1); //マ...
if(msg2_1 == SIGNALON)
{
PlaySound(SOUND_CLICK);
follow_line(20000,100000);
}
ReceiveRemoteNumber(MAILBOX4,true,msg2_2); //マ...
if(msg2_2 == SIGNALON)
{
fwd_back(20);
fwd_back(-20);
Wait(500);
PlaySound(SOUND_LOW_BEEP);
follow_line(1000,10000);
break;
}
}
}
**車体(slave)側のメインプログラム [#u0a41919]
task main()
{
catchandgo_s();
SendResponseNumber(MAILBOX5,SIGNALON); //マスター側の...
catchandgo_s();
Off(OUT_BC);
Wait(700);
turnAng(-100); //Eで旋回
fwd_back(-5);
SendResponseNumber(MAILBOX5,SIGNALON); //マスター側の...
catchandgo_s();
turnAng(-100); //Fで旋回
follow_line(700,10000);
turnAng(100); //Gで旋回
follow_line(700,10000);
turnAng(100); //Hで旋回
follow_line(700,10000);
turnAng(-100); //H'で旋回
follow_line(700,10000);
turnAng(100); //G'で旋回
SendResponseNumber(MAILBOX5,SIGNALON); //マスター側の...
**アーム(master)側のメインプログラム [#jf3011ea]
task main()
{
int msg1_2,msg1_3,msg1_4; //メッセージを...
SetSensorLowspeed(S4);
initialize(); //初期化
Wait(200);
catchandgo_m(); //1つ目のボールを取る
while(true)
{
ReceiveRemoteNumber(MAILBOX5,true,msg1_2); //ス...
if(msg1_2 == SIGNALON)
{
catchandgo_m(); //2つ目のボールを取る
break;
}
}
while(true)
{
ReceiveRemoteNumber(MAILBOX5,true,msg1_3); //ス...
if(msg1_3 == SIGNALON)
{
catchandgo_m(); //3つ目のボールを取る
break;
}
}
while(true)
{
ReceiveRemoteNumber(MAILBOX5,true,msg1_4); //ス...
if(msg1_4 == SIGNALON)
{
put_ball(); //1つ目のボールを置く
break;
}
}
}
*結果 [#o5d338f5]
私のプログラムは時間が足りずボールを一つ置くまでしかでき...
*反省・感想 [#z2f548b2]
まず、今回の課題ではロボットの構造を何度も作り直したり、...
このゼミを通して、プログラムの基礎的なことは身についたと...
終了行:
目次
#contents
*課題3 [#fa13243d]
課題3は簡単にまとめると缶の上に乗っているボールを別の缶の...
*ロボットの説明 [#k0336c96]
私たちは効率を重視し、3つのボールを一度に運ぶロボットを作...
**ボールを確保し、貯めておく機構 [#ccbd3067]
#ref(2019b/Member/yamaji/Mission3/枠.jpg,50%,ゴム枠)
ボールを確保する機構は上の写真のように、ゴムを使って組み...
#ref(2019b/Member/yamaji/Mission3/キャッチ1.JPG,50%,ボー...
ボールを確保するにはゴム枠をボールに押し付ける。すると、...
ボールを確保したら、そのままゴム枠を上に上げることで、ゴ...
**ボールを缶の上に乗せる機構 [#sf44c204]
&ref(2019b/Member/yamaji/Mission3/アーム.jpg,50%,アーム);
&ref(2019b/Member/yamaji/Mission3/置く.jpg,50%,置く仕組み);
ボールを缶に乗せる時のポイントとなるのは左の写真のアーム...
1つは下に示す棒についてである。少し見えにくいが、この棒が...
#ref(2019b/Member/yamaji/Mission3/棒の役割.jpg,50%,アーム)
2つ目は、ボールを缶に乗せるときにゴム枠にボールが一つず...
#ref(2019b/Member/yamaji/Mission3/つっかえ.jpg,50%,アーム)
**センサ [#j26996ce]
缶の位置の把握には超音波センサを使った。超音波センサは付...
#ref(2019b/Member/yamaji/Mission3/初期位置1.jpg,50%,超音...
その他のセンサとしては、光センサをライントレースのために2...
**全体 [#vb9f84f1]
&ref(2019b/Member/yamaji/Mission3/全体像1.jpg,50%,全体像);
&ref(2019b/Member/yamaji/Mission3/コード.jpg,50%,キャスタ...
最終的な全体像はこのようになった。初めは写真のキャスター...
また、初めはボールを掴む機構と缶に置く機構を別々に逆方向...
*プログラムの説明 [#kf274dc0]
**旋回のプログラム [#hec2e5be]
その場で旋回するのはよく使うため、関数にしておいた。
void turnAng(long ang) //ang度の反時計回りの旋回
{
const float diameter = 5.45; //タイヤの直径
const float track = 11.05; //タイヤ間の幅
const float pi = 3.1415; //円周率
long angle;
angle = (track/diameter)*ang;
RotateMotorEx(OUT_AC,spd,angle,100*sign(ang),true,tr...
}
**前後移動のプログラム [#m2a6d8ad]
私たちのロボットは構造上、缶からボールを取ったあとも超音...
void fwd_back(float d) //距離dcm前進
{
const float diameter = 5.45; //タイヤの直径
const float track = 11.05; //タイヤ間の幅
const float pi = 3.1415; //円周率
long degree;
degree = d/(diameter*pi)*360.0;
RotateMotorEx(OUT_BC,spd,degree,0,true,true);
}
**ライントレースのプログラム [#r4ace34a]
ライントレースでは光センサを2つ使って制御した。
#define spd 35 //ロボットのスピード
#define white 52 //白
#define black 33 //黒
#define SIGNALON 11
#define SIGNALOFF 10
上のように閾値などを設定した。
void follow_line(long tmin, long tmax) //ライントレース(...
{
long t_start;
SetSensorLight(S1);
SetSensorLight(S2);
t_start = CurrentTick(); //この関数が動き始めた時間
float Sl_l, Sl_r; //光センサーの値
Sl_l = SENSOR_1;
Sl_r = SENSOR_2;
int msg; //メッセージを受け取ったあ...
//スタートからtmin以下ではライントレースのみ
while (CurrentTick() - t_start < tmin)
{
long t_start;
Sl_l = SENSOR_1;
Sl_r = SENSOR_2;
ReceiveRemoteNumber(MAILBOX2,true,msg); //メール...
if (msg == SIGNALON)
{
SendResponseNumber(MAILBOX3,SIGNALON);
break;
}
else if ((Sl_l >= white) && (Sl_r >= white) || (...
{
OnFwdSync(OUT_BC,spd,0);
}
else //比例制御をする(詳しくは下で説明する)
{
OnFwd(OUT_B,(spd / (white - black)) * (Sl_l...
OnFwd(OUT_C,(spd / (white - black)) * (Sl_r...
}
}
Off(OUT_BC);
//スタートからtmax以上では停止
while (CurrentTick() - t_start < tmax)
{
Sl_l = SENSOR_1;
Sl_r = SENSOR_2;
ReceiveRemoteNumber(MAILBOX2,true,msg); //メール...
if (msg == SIGNALON)
{
Off(OUT_BC);
SendResponseNumber(MAILBOX3,SIGNALON);
break;
}
else if ((Sl_l >= white) && (Sl_r >= white)) //左...
{
OnFwdSync(OUT_BC,spd,0);
}
else if ((Sl_l <= black - 5) || (Sl_r <= black - ...
{
break;
}
else //比例制御をする(下で説明)
{
OnFwd(OUT_B,(spd / (white - black)) * (Sl_l ...
OnFwd(OUT_C,(spd / (white - black)) * (Sl_r ...
}
}
Off(OUT_BC);
}
比例制御について説明する。
#ref(2019b/Member/yamaji/Mission3/図.JPG,50%,比例制御)
上の写真では光センサの閾値がwhiteに近づくほど出力が大きく...
**ボールを確保するプログラム [#fd9b4a0e]
void catch_ball() //ボールキャッチ
{
Wait(100);
ResetTachoCount(OUT_BC); //角度をリセット
OnFwd(OUT_BC,20); //アームとゴム枠を少し後...
Wait(100);
OnFwd(OUT_C,40); //アームを一番後ろまで移...
Wait(500);
OnFwd(OUT_B,-20); //ゴム枠を缶に当たるまで...
Wait(1700);
RotateMotor(OUT_B,20,150); //ゴム枠を戻してボールを...
OnFwd(OUT_C,-35); //下の3行で超音波センサを...
Wait(700);
RotateMotor(OUT_B,-20,30);
}
**ボールを缶に載せるプログラム [#g9f5cf21]
#define spd 20
void put_ball() //ボールを置く
{
RotateMotor(OUT_B,spd,30); //アームを動かすた...
OnFwd(OUT_C,2 * spd); //アームを一番後ろ...
Wait(1000);
RotateMotor(OUT_C,spd,-5); //アームを少し動か...
Wait(1500);
RotateMotor(OUT_B,spd,-120); //空き缶の上にゴム...
Wait(600);
RotateMotor(OUT_C,spd,-65); //アームでボールを...
Wait(400);
RotateMotor(OUT_B,spd + 10,50); //アームを下ろした...
Wait(500);
OnFwd(OUT_C,2 * spd); //アームを後ろに戻す
Wait(1000);
RotateMotor(OUT_B,spd,70); //下の3行で超音波セ...
RotateMotor(OUT_C,spd,-40);
RotateMotor(OUT_B,spd,-30);
}
**その他のプログラム [#sd3e9595]
***超音波センサの50回の平均値を求めるプログラム [#n3133bf0]
超音波センサはたまにおかしな値を出すときがあるため、より...
float Ultrasonic()
{
long sum = 0;
float Sus;
SetSensorLowspeed(S4);
for (int i = 1;i <= 50;i++) //50回超音波センサの値を...
{
sum = sum + SensorUS(S4);
}
Sus = sum / 50; //超音波センサの値の平均値を求める
return Sus; //超音波センサの平均値を返す
}
***超音波センサを初期位置に移動するプログラム [#a2f4d532]
ロボットを動かし始めたとき、どこに超音波センサがあっても...
#define spd 20
void initialize() //初期化
{
OnFwd(OUT_B,spd);
OnFwd(OUT_C,spd*2); //アームとゴム枠を限界ま...
Wait(1000);
Off(OUT_BC);
Wait(500);
ResetTachoCount(OUT_BC); //アームとゴム枠の角度...
RotateMotor(OUT_C,-spd,40); //アーム移動
Wait(700);
RotateMotor(OUT_B,-spd*2,45);//ゴム枠移動
}
***相互通信をしてボールを確保するプログラム(master側) [...
メインプログラムをすっきりさせたかったので通信からボール...
void catchandgo_m()
{
int msg1_1; //メッセージ...
float Sus = Ultrasonic(); //動き始めた...
Wait(300);
SendRemoteNumber(subs,MAILBOX1,SIGNALON); //スレーブ...
while (true)
{
if (SensorUS(S4) < Sus * (3/5)) //超音波セン...
{
SendRemoteNumber(subs,MAILBOX2,SIGNALON);
}
ReceiveRemoteNumber(MAILBOX3,true,msg1_1); //ス...
if (msg1_1 == SIGNALON)
{
catch_ball();
Wait(500);
SendRemoteNumber(subs,MAILBOX4,SIGNALON);
break;
}
}
}
***相互通信をしてライントレースをするプログラム(slave側...
これもメインプログラムをすっきりさせるために一連の流れと...
void catchandgo_s()
{
int msg2_1,msg2_2; //メッセージを受け取っ...
while(true)
{
ReceiveRemoteNumber(MAILBOX1,true,msg2_1); //マ...
if(msg2_1 == SIGNALON)
{
PlaySound(SOUND_CLICK);
follow_line(20000,100000);
}
ReceiveRemoteNumber(MAILBOX4,true,msg2_2); //マ...
if(msg2_2 == SIGNALON)
{
fwd_back(20);
fwd_back(-20);
Wait(500);
PlaySound(SOUND_LOW_BEEP);
follow_line(1000,10000);
break;
}
}
}
**車体(slave)側のメインプログラム [#u0a41919]
task main()
{
catchandgo_s();
SendResponseNumber(MAILBOX5,SIGNALON); //マスター側の...
catchandgo_s();
Off(OUT_BC);
Wait(700);
turnAng(-100); //Eで旋回
fwd_back(-5);
SendResponseNumber(MAILBOX5,SIGNALON); //マスター側の...
catchandgo_s();
turnAng(-100); //Fで旋回
follow_line(700,10000);
turnAng(100); //Gで旋回
follow_line(700,10000);
turnAng(100); //Hで旋回
follow_line(700,10000);
turnAng(-100); //H'で旋回
follow_line(700,10000);
turnAng(100); //G'で旋回
SendResponseNumber(MAILBOX5,SIGNALON); //マスター側の...
**アーム(master)側のメインプログラム [#jf3011ea]
task main()
{
int msg1_2,msg1_3,msg1_4; //メッセージを...
SetSensorLowspeed(S4);
initialize(); //初期化
Wait(200);
catchandgo_m(); //1つ目のボールを取る
while(true)
{
ReceiveRemoteNumber(MAILBOX5,true,msg1_2); //ス...
if(msg1_2 == SIGNALON)
{
catchandgo_m(); //2つ目のボールを取る
break;
}
}
while(true)
{
ReceiveRemoteNumber(MAILBOX5,true,msg1_3); //ス...
if(msg1_3 == SIGNALON)
{
catchandgo_m(); //3つ目のボールを取る
break;
}
}
while(true)
{
ReceiveRemoteNumber(MAILBOX5,true,msg1_4); //ス...
if(msg1_4 == SIGNALON)
{
put_ball(); //1つ目のボールを置く
break;
}
}
}
*結果 [#o5d338f5]
私のプログラムは時間が足りずボールを一つ置くまでしかでき...
*反省・感想 [#z2f548b2]
まず、今回の課題ではロボットの構造を何度も作り直したり、...
このゼミを通して、プログラムの基礎的なことは身についたと...
ページ名: