- 追加された行はこの色です。
- 削除された行はこの色です。
[[2019a/Member]]
#contents
*課題3 [#q45ee180]
**試み [#d7281911]
*ロボットについて [#gfd050da]
**全体 [#rf3c994a]
#ref(2019a/Member/Hinata/Mission3/1.jpg,80%,1)
**ボール回収のアーム [#vb84c272]
&ref(2019a/Member/Hinata/Mission3/2.jpg,80%,1);&ref(2019a/Member/Hinata/Mission3/3.jpg,80%,1);
*マスターのプログラム [#j4f2a559]
基本的にはMission2のものと変わりないため、詳細な説明はMission2を参照~
(http://yakushi.shinshu-u.ac.jp/robotics/?2019a%2FMember%2FHinata%2FMission2)
**定義 [#x5042dcc]
#define Baced 45 //中間となる明るさの定義
#define speed 20
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
#define Deep_turn_R OnRL(-speed,speed); //Deepで両車輪を回し、深く曲がる
#define turn_R OnRL(0,speed); //片方の車輪のみを動かす
#define Straight OnRL(speed,speed); //直進
#define Deep_turn_L OnRL(speed,-speed);
#define turn_L OnRL(speed,0);
#define turning_R OnRL(-speed,speeed);; //時計回りに回転
#define turning_L OnRL(speed,-speed); //反時計回りに回転
#define cross_line OnFwd(OUT_BC,15);Wait(400); //交差点を横切る
#define CONN 1
#define meireiA
#define meireiB
#define meireiC
**サブルーチン [#me361140]
***右側のトレース [#i738c24a]
void R_trace(int Z){ //道の右側をトレースして交差点で停止する
SetSensorLight(S1);
long t0;
t0=CurrentTick(); //タイマーをセット
while (CurrentTick()-t0<Z) { //Z/1000秒以上連続して右に曲がるまで永続する
if (SENSOR_1 < Baced-15) { //基準の明るさからー15の時の動作(黒線の上)
Deep_turn_R;
}
else if (SENSOR_1 < Baced-5) {turn_R;//基準の明るさからー5のとき(やや黒線より)
else if (SENSOR_1 < Baced-5) {turn_R; //基準の明るさからー5のとき
t0=CurrentTick();}
else if (SENSOR_1 < Baced+5) {Straight; //いい感じの位置
else if (SENSOR_1 < Baced+5) {Straight;
t0=CurrentTick();}
else if (SENSOR_1 < Baced+10) {turn_L; //黒線からやや離れている
else if (SENSOR_1 < Baced+10) {turn_L;
t0=CurrentTick();}
else {Deep_turn_L; //黒線から完全に離れている
else {Deep_turn_L;
t0=CurrentTick();}
}
turning_L; //左に旋回
Wait(400);
cross_line; //直進して交差点を渡る
}
右側をトレースして交差点をわたるサブ関数~
Z/1000秒以上連続して右に曲がるまで続けると交差点と判断するようになっている。~
コースのL〜K、F〜B間で使用。黄緑色の部分で作動する
***左側のトレース1 [#a2cabf16]
void L_trace_A(int X){ //上記のR_traceの左バージョン
SetSensorLight(S1);
long t0;
t0=CurrentTick();
while (CurrentTick()-t0<X) {
if (SENSOR_1 < Baced-15) {
Deep_turn_L;
}
else if (SENSOR_1 < Baced-5) {turn_L;
t0=CurrentTick();}
else if (SENSOR_1 < Baced+5) {Straight;
t0=CurrentTick();}
else if (SENSOR_1 < Baced+10) {turn_R;
t0=CurrentTick();}
else {Deep_turn_R;
t0=CurrentTick();}
}
turning_R; //右旋回
Wait(400);
cross_line; //交差点の横断
}
こちらはR_traceと違い左側をトレースしながら移動するようになっている~
連続して左に曲がり続ける(黒が続く)と交差点と判断される~
コースのM〜K、J〜Gで使用。基本の左側トレース。紫色の区間
***左側トレース2 [#e0804cf8]
基本となる左側トレース。
***左側のトレース2 [#e0804cf8]
void L_trace_B(int Y){ //左側トレース第二弾
SetSensorLight(S1);
long t0;
t0=CurrentTick();
while (CurrentTick()-t0<Y) {
if (SENSOR_1 < Baced-15) {Deep_turn_R;
t0=CurrentTick();}
else if (SENSOR_1 < Baced-5) {turn_L;
t0=CurrentTick();}
else if (SENSOR_1 < Baced+5) {Straight;
t0=CurrentTick();}
else if (SENSOR_1 < Baced+10) {turn_R;
t0=CurrentTick();}
else {Deep_turn_R; //上記のものと違い、白を感知して右に連続して曲がり続けたときに止まるようになっている
}
}
turning_L; //左旋回
Wait(200);
}
**メインタスク [#g3f101e1]
task main()
{
int msg;
L_trace_A(300);
L_trace_B(200);
SendRemorteNumber(CONN,MAILBOX,meireiA);
While(true)
{
ReceiveRemorteNumber(CONN,MAILBOX,true,msg);
if(msg==meireiB)
{
turning_L;
Wait(1500);
Off(OUT_BC);
SendRemorteNumber(CONN,MAILBOX1,meireiC);
}
}
}
*slaveのプログラム [#sc537ae8]
**定義 [#zb9d51e0]
#define speed 15
#define OnE(speed) OnFwd(OUT_B,speedE)
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL)
#define arm_up OnRev(OUT_B,24);
#define arm_down OnRL(speed,speed);
#define arm_open OnE(speed);
#define arm_close OnE(-speed);
**サブルーチン [#r005ae8a]
void catch()
{
arm_down;
Wait(950);
arm_close;
Wait(2000);
Off(OUT_B);
arm_up;
Wait(550);
Off(OUT_AC);
}
void hanase()
{
arm_open;
Wait(1200);
Off(OUT_B);
}
**メインタスク [#y59d0e1c]
task main
{
int msg;
while(true)
{
ReceiveRemorteNumber(CONN,MAILBOX,true,msg);
if(msg==meireiA)
{
catch();
SendRemorteNumber(CONN,MAILBOX1,meireiB);
}
if(msg==meireiC)
{
hanase;
}
}
}
*結果 [#g66c12f2]
*総括 [#i9f2f0bf]