- 追加された行はこの色です。
- 削除された行はこの色です。
[[2018b/Member]]
#contents
#contents
*課題2 [#g0917994]
*課題2 [#o5399089]
課題2のコース
&ref(http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=2018b-mission2.png&refer=2018b%2FMember%2Fyuto%2FMission2);
このコースで、次のルートを通る
ロボットを正方形X内におき、Lをスタート
Eを一時停止して直進
Iを一時停止して左折
Hを直進
Kを直進
Jを左折
Cを一時停止して右折
Eを一時停止して直進
Gを一時停止して直進
長方形X内に入って停止
*ロボットの概要 [#w0a4fd15]
&ref(S__232890381.jpg);
今回はこちらのロボットを作った。
**光センサー [#s3815857]
&ref(S__232890383.jpg);
光センサーを使って線の濃さを見分ける
**超音波センサー [#x0c1b05e]
&ref(S__232890382.jpg);
超音波センサーを使って缶との距離を測る
**ボールを当てる機能 [#gda2ca74]
&ref(S__232890384.jpg);
ボールは転がして落とすことで当てるようにした
*プログラミング [#t9db7ee0]
#define migi0 OnFwd(OUT_A,15);OnRev(OUT_C,10);
#define migi1 OnFwd(OUT_A,15);Off(OUT_C);
#define hidari0 OnFwd(OUT_C,15);OnRev(OUT_A,10);
#define hidari1 OnFwd(OUT_C,15);Off(OUT_A);
#define middle 48
#define go(time) OnFwd(OUT_AC,15);Wait(time);Off(OUT_AC);
#define back(time) OnRev(OUT_AC,15);Wait(time);Off(OUT_AC);
#define LEFT(angle) OnFwd(OUT_C,15);OnRev(OUT_A,10);Wait(angle);Off(OUT_AC);
#define RIGHT(angle) OnFwd(OUT_A,15);OnRev(OUT_C,10);Wait(angle);Off(OUT_AC);
sub Line()
{
ロボットを動かすためのプログラミングを作る。まずおおもとの定義を
#define migi0 OnFwd(OUT_A,15);OnRev(OUT_C,10);//右旋回
#define migi1 OnFwd(OUT_A,15);Off(OUT_C);//右曲がり
#define hidari0 OnFwd(OUT_C,15);OnRev(OUT_A,10);//左曲がり
#define hidari1 OnFwd(OUT_C,15);Off(OUT_A);//左旋回
#define middle 48//光の値の中心
#define go(time) OnFwd(OUT_AC,15);Wait(time);Off(OUT_AC);//前に進む
#define back(time) OnRev(OUT_AC,15);Wait(time);Off(OUT_AC);//後ろに進む
#define LEFT(angle) OnFwd(OUT_C,15);OnRev(OUT_A,10);Wait(angle);Off(OUT_AC);//左に曲がる
#define RIGHT(angle) OnFwd(OUT_A,15);OnRev(OUT_C,10);Wait(angle);Off(OUT_AC);//右に曲がる
まず、通常のラインを進んでいくプログラミングは
sub Line()
{
SetSensorLight(S1);
long t0=CurrentTick();
while(CurrentTick()-t0<=28)
{
if(SENSOR_1>middle+8)
if(SENSOR_1>middle+8)//光センサーの値が56より大きければ
{
migi0;
migi0;//右旋回
t0=CurrentTick();
}
else if(SENSOR_1>middle+6)
else if(SENSOR_1>middle+4)//52より大きければ
{
migi1;
migi1;右へ曲がる
t0=CurrentTick();
}
else if(SENSOR_1>middle)
else if(SENSOR_1>middle)//48より大きければ
{
OnFwd(OUT_AC,30);
OnFwd(OUT_AC,30);//直進
t0=CurrentTick();
}
else if(SENSOR_1>middle-6)
else if(SENSOR_1>middle-4)//44より大きければ
{
hidari0;
hidari0;//左へ曲がる
t0=CurrentTick();
}
else
{
hidari1;
hidari1;//左旋回
t0=CurrentTick();
}
}
Off(OUT_AC);
}
sub Line2()
{
Off(OUT_AC);
}
なお、全てにおいてCurrentTick();が入っているのは、そこでタイムをリセットするためである
つぎに、1つだけある急カーブのために、ある一定時間は曲がらないプログラムを作る。
sub Line2()
{
SetSensorLight(S1);
long t0=CurrentTick();
while(CurrentTick()-t0<=28)
while(CurrentTick()-t0<=2500)
{
if(SENSOR_1>middle+8)
{
migi0;
t0=CurrentTick();
}
else if(SENSOR_1>middle+6)
else if(SENSOR_1>middle+4)
{
migi1;
t0=CurrentTick();
}
else if(SENSOR_1>middle)
{
OnFwd(OUT_AC,30);
t0=CurrentTick();
}
else if(SENSOR_1>middle-6)
else if(SENSOR_1>middle-4)
{
hidari0;
t0=CurrentTick();
}
else
{
hidari1;
t0=CurrentTick();
}
}
Off(OUT_AC);
}
void mitsukeru()
{
Off(OUT_AC);
}
次は、空き缶を見つけるためのプログラムである
void mitsukeru()
{
ResetTachoCount(OUT_ABC);
OnFwd(OUT_A,50);
OnRev(OUT_C,50);
SetSensorLowspeed(S4);
int d1;
d1=1000;
d1=1000;//仮の最小値
long t0=CurrentTick();
long t1=CurrentTick();
long t2=CurrentTick();
while(t2-t0<=3570){
t2=CurrentTick();
if(SensorUS(S4)<d1){
d1=SensorUS(S4);
t1=CurrentTick();
d1=SensorUS(S4);//最小値より小さい値が出た時、そこを新しい最小値とする
t1=CurrentTick();//時間をリセットする
}
t2=CurrentTick();
}
t0=CurrentTick();
Off(OUT_AC);
OnFwd(OUT_C,50);
OnRev(OUT_A,50);
Wait(t0-t1);
}
task main()
{
Line();
RIGHT(15);
Line();
Wait(1000);
LEFT(15);
Line();
go(50);
mitsukeru();
OnFwd(OUT_B,30);
Wait(t0-t1);//最後に、最小値をとった場所まで回る
}
これらをすべて合わせたプログラミングがこちらである
task main()
{
Line();//AからB
RIGHT(15);//Bを右折
Line();//BからK
Wait(1000);//一時停止
LEFT(15);//Kを左折
Line();//KからJ
go(50);//微調節
Line();//KからJ
go(100);//微調節
mitsukeru();//缶を探す
OnFwd(OUT_B,30);//缶を落とす
Wait(2000);
Off(OUT_B);
Line();
go(50);
Line();
LEFT(15);
Line();
Wait(1000);
LEFT(15);
Line2();
Line();
Wait(1000);
RIGHT(15);
Line();
go(100);
Off(OUT_BC);
}
Line();//JからI
go(50)//微調節
Line();//IからH
LEFT(15);//左に曲がる
Line();//HからG
Wait(1000);//一時停止
LEFT(15);//Gで左折
Line2();//ある場所まで進み続ける
Line();//そこからEmまで
Wait(1000);//一時停止
RIGHT(15);//Eを曲がる
Line();//Lまで行く
go(100);//ゴールに入る
Off(OUT_BC);//
}
*感想と考察 [#d01d7853]
・道を走るだけでこんなにも難しいものだと知った
・自動運転の技術は本当にすごいんだなと思った
・前回の反省を生かし、しっかりと短めで終わらせた
・次回はもっと工夫したプログラミングを作りたい