- 追加された行はこの色です。
- 削除された行はこの色です。
目次
#contents
*課題2 [#w4c48934]
下の図のようなコースを作成し、黒い線に沿って動き、紙コップを移動させるロボットを製作せよ。
**コース [#v5cf4282]
自分は第1コースを選んだので次のようなコースをトレースするロボットを製作することになった。
Aをスタート→Bを直進→Cを右折→Fを直進→Rを左折(一時停止)→Pを直進→X地点の紙コップを取得してコースに戻る→Qを左折→Sを直進(一時停止)
→Y地点に紙コップを置いてコースに戻る→Sを直進(一時停止)→Fを左折(一時停止)→Cを右折(一時停止)→D地点へ(ゴール)
*ロボットの説明 [#r45822bf]
**ロボットの構造 [#zf8abba5]
*プログラム [#oed56b86]
**定義 [#j2667492]
多用すると予想された一定時間光センサーを用いずに前進する動きや、左右にまがる動き、右旋回、左旋回、また交差点判断の後直進する場合の動きを定義した。
#define right_Uturn OnFwd(OUT_A);OnRev(OUT_C);//右旋回
#define right_turn OnFwd(OUT_A);Off(OUT_C);//右回転
#define left_Uturn OnFwd(OUT_C);OnRev(OUT_A);//左旋回
#define left_turn OnFwd(OUT_C);Off(OUT_A);//左回転
#define Brightness 47//明るさ
#define go(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);//時間指定可能な前進
#define back(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC);//時間指定可能な後進
#define right_through left_Uturn;Wait(20);go(30);//右側ライントレース時の交差点直進
#define left_through right_Uturn;Wait(25);go(30);//左側ライントレース時の交差点直進
#define P SetPower(OUT_AC,5);//モーターの回転の強さ
**サブルーチン [#oa7a0f03]
ライントレースをする際に線の右側をトレースするパターンと左側をトレースするパターンを使うため、その2つをサブルーチンとして作った。また、センサーが0.26秒以上黒い線の上を通っていた際に旋回を行い、一時停止するプログラムだけでは交差点で止まらずに曲がってしまう場所があったので、その地点のために0.26秒ではなく0.17秒で旋回を行うものも作った。
***右側ライントレース [#rb19cf47]
sub right_Line()//右側ライントレース
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_LIGHT);//端子2に光センサーをセット
ClearTimer(0);
while(FastTimer(0)<=26)
while(FastTimer(0)<=26)//0.26秒以内は繰り返し、0.26秒を超えたら交差点と判断
{
if(SENSOR_2>Brightness+5)
if(SENSOR_2>Brightness+5)//センサーの値が明るさの閾値+5以上の時左旋回を行う
{
left_Uturn;
ClearTimer(0);
}
else if(SENSOR_2>Brightness+4)
else if(SENSOR_2>Brightness+4)//センサーの値が明るさの閾値+4以上の時左折を行う
{
left_turn;
ClearTimer(0);
}
else if(SENSOR_2>Brightness)
else if(SENSOR_2>Brightness)//センサーの値が明るさの閾値以上の時直進を行う
{
P;
OnFwd(OUT_AC);
ClearTimer(0);
}
else if(SENSOR_2>Brightness-4)
else if(SENSOR_2>Brightness-4)//センサーの値が明るさの閾値-4以上の時右折を行う
{
right_turn;
ClearTimer(0);
}
else
else//上記のいずれかの条件も満たさなかった時右旋回を行う
{
right_Uturn;
}
}
Off(OUT_AC);
}
***短い右側ライントレース [#f0b497b2]
sub right_Linehalf()//右側ライントレース短
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_LIGHT);//端子2に光センサーをセット
ClearTimer(0);
while(FastTimer(0)<=17)
while(FastTimer(0)<=17)//0.17秒以内は繰り返し、0.17秒を超えたら交差点と判断
{
if(SENSOR_2>Brightness+5)
if(SENSOR_2>Brightness+5)//センサーの値が明るさの閾値+5以上の時左旋回を行う
{
left_Uturn;
ClearTimer(0);
}
else if(SENSOR_2>Brightness+4)
else if(SENSOR_2>Brightness+4)//センサーの値が明るさの閾値+4以上の時左折を行う
{
left_turn;
ClearTimer(0);
}
else if(SENSOR_2>Brightness)
else if(SENSOR_2>Brightness)//センサーの値が明るさの閾値以上の時直進を行う
{
P;
OnFwd(OUT_AC);
ClearTimer(0);
}
else if(SENSOR_2>Brightness-4)
else if(SENSOR_2>Brightness-4)//センサーの値が明るさの閾値-4以上の時右折を行う
{
right_turn;
ClearTimer(0);
}
else
else//上記のいずれかの条件も満たさなかった時右旋回を行う
{
right_Uturn;
}
}
}
***左側ライントレース [#h64146a0]
sub left_Line()//左側ライントレース
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_LIGHT);//端子2に光センサーをセット
ClearTimer(0);
while(FastTimer(0)<=26)
{
if(SENSOR_2>Brightness+5)
if(SENSOR_2>Brightness+5)//センサーの値が明るさの閾値+5以上の時右旋回を行う
{
right_Uturn;
ClearTimer(0);
}
else if(SENSOR_2>Brightness+4)
else if(SENSOR_2>Brightness+4)//センサーの値が明るさの閾値+4以上の時右折を行う
{
right_turn;
ClearTimer(0);
}
else if(SENSOR_2>Brightness)
else if(SENSOR_2>Brightness)//センサーの値が明るさの閾値以上の時直進を行う
{
P;
OnFwd(OUT_AC);
ClearTimer(0);
}
else if(SENSOR_2>Brightness-4)
else if(SENSOR_2>Brightness-4)//センサーの値が明るさの閾値-4以上の時左折を行う
{
left_turn;
ClearTimer(0);
}
else
else//上記のいずれかの条件も満たさなかった時左旋回を行う
{
left_Uturn;
}
}
Off(OUT_AC);
}
***短い左側ライントレース [#peb890d5]
sub left_Linehalf()//左側ライントレース短
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
SetSensor(SENSOR_2,SENSOR_LIGHT);//端子2に光センサーをセット
ClearTimer(0);
while(FastTimer(0)<=17)
{
if(SENSOR_2>Brightness+5)
if(SENSOR_2>Brightness+5)//センサーの値が明るさの閾値+5以上の時右旋回を行う
{
right_Uturn;
ClearTimer(0);
}
else if(SENSOR_2>Brightness+4)
else if(SENSOR_2>Brightness+4)//センサーの値が明るさの閾値+4以上の時右折を行う
{
right_turn;
ClearTimer(0);
}
else if(SENSOR_2>Brightness)
else if(SENSOR_2>Brightness)//センサーの値が明るさの閾値以上の時直進を行う
{
P;
OnFwd(OUT_AC);
ClearTimer(0);
}
else if(SENSOR_2>Brightness-4)
else if(SENSOR_2>Brightness-4)//センサーの値が明るさの閾値-4以上の時左折を行う
{
left_turn;
ClearTimer(0);
}
else
else//上記のいずれかの条件も満たさなかった時左旋回を行う
{
left_Uturn;
}
}
}
**プログラムのメイン [#wce6c317]
task main()
{
right_Line();
Wait(100);
right_through;
int A;
for (A=1; A<=2; A++){
right_Line();
Wait(100);
}
right_through;
ClearTimer(1);
while(FastTimer(1)<=820)
{
right_Line();
}
Off(OUT_AC);
Wait(100);
left_turn;
Wait(30);
left_Linehalf();
Off(OUT_AC);
Wait(100);
left_Uturn;
Wait(30);
go(30);
left_Linehalf();
Off(OUT_AC);
Wait(100);
go(130);
left_Uturn;
Wait(65);
OnRev(OUT_AC);
Wait(80);
Off(OUT_AC);
OnFwd(OUT_B);
Wait(30);
Off(OUT_B);
left_Line();
Off(OUT_AC);
Wait(100);
left_through;
right_Uturn;
Wait(30);
right_Linehalf();
Off(OUT_AC);
Wait(100);
left_Uturn;
Wait(50);
go(40);
left_Line();
Off(OUT_AC);
OnRev(OUT_B);
Wait(30);
Off(OUT_B);
Wait(70);
left_Uturn;
Wait(40);
go(40);
right_Line();
right_Uturn;
Wait(60);
go(150);
}
*まとめ [#g7578be6]
**反省点 [#tb7ecb1a]
**感想 [#rbeed054]