2013b/Member/Tomo/Mission1
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#contents
*メンバー [#kb656250]
Tomo
~Naoyoshi
*課題 [#qf85e42b]
写真にあるコースをライントレースして走り、コース上にあ...
*進行計画 [#p1312521]
チーム二人で作業を分担して行った。私はライントレースの...
*プログラム [#pef1c497]
#define SPEED 50
#define RANGE1 3.0//缶を掴んでから少し前進する距離
#define RANGE2 6.0//缶を離した後に後退する距離
#define HAND OUT_A//アームを駆動するモーターをAに定義
#define ADDITIONAL_TIME 3000//缶を掴む動作でずれたタイマ...
#define CATCH_TIME 1200//アームの開閉時間
#define catch OnFwd(HAND,20);Wait(CATCH_TIME);Off(HAND);...
#define release OnRev(HAND,20);Wait(CATCH_TIME);Off(HAND...
#define THRESHOLD 45//光センサの閾値
#define SPEED_L 30//走行時のスピード
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
#define go_forward OnRL(SPEED_L,SPEED_L);//直進するマクロ
#define turn_left1 OnRL(SPEED_L,-SPEED_L);//左に旋回する...
#define turn_left0 OnRL(SPEED_L,0);//左に曲がるマクロ
#define turn_right0 OnRL(0,SPEED_L);//右に曲がるマクロ
#define turn_right1 OnRL(-SPEED_L,SPEED_L);//右に旋回する
#define STEP 1
#define nMAX 50
#define short_break Off(OUT_BC);Wait(1000);
#define CROSS_TIME 200
#define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME...
#define FIRSTMAX 10000//第一段階終了時間
#define SECONDMAX 33000//第二段階終了時間
#define THIRDMAX 48000//第三段階終了時間
long t0,t1,t2,t3;//t0は走行開始時間、t1は缶を掴むタスク...
float width;//本体幅を定義、値は後で代入
mutex moveMutex;//この変数を参照しなければタイヤを動かす...
float GetAngle(float r)//与えられた距離r(float型変数)か...
{
const float diameter=5.45;//タイヤの直径
const float pi=3.1415;//円周率
float ang=r/(diameter*pi)*360.0;//円周と与えられた距離か...
return ang;//angを返す
}
task catch_can()//缶を掴むタスク
{
while(true)
{
if(SensorUS(S4)<=7)//超音波センサ値が7cm以内の時
{
Acquire(moveMutex);//並列タスク同士が競合しないための...
t1=CurrentTick();//t1に開始時間を記憶
Off(OUT_BC);//タイヤを停止
catch;
int angleA=GetAngle(RANGE1);//3cm進むための回転角度を...
RotateMotor(OUT_BC,SPEED,angleA);//3cm前進し缶を元の位...
int angleB=GetAngle(2*width*3.1415/4);//車幅を半径とし...
RotateMotor(OUT_B,SPEED,angleB);//1/4左回転
RotateMotor(OUT_C,-SPEED,angleB);//1/4右回転
release;
RotateMotor(OUT_C,-SPEED,angleB);//後ろ向きに1/4右回転
RotateMotor(OUT_B,SPEED,angleB);//後ろ向きに1/4左回転
int angleC=GetAngle(RANGE2);//6cm進むための回転角度を...
RotateMotor(OUT_BC,-SPEED,angleC);//6cm後退
t2=CurrentTick();//t2に終了時間を記憶
t3=t3+(t2-t1)-ADDITIONAL_TIME;//今までの缶を掴むのにか...
Release(moveMutex);//並列タスクの抑制を解放
}
}
}
task line_trace()//ラインをトレースするタスク
{
int nOnline=0;
while(true)
{
while(nOnline<nMAX)
{
PlaySound(SOUND_CLICK);//第一段階開始
while(CurrentTick()-t0-t3<=FIRSTMAX)
{
Acquire(moveMutex);
if(SENSOR_3<THRESHOLD-4)
{
turn_right1;
}
else if(SENSOR_3<THRESHOLD+4)
{
go_forward;
}
else
{
turn_left1;
}
Wait(STEP);
Release(moveMutex);
}//終了
PlaySound(SOUND_FAST_UP);//第二段階開始
turn_left1;
Wait(700);
while(CurrentTick()-t0-t3<=SECONDMAX)
{
Acquire(moveMutex);
if(SENSOR_3<THRESHOLD-7)
{
turn_left0;
nOnline++;
}
else
{
if(SENSOR_3<THRESHOLD+7)
{
go_forward;
}
else
{
turn_right1;
}
nOnline=0;
}
Wait(STEP);
Release(moveMutex);
}//終了
PlaySound(SOUND_UP);//第三段階開始
turn_right1;
Wait(1000);
while(CurrentTick()-t0-t3<=THIRDMAX)
{
Acquire(moveMutex);
if(SENSOR_3<THRESHOLD-7)
{
turn_right0;
nOnline++;
}
else
{
if(SENSOR_3<THRESHOLD+7)
{
go_forward;
}
else
{
turn_left1;
}
nOnline=0;
}
Wait(STEP);
Release(moveMutex);
}//終了
PlaySound(SOUND_CLICK);//第四段階開始
while(CurrentTick()-t0-t3>THIRDMAX)
{
Acquire(moveMutex);
if(SENSOR_3<THRESHOLD-4)
{
turn_right1;
}
else if(SENSOR_3<THRESHOLD+4)
{
go_forward;
}
else
{
turn_left1;
}
Wait(STEP);
Release(moveMutex);
}//終了
}
short_break;
turn_left1;
Wait(nMAX*STEP);
cross_line;
nOnline=0;
}
}
task main()
{
t1=0;
t2=0;
t3=0;
width=12.8;
SetSensorTouch(S1);
SetSensorLight(S3);
SetSensorLowspeed(S4);
while(SENSOR_1==0)
{
Wait(1);
}
t0=CurrentTick();
Precedes(catch_can,line_trace);
}
*プログラム制作 [#b7b79eaf]
**ライントレースプログラム [#yd82e320]
~ コースを4つに分けてそれぞれのコースに合ったプログラム...
~ 1番目のコースは直角カーブが二つあるので走行スピードを...
~ 2番目のコースでは緩やかな右カーブをまがりながら交差点...
~ 今まではラインの左側を走っていた3番目のコースでは右側...
~ 4番目のコースではまた左側走行する必要があった。しかし...
~ 上記は左周りのプログラムで右回りのプログラムは右回りの...
#ref(2013b/Member/Tomo/Mission1/コース.jpg)
**空き缶撤去用プログラム [#f6a530ef]
このプログラムはNaoyoshiが作ってくれたためNaoyoshiにプ...
~ 空き缶を撤去するために考えなければならないポイントは3...
~ ・掴んだ缶をどうやって元の位置に戻すか
~ ・缶を戻した後どうやってライン上にロボットを戻すか
~ ・缶をつかむ間にずれたタイマーをどう補正するか
~ このうちどうやって掴んだ缶をもとの位置に戻すかは、下図...
~ ライン上にロボットを戻す方法は、コースアウトしたロボッ...
~ さらにタイマーのずれの修正は、缶を撤去する前後の時間を...
*ロボット制作 [#gfffcac2]
~ ライントレースの精度を上げるために、光センサの位置を車...
~ 一番時間がかかったのは缶をつかむアームを駆動するモータ...
#ref(2013b/Member/Tomo/Mission1/ロボット.JPG)
*感想 [#vd483e08]
最初は全く課題がクリアできる感じがしなかった。ライント...
終了行:
#contents
*メンバー [#kb656250]
Tomo
~Naoyoshi
*課題 [#qf85e42b]
写真にあるコースをライントレースして走り、コース上にあ...
*進行計画 [#p1312521]
チーム二人で作業を分担して行った。私はライントレースの...
*プログラム [#pef1c497]
#define SPEED 50
#define RANGE1 3.0//缶を掴んでから少し前進する距離
#define RANGE2 6.0//缶を離した後に後退する距離
#define HAND OUT_A//アームを駆動するモーターをAに定義
#define ADDITIONAL_TIME 3000//缶を掴む動作でずれたタイマ...
#define CATCH_TIME 1200//アームの開閉時間
#define catch OnFwd(HAND,20);Wait(CATCH_TIME);Off(HAND);...
#define release OnRev(HAND,20);Wait(CATCH_TIME);Off(HAND...
#define THRESHOLD 45//光センサの閾値
#define SPEED_L 30//走行時のスピード
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
#define go_forward OnRL(SPEED_L,SPEED_L);//直進するマクロ
#define turn_left1 OnRL(SPEED_L,-SPEED_L);//左に旋回する...
#define turn_left0 OnRL(SPEED_L,0);//左に曲がるマクロ
#define turn_right0 OnRL(0,SPEED_L);//右に曲がるマクロ
#define turn_right1 OnRL(-SPEED_L,SPEED_L);//右に旋回する
#define STEP 1
#define nMAX 50
#define short_break Off(OUT_BC);Wait(1000);
#define CROSS_TIME 200
#define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME...
#define FIRSTMAX 10000//第一段階終了時間
#define SECONDMAX 33000//第二段階終了時間
#define THIRDMAX 48000//第三段階終了時間
long t0,t1,t2,t3;//t0は走行開始時間、t1は缶を掴むタスク...
float width;//本体幅を定義、値は後で代入
mutex moveMutex;//この変数を参照しなければタイヤを動かす...
float GetAngle(float r)//与えられた距離r(float型変数)か...
{
const float diameter=5.45;//タイヤの直径
const float pi=3.1415;//円周率
float ang=r/(diameter*pi)*360.0;//円周と与えられた距離か...
return ang;//angを返す
}
task catch_can()//缶を掴むタスク
{
while(true)
{
if(SensorUS(S4)<=7)//超音波センサ値が7cm以内の時
{
Acquire(moveMutex);//並列タスク同士が競合しないための...
t1=CurrentTick();//t1に開始時間を記憶
Off(OUT_BC);//タイヤを停止
catch;
int angleA=GetAngle(RANGE1);//3cm進むための回転角度を...
RotateMotor(OUT_BC,SPEED,angleA);//3cm前進し缶を元の位...
int angleB=GetAngle(2*width*3.1415/4);//車幅を半径とし...
RotateMotor(OUT_B,SPEED,angleB);//1/4左回転
RotateMotor(OUT_C,-SPEED,angleB);//1/4右回転
release;
RotateMotor(OUT_C,-SPEED,angleB);//後ろ向きに1/4右回転
RotateMotor(OUT_B,SPEED,angleB);//後ろ向きに1/4左回転
int angleC=GetAngle(RANGE2);//6cm進むための回転角度を...
RotateMotor(OUT_BC,-SPEED,angleC);//6cm後退
t2=CurrentTick();//t2に終了時間を記憶
t3=t3+(t2-t1)-ADDITIONAL_TIME;//今までの缶を掴むのにか...
Release(moveMutex);//並列タスクの抑制を解放
}
}
}
task line_trace()//ラインをトレースするタスク
{
int nOnline=0;
while(true)
{
while(nOnline<nMAX)
{
PlaySound(SOUND_CLICK);//第一段階開始
while(CurrentTick()-t0-t3<=FIRSTMAX)
{
Acquire(moveMutex);
if(SENSOR_3<THRESHOLD-4)
{
turn_right1;
}
else if(SENSOR_3<THRESHOLD+4)
{
go_forward;
}
else
{
turn_left1;
}
Wait(STEP);
Release(moveMutex);
}//終了
PlaySound(SOUND_FAST_UP);//第二段階開始
turn_left1;
Wait(700);
while(CurrentTick()-t0-t3<=SECONDMAX)
{
Acquire(moveMutex);
if(SENSOR_3<THRESHOLD-7)
{
turn_left0;
nOnline++;
}
else
{
if(SENSOR_3<THRESHOLD+7)
{
go_forward;
}
else
{
turn_right1;
}
nOnline=0;
}
Wait(STEP);
Release(moveMutex);
}//終了
PlaySound(SOUND_UP);//第三段階開始
turn_right1;
Wait(1000);
while(CurrentTick()-t0-t3<=THIRDMAX)
{
Acquire(moveMutex);
if(SENSOR_3<THRESHOLD-7)
{
turn_right0;
nOnline++;
}
else
{
if(SENSOR_3<THRESHOLD+7)
{
go_forward;
}
else
{
turn_left1;
}
nOnline=0;
}
Wait(STEP);
Release(moveMutex);
}//終了
PlaySound(SOUND_CLICK);//第四段階開始
while(CurrentTick()-t0-t3>THIRDMAX)
{
Acquire(moveMutex);
if(SENSOR_3<THRESHOLD-4)
{
turn_right1;
}
else if(SENSOR_3<THRESHOLD+4)
{
go_forward;
}
else
{
turn_left1;
}
Wait(STEP);
Release(moveMutex);
}//終了
}
short_break;
turn_left1;
Wait(nMAX*STEP);
cross_line;
nOnline=0;
}
}
task main()
{
t1=0;
t2=0;
t3=0;
width=12.8;
SetSensorTouch(S1);
SetSensorLight(S3);
SetSensorLowspeed(S4);
while(SENSOR_1==0)
{
Wait(1);
}
t0=CurrentTick();
Precedes(catch_can,line_trace);
}
*プログラム制作 [#b7b79eaf]
**ライントレースプログラム [#yd82e320]
~ コースを4つに分けてそれぞれのコースに合ったプログラム...
~ 1番目のコースは直角カーブが二つあるので走行スピードを...
~ 2番目のコースでは緩やかな右カーブをまがりながら交差点...
~ 今まではラインの左側を走っていた3番目のコースでは右側...
~ 4番目のコースではまた左側走行する必要があった。しかし...
~ 上記は左周りのプログラムで右回りのプログラムは右回りの...
#ref(2013b/Member/Tomo/Mission1/コース.jpg)
**空き缶撤去用プログラム [#f6a530ef]
このプログラムはNaoyoshiが作ってくれたためNaoyoshiにプ...
~ 空き缶を撤去するために考えなければならないポイントは3...
~ ・掴んだ缶をどうやって元の位置に戻すか
~ ・缶を戻した後どうやってライン上にロボットを戻すか
~ ・缶をつかむ間にずれたタイマーをどう補正するか
~ このうちどうやって掴んだ缶をもとの位置に戻すかは、下図...
~ ライン上にロボットを戻す方法は、コースアウトしたロボッ...
~ さらにタイマーのずれの修正は、缶を撤去する前後の時間を...
*ロボット制作 [#gfffcac2]
~ ライントレースの精度を上げるために、光センサの位置を車...
~ 一番時間がかかったのは缶をつかむアームを駆動するモータ...
#ref(2013b/Member/Tomo/Mission1/ロボット.JPG)
*感想 [#vd483e08]
最初は全く課題がクリアできる感じがしなかった。ライント...
ページ名: