2017b/Member/ats/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
#contents
*課題 [#i823c000]
黒線で書かれた道を指示通りにライントレースし、紙コップを...
#ref(2017b/Member/ats/Mission2/a.JPG,100%,コース全体)
私は第ニコースに決まったため、次のようなコースでライント...
Dスタート→Cを直進→Bを左折→Pを左折(一時停止)→Qを直進→Rを左...
→Sを直進(一時停止)→Y地点の紙コップを取得してコースに戻る→...
→Qを左折(一時停止)→Rを直進→X地点に紙コップを置いてコース...
→B を左折(一時停止)→A地点へ(ゴール)
*1.ロボット本体 [#y9ec45e8]
**ロボットの形 [#f92a326a]
完成したロボットは付属の説明書に書いてあるライントレーサ...
#ref(2017b/Member/ats/Mission2/b.jpg,100%,ロボット全体)
**モーターの使い方 [#tad0c6e5]
モーターは全部で3つ使った。2つは移動のための左右のタイヤ...
**センサーと前輪の位置 [#g662268e]
はじめは付属の説明書に書いてあるライントレーサーをそのま...
**センサーの高さ [#xeceda7c]
途中の段階で、センサーの紙面からの高さが低いためにロボッ...
#ref(2017b/Member/ats/Mission2/c.JPG,100%,センサー高さ)
**カップを取る(置く)機構 [#i4216fc1]
下の写真のようにカップをホールドする装置が動く。(上がホ...
#ref(2017b/Member/ats/Mission2/e.jpg,100%,カップホールド前)
#ref(2017b/Member/ats/Mission2/d.jpg,100%,カップホールド)
*2.プログラム [#nc09cbbc]
**ライントレースの方法 [#m7488572]
私が担当した第二コースは黒線の左側をトレースするとロボッ...
黒線の周りの明るさを測ると完全に白い場所がだいたい58〜60...
(明るさの条件;ロボットの動作)
閾値+10より大きい;右に旋回
閾値+6より大きい ;右に曲がる
閾値より大きい ;少しだけ(*)右に曲がる
閾値 ;直進
閾値-5より大きい ;少しだけ(*)左に曲がる
閾値-10より大きい;左に曲がる
閾値-10以下 ;左に旋回
*直進と旋回以外のときはその場の明るさと閾値との差を取っ...
**交差点識別 [#i8f672d0]
閾値-10以下の値を観測する時間が一定値を超えた時に交差点と...
このため、交差点を直進するときは判別用のプログラムの後に...
交差点を左折(このコースでは右折しない)するときは単純に明...
sub syusei() //(交差点を認識した後で)少し右に曲が...
{
go_forward; //黒線を超える
Wait(150);
while(sensor<th){ //次の黒線まで右旋回し、車体の...
r_turn;
}
PlayTone(800,50);
Wait(100);
short_break2;
}
sub escape() //黒部分から白部分に移動する(交差点...
{
short_break2;
while(sensor<th+7){ //白くなるまで左旋回
l_rotation2;
}
PlayTone(800,50);
Wait(100);
short_break2;
}
**交差点を誤認しないために [#pae67f86]
次のようなときに道の途中で交差点と判断して止まることがあ...
1.急カーブの内側をライントレースしているとき
2.交差点を左折した直後(特に車体の向きが完全に道と平行に...
これを解決するために交差点だと判断する条件を次のように厳...
一定時間、閾値-10以下の値を観測する
↓
一定時間、閾値-10以下の値を観測する 「且つ」 ライントレ...
こうすることで、次の交差点にたどり着くまでのだいたいの時...
sub trace(long t,int f,int x) //ライントレース ・fの時...
//ある交差点で上手く交差点...
{
SetSensorLight(S2);
long t0=CurrentTick();
long t1=CurrentTick();
while((CurrentTick()-t0<f)||(CurrentTick()-t1<t*1000...
...
if(sensor>th+10){ //明るい、...
r_rotation;
t0=CurrentTick();
}else if(sensor>th+6){ //少し明る...
OnFwd(OUT_A,A_speed-(sensor-th)*4);
OnFwd(OUT_B,B_speed-(sensor-th));
t0=CurrentTick();
}else if(sensor>th){ //ほんの少...
OnFwd(OUT_A,A_speed-(sensor-th)*2);
OnFwd(OUT_B,B_speed-(sensor-th));
t0=CurrentTick();
}else if(sensor==th){ //明るさが...
go_forward;
t0=CurrentTick();
}else if(sensor>th-5+x){ //ほんの少...
OnFwd(OUT_A,A_speed-(th-sensor));
OnFwd(OUT_B,B_speed-(th-sensor)*2);
t0=CurrentTick();
}else if(sensor>th-10+x){ //少し暗い...
OnFwd(OUT_A,A_speed-(th-sensor));
OnFwd(OUT_B,B_speed-(th-sensor)*4);
t0=CurrentTick();
}else { //暗い、閾...
l_rotation
}
}
PlayTone(200,200);
}
**メインプログラムなど [#ma32f19b]
右タイヤの駆動モーターをAに、左タイヤの駆動モーターをBに...
#define B_speed 45 //Bの速度の基準
#define A_speed 43 //Aの速度の基準
#define short_break Off(OUT_AB);Wait(step); //一...
#define short_break2 Off(OUT_AB);Wait(100); //一...
#define th 44 //閾値
#define step 1000 //ストップ時間
#define r_turn OnFwd(OUT_B,B_speed-10);Off(OUT_A); ...
#define l_turn OnFwd(OUT_A,A_speed-10);Off(OUT_B); ...
#define r_rotation OnFwd(OUT_A,-30);OnFwd(OUT_B,30); //...
#define l_rotation OnFwd(OUT_A,30);OnFwd(OUT_B,-30); //...
#define l_rotation2 OnFwd(OUT_A,25);OnFwd(OUT_B,-30);//...
#define go_forward OnFwd(OUT_B,30);OnFwd(OUT_A,30); //...
#define hantei 200 //交差点と判断するまでの時間(...
#define hanteicurve 140 //交差点と判断するまでの時間(...
#define sensor SENSOR_2
sub syuseicurve() //交差点を認識したときに直進するため...
//カーブ途中の交差点ではsyuseiサブル...
{
syusei(); //センサーを白の位置まで出す...
while(sensor>th){
r_rotation;
}
PlayTone(800,50);
short_break2;
}
sub capture() //カップをホールドする(カップの方...
{
r_rotation;
Wait(750);
Off(OUT_AB);
go_forward;
Wait(200);
Off(OUT_AB);
OnFwd(OUT_C,-40);
Wait(1800);
Off(OUT_C);
l_rotation;
Wait(800);
Off(OUT_AB);
}
sub release() //カップを放す(車体の向きを変える...
{
r_rotation;
Wait(1500);
Off(OUT_AB);
OnFwd(OUT_C,40);
Wait(1600);
Off(OUT_C);
l_rotation;
Wait(1600);
Off(OUT_AB);
}
↓コースを5つに分けてサブルーチンにした。
sub DCBP()
{
trace(0,hantei,0); //DC
syusei();
trace(0,hantei,0); //CB
escape();
trace(1,hantei,0); //BP 左折
short_break;
escape();
}
sub PQR()
{
trace(1.5,hanteicurve,0); //PQ
syuseicurve();
trace(0,hanteicurve,0); //QR
escape();
}
sub REFS()
{
trace(1,hantei,0); //RE
escape();
trace(12,hantei,0); //EF
escape();
trace(1,hantei,0); //FS
short_break;
syusei();
}
sub YSQR()
{
trace(1,hantei,0); //YS
short_break;
syusei();
trace(0,hantei,0); //SQ
short_break;
escape();
trace(1,hanteicurve,0); //QR
syuseicurve();
}
sub XPBA()
{
trace(0.8,hanteicurve,4); //XP この交差点だけ黒を...
escape();
trace(1,hantei,0); //PB
short_break;
escape();
trace(1,hantei,0); //BA
short_break;
r_turn;
Wait(200);
go_forward;
Wait(2500);
Off(OUT_AB);
PlaySound(SOUND_UP);
}
task main()
{
DCBP();
PQR();
REFS();
capture();
YSQR();
release();
XPBA();
}
*反省 [#f2ef698e]
上手くいかなかったときに闇雲にプログラムを変えて何回も失...
次の課題の時は原因をなるべくよく探ってから試行したい。
終了行:
#contents
*課題 [#i823c000]
黒線で書かれた道を指示通りにライントレースし、紙コップを...
#ref(2017b/Member/ats/Mission2/a.JPG,100%,コース全体)
私は第ニコースに決まったため、次のようなコースでライント...
Dスタート→Cを直進→Bを左折→Pを左折(一時停止)→Qを直進→Rを左...
→Sを直進(一時停止)→Y地点の紙コップを取得してコースに戻る→...
→Qを左折(一時停止)→Rを直進→X地点に紙コップを置いてコース...
→B を左折(一時停止)→A地点へ(ゴール)
*1.ロボット本体 [#y9ec45e8]
**ロボットの形 [#f92a326a]
完成したロボットは付属の説明書に書いてあるライントレーサ...
#ref(2017b/Member/ats/Mission2/b.jpg,100%,ロボット全体)
**モーターの使い方 [#tad0c6e5]
モーターは全部で3つ使った。2つは移動のための左右のタイヤ...
**センサーと前輪の位置 [#g662268e]
はじめは付属の説明書に書いてあるライントレーサーをそのま...
**センサーの高さ [#xeceda7c]
途中の段階で、センサーの紙面からの高さが低いためにロボッ...
#ref(2017b/Member/ats/Mission2/c.JPG,100%,センサー高さ)
**カップを取る(置く)機構 [#i4216fc1]
下の写真のようにカップをホールドする装置が動く。(上がホ...
#ref(2017b/Member/ats/Mission2/e.jpg,100%,カップホールド前)
#ref(2017b/Member/ats/Mission2/d.jpg,100%,カップホールド)
*2.プログラム [#nc09cbbc]
**ライントレースの方法 [#m7488572]
私が担当した第二コースは黒線の左側をトレースするとロボッ...
黒線の周りの明るさを測ると完全に白い場所がだいたい58〜60...
(明るさの条件;ロボットの動作)
閾値+10より大きい;右に旋回
閾値+6より大きい ;右に曲がる
閾値より大きい ;少しだけ(*)右に曲がる
閾値 ;直進
閾値-5より大きい ;少しだけ(*)左に曲がる
閾値-10より大きい;左に曲がる
閾値-10以下 ;左に旋回
*直進と旋回以外のときはその場の明るさと閾値との差を取っ...
**交差点識別 [#i8f672d0]
閾値-10以下の値を観測する時間が一定値を超えた時に交差点と...
このため、交差点を直進するときは判別用のプログラムの後に...
交差点を左折(このコースでは右折しない)するときは単純に明...
sub syusei() //(交差点を認識した後で)少し右に曲が...
{
go_forward; //黒線を超える
Wait(150);
while(sensor<th){ //次の黒線まで右旋回し、車体の...
r_turn;
}
PlayTone(800,50);
Wait(100);
short_break2;
}
sub escape() //黒部分から白部分に移動する(交差点...
{
short_break2;
while(sensor<th+7){ //白くなるまで左旋回
l_rotation2;
}
PlayTone(800,50);
Wait(100);
short_break2;
}
**交差点を誤認しないために [#pae67f86]
次のようなときに道の途中で交差点と判断して止まることがあ...
1.急カーブの内側をライントレースしているとき
2.交差点を左折した直後(特に車体の向きが完全に道と平行に...
これを解決するために交差点だと判断する条件を次のように厳...
一定時間、閾値-10以下の値を観測する
↓
一定時間、閾値-10以下の値を観測する 「且つ」 ライントレ...
こうすることで、次の交差点にたどり着くまでのだいたいの時...
sub trace(long t,int f,int x) //ライントレース ・fの時...
//ある交差点で上手く交差点...
{
SetSensorLight(S2);
long t0=CurrentTick();
long t1=CurrentTick();
while((CurrentTick()-t0<f)||(CurrentTick()-t1<t*1000...
...
if(sensor>th+10){ //明るい、...
r_rotation;
t0=CurrentTick();
}else if(sensor>th+6){ //少し明る...
OnFwd(OUT_A,A_speed-(sensor-th)*4);
OnFwd(OUT_B,B_speed-(sensor-th));
t0=CurrentTick();
}else if(sensor>th){ //ほんの少...
OnFwd(OUT_A,A_speed-(sensor-th)*2);
OnFwd(OUT_B,B_speed-(sensor-th));
t0=CurrentTick();
}else if(sensor==th){ //明るさが...
go_forward;
t0=CurrentTick();
}else if(sensor>th-5+x){ //ほんの少...
OnFwd(OUT_A,A_speed-(th-sensor));
OnFwd(OUT_B,B_speed-(th-sensor)*2);
t0=CurrentTick();
}else if(sensor>th-10+x){ //少し暗い...
OnFwd(OUT_A,A_speed-(th-sensor));
OnFwd(OUT_B,B_speed-(th-sensor)*4);
t0=CurrentTick();
}else { //暗い、閾...
l_rotation
}
}
PlayTone(200,200);
}
**メインプログラムなど [#ma32f19b]
右タイヤの駆動モーターをAに、左タイヤの駆動モーターをBに...
#define B_speed 45 //Bの速度の基準
#define A_speed 43 //Aの速度の基準
#define short_break Off(OUT_AB);Wait(step); //一...
#define short_break2 Off(OUT_AB);Wait(100); //一...
#define th 44 //閾値
#define step 1000 //ストップ時間
#define r_turn OnFwd(OUT_B,B_speed-10);Off(OUT_A); ...
#define l_turn OnFwd(OUT_A,A_speed-10);Off(OUT_B); ...
#define r_rotation OnFwd(OUT_A,-30);OnFwd(OUT_B,30); //...
#define l_rotation OnFwd(OUT_A,30);OnFwd(OUT_B,-30); //...
#define l_rotation2 OnFwd(OUT_A,25);OnFwd(OUT_B,-30);//...
#define go_forward OnFwd(OUT_B,30);OnFwd(OUT_A,30); //...
#define hantei 200 //交差点と判断するまでの時間(...
#define hanteicurve 140 //交差点と判断するまでの時間(...
#define sensor SENSOR_2
sub syuseicurve() //交差点を認識したときに直進するため...
//カーブ途中の交差点ではsyuseiサブル...
{
syusei(); //センサーを白の位置まで出す...
while(sensor>th){
r_rotation;
}
PlayTone(800,50);
short_break2;
}
sub capture() //カップをホールドする(カップの方...
{
r_rotation;
Wait(750);
Off(OUT_AB);
go_forward;
Wait(200);
Off(OUT_AB);
OnFwd(OUT_C,-40);
Wait(1800);
Off(OUT_C);
l_rotation;
Wait(800);
Off(OUT_AB);
}
sub release() //カップを放す(車体の向きを変える...
{
r_rotation;
Wait(1500);
Off(OUT_AB);
OnFwd(OUT_C,40);
Wait(1600);
Off(OUT_C);
l_rotation;
Wait(1600);
Off(OUT_AB);
}
↓コースを5つに分けてサブルーチンにした。
sub DCBP()
{
trace(0,hantei,0); //DC
syusei();
trace(0,hantei,0); //CB
escape();
trace(1,hantei,0); //BP 左折
short_break;
escape();
}
sub PQR()
{
trace(1.5,hanteicurve,0); //PQ
syuseicurve();
trace(0,hanteicurve,0); //QR
escape();
}
sub REFS()
{
trace(1,hantei,0); //RE
escape();
trace(12,hantei,0); //EF
escape();
trace(1,hantei,0); //FS
short_break;
syusei();
}
sub YSQR()
{
trace(1,hantei,0); //YS
short_break;
syusei();
trace(0,hantei,0); //SQ
short_break;
escape();
trace(1,hanteicurve,0); //QR
syuseicurve();
}
sub XPBA()
{
trace(0.8,hanteicurve,4); //XP この交差点だけ黒を...
escape();
trace(1,hantei,0); //PB
short_break;
escape();
trace(1,hantei,0); //BA
short_break;
r_turn;
Wait(200);
go_forward;
Wait(2500);
Off(OUT_AB);
PlaySound(SOUND_UP);
}
task main()
{
DCBP();
PQR();
REFS();
capture();
YSQR();
release();
XPBA();
}
*反省 [#f2ef698e]
上手くいかなかったときに闇雲にプログラムを変えて何回も失...
次の課題の時は原因をなるべくよく探ってから試行したい。
ページ名: