2019a/Member/Gouki/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
目次
#contents
*課題について [#xd5df109]
下のような図をチームごとに作成し、黒い線の上を走るような...
#ref(2019a/Member/Gouki/Mission2/2019a-mission2.png,70%);
**課題の詳細 [#f419cc01]
A地点を出発し、次の経路を黒い線にそって動き、最後にピンポ...
#ref(2019a/Member/Gouki/Mission2/Inked2019a-mission2_LI.j...
?A地点から出発
?Bを直進
?Cを直進
?Dを一時停止の後に直進
?Eを直進
?Fを直進
?Gを一時停止の後に右折
?Hを直進
?Iを直進
?Jを右折
?Kを左折
?Lでピンポン玉をつかむ
?Kを直進
?Mで一時停止
?シュート
?A地点に入る(ゴール)
*ロボット本体について [#d3ddfb99]
**ロボット全体 [#f2f596ad]
#ref(2019a/Member/Gouki/Mission2/line_175788711878042.jpg...
今回の機体を制作するにあたり、図上できちんと小回りがきく...
**光センサー部分 [#z7f7e944]
#ref(2019a/Member/Gouki/Mission2/line_175812470413242.jpg...
光センサーの場所は、近すぎず遠すぎずなるべく正確な値を図...
**タイヤ部分 [#o8ddbba8]
#ref(2019a/Member/Gouki/Mission2/line_175792940901791.jpg...
タイヤはなるべく光センサーに近くなるように設計した。~
理由としては、光を検知し、タイヤをいち早く検知した光の値...
**つかむ機構 [#q8a37cf4]
#ref(2019a/Member/Gouki/Mission2/line_175760293908939.jpg...
#ref(2019a/Member/Gouki/Mission2/Inkedline_17575013233977...
アームの開閉の構造は図を見てもらった方が分かりやすいが、~
?モーターを向かって上から上方向に回すとアームを開く~
?モーターを向かって上から下方向に回すとアームが閉じる~
*個々のプログラムについて [#x8c757c8]
**ライントレース [#ja65743e]
今回は、黒い線を追従するライントレースのプログラミングを...
まずは光の値を測る。私たちは「完全に真っ白」、「白と境目...
「完全に黒」の5つの部分に色を分けて測った。~
それらの値は以下の図のようになった。
#ref(2019a/Member/Gouki/Mission2/Hikarinoatai.png,30%);
プログラミングでは、それぞれの値を以下のように定義する。
#define black 20
#define white 50
#define lightgray 40
#define darkgray 28
#define center 35
明かるさの値を5段階に分け、それらに対応する5つの動作を...
下の図がその動作であり、明るさや場合によってどの動きにな...
#ref(2019a/Member/Gouki/Mission2/ugokuhoukou.png,30%);
以下がその動作を定義したプログラミングである。
#define turn_right OnFwd(OUT_C,25);OnRev(OUT_B,15);//?
#define turn_left OnFwd(OUT_B,25);OnRev(OUT_C,15);//?
#define rotate_right OnFwd(OUT_C,20);OnRev(OUT_B,20);//?
#define rotate_left OnFwd(OUT_B,20);OnRev(OUT_C,20);//?
#define go_straight OnFwd(OUT_BC,20);//?
#define go_straight2 OnFwd(OUT_BC,15);//?の出力を少し下...
***左側のライントレース [#ye3aa3a8]
右側と左側とでのライントレースではプログラミングが異なっ...
それぞれ分けて考える。
sub followline_L(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){
if(SENSOR_1<black){
rotate_left; //明るさが20よ...
}else if(SENSOR_1<darkgray){
turn_left; //明るさが28よ...
}else if(SENSOR_1>lightdark){
turn_right; //明るさが35よ...
}else if(SENSOR_1<center){
go_straight; //明るさが40よ...
}else{
rotate_right; //明るさが50よ...
}
}
}
水色の矢印がプログラミングで動作する方向である。
#ref(2019a/Member/Gouki/Mission2/InkedHikarinoatai_LI.jpg...
***右側のライントレース [#ga54f680]
左側のライントレースと同様に右側のライントレースも考える。
sub followline_R(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){
if(SENSOR_1<black){
rotate_right; //明るさが20より...
}else if(SENSOR_1<darkgray){
turn_right; //明るさが28より...
}else if(SENSOR_1>lightdark){
turn_left; //明るさが35より...
}else if(SENSOR_1<center){
go_straight; //明るさが40より...
}else{
rotate_left; //明るさが50より...
}
}
}
#ref(2019a/Member/Gouki/Mission2/Inkedhikari2_LI.jpg,30%);
赤色の矢印がプログラミングで動作する方向である。
**交差点認識 [#pf6b85ac]
ライントレースをする際に途中で交差点にさしかかる。そのま...
そのために交差点を認識するプログラミングを作成する。それ...
又、今回は交差点を認識した際に、数秒間停止しなければなら...
***左側のライントレースの交差点認識 [#o18ba70d]
左側のライントレースの場合、「黒」と「黒と境目の間」の?と...
連続で何秒間か動作したときに、止まるようにする。
始めにt0=CurrentTickとおき、それぞれの変数の値の差(Curren...
ifやelse ifのなかにいれ、それをロボットが認識するたびにこ...
to=CurrentTickと入れていないとそれぞれの変数の差は0に更新...
すなわちifやelse ifの中にto=CurrentTickといれないならば、...
出来ず、それぞれの変数の差は0にならずto=CurrentTickと入っ...
この変数の値(CurrentTick)は増え続けているのである。そし...
がstop_timeに入れた値の時間分を超すとwhileの動作を停止し...
を実行し、ロボットは1秒間止まる。これがプログラム中のt0=C...
の意味合いとなる。~
そして左側のライントレースの場合 if(SENSOR_1<black)とelse...
t0=CurrentTick();が入っておらずblackすなわち20より小さい...
を検知した時間がstop_timeの値の時間分を超過した場合にはwh...
を実行し、ロボットは1秒間止まる
sub followline_L(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){ //stop_timeにい...
if(SENSOR_1<black){ //blackすなわち2...
rotate_left; //この動作が連続...
}else if(SENSOR_1<darkgray){ //darkgrayすなわ...
turn_left; //この動作が連続...
}else if(SENSOR_1>lightdark){ //lightdrayすな...
turn_right; //この動作中はラ...
t0=CurrentTick();
}else if(SENSOR_1<center){ //centerすなわち...
go_straight; //この動作中はラ...
t0=CurrentTick();
}else{ //whiteすなわち5...
rotate_right; //この動作中はラ...
t0=CurrentTick();
}
}
Off(OUT_BC);
Wait(1000);
}
***右側のライントレースの交差点認識 [#z33fa8be]
右側のライントレースの場合、「黒」と「黒と境目の間」の?と...
連続で何秒間か動作したときに、止まるようにする。~
この原理は左側のライントレースの場合と同じとなる。
sub followline_R(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){ //stop_timeにい...
if(SENSOR_1<black){ //blackすなわち2...
rotate_right; //この動作が連...
}else if(SENSOR_1<darkgray){ //darkgrayすなわ...
turn_right; //この動作が連...
}else if(SENSOR_1>lightdark){ //lightdrayすな...
turn_left; //この動作中は...
t0=CurrentTick();
}else if(SENSOR_1<center){ //centerすなわち...
go_straight; //この動作中は...
t0=CurrentTick();
}else{ //whiteすなわち5...
rotate_left; //この動作中は...
t0=CurrentTick();
}
}
Off(OUT_BC);
Wait(1000);
}
又、コースの途中のkからLに向かい、Lで止まるプログラミング...
右側のライントレースで「白」と「白の境目」の?と?の動作を...
止まるプログラミングが完成した。
この場合else if(SENSOR_1>lightdark) とelseに~
t0=CurrentTick();が入っておらずlightdrayすなわち40より大...
を検知した時間がstop_timeの値の時間分を超過した場合にはwh...
を実行し、ロボットは1秒間止まる。
#ref(2019a/Member/Gouki/Mission2/Inked2019a-mission23_LI....
sub followline_R2(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){ //stop_timeにい...
if(SENSOR_1<black){ //blackすなわ...
rotate_right; //この動作中は...
t0=CurrentTick();
}else if(SENSOR_1<darkgray){ //darkgrayすな...
turn_right; //この動作中は...
t0=CurrentTick();
}else if(SENSOR_1>lightdark){ //lightdrayす...
turn_left; //この動作が連...
}else if(SENSOR_1<center){ //centerすなわ...
go_straight2; //この動作中は...
t0=CurrentTick();
}else{ //whiteすなわ...
rotate_left; //この動作が連...
}
}
Off(OUT_BC);
Wait(2000);
}
**交差点横断 [#z69f3aff]
交差点を認識した後、直進、左折、右折の動作をしなければな...
そこで私たちは、ある値を検知するまで一定の動作を行い続け...
○直進~
28より小さい値を検知している時は直進し、~
28より大きい値を検知したら止まる。
→黒い線上では直進
sub Blackto_White()
{
while(SENSOR_1<darkgray){ //darkdrayすなわち28よ...
OnFwd(OUT_BC,15);
}
Off(OUT_BC);
}
○右折~
40より小さい値を検知している時は右折し、~
40より大きい値を検知したら止まる。
→黒い戦場では右折
sub Blackto_White_R()
{
while(SENSOR_1<lightgray){ //lightdrayすなわち40...
OnFwd(OUT_C,20);
OnRev(OUT_B,20);
}
Off(OUT_BC);
}
○左折~
40より小さい値を検知している時は左折し、~
40より大きい値を検知したら止まる。
→黒い戦場では左折
sub Blackto_White_L()
{
while(SENSOR_1<lightgray){ //lightdrayすなわち40...
OnFwd(OUT_B,20);
OnRev(OUT_C,20);
}
Off(OUT_BC);
}
**ボール [#m8834b2f]
今秋の課題ではコースの途中でボールをつかみ、~
ボールを運んで、最後にゴールしなければいけないので~
つかむためのプログラムとゴールするためのプログラムを作成...
***ボールをとるためのプログラム [#e0f200a7]
#define catch OnRev(OUT_A,25);Wait(500);Off(OUT_A);
***ボールを離し、ゴールするためのプログラム [#da74ff35]
ゴールする方法は、ボールを離した際に本体でコツンと押し出...
そのため最後の動作の出力は大幅に上げてある。~
#define release OnFwd(OUT_A,25);Wait(500);Off(OUT_A);
#define osidasi OnFwd(OUT_BC,100);Wait(100);Off(OUT_BC);
***ボールをとった後 [#uc47bf2f]
ボールをとったらある程度左に旋回させ、右側のライントレー...
#define turn OnFwd(OUT_B,25);OnRev(OUT_C,25);Wait(1500);...
*コースを動く流れ [#f050659c]
最終的には下記のような流れで動作を行う。
#ref(2019a/Member/Gouki/Mission2/Inked2019a-mission234_LI...
task main()
{
SetSensorLight(S1);
followline_L(200); //1
Blackto_White(); //2
followline_L(150); //3
Blackto_White_R(); //4
followline_R(200); //5
Blackto_White_R(); //6
followline(150); //7
Blackto_White_R(); //8
followline(150); //9
Blackto_White_R(); //10
followline(150); //11
Blackto_White(); //12
followline_R2(200); //13
catch; //ボールをつかむ
turn; //左に旋回する
followline_R(150); //14
Blackto_White(); //15
followline_R(150); //16
Blackto_White_L(); //17
followline_R(150); //18
release; //ボールを離す
osidasi; //ゴールする
}
*全体のプログラム [#t0578dcf]
#define turn_right OnFwd(OUT_C,25);OnRev(OUT_B,15);
#define turn_left OnFwd(OUT_B,25);OnRev(OUT_C,15);
#define rotate_right OnFwd(OUT_C,20);OnRev(OUT_B,20);
#define rotate_left OnFwd(OUT_B,20);OnRev(OUT_C,20);
#define go_straight OnFwd(OUT_BC,20);
#define go_straight2 OnFwd(OUT_BC,15);
#define turn OnFwd(OUT_B,25);OnRev(OUT_C,25);Wait(1500);...
#define catch OnRev(OUT_A,25);Wait(500);Off(OUT_A);
#define release OnFwd(OUT_A,25);Wait(500);Off(OUT_A);
#define osidasi OnFwd(OUT_BC,100);Wait(100);Off(OUT_BC);
#define black 20
#define white 50
#define lightgray 40
#define darkgray 28
#define center 35
sub followline_L(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){
if(SENSOR_1<black){
rotate_left;
}else if(SENSOR_1<darkgray){
turn_left;
}else if(SENSOR_1>lightdark){
turn_right;
t0=CurrentTick();
}else if(SENSOR_1<center){
go_straight;
t0=CurrentTick();
}else{
rotate_right;
t0=CurrentTick();
}
}
Off(OUT_BC);
Wait(1000);
}
sub followline_R(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){
if(SENSOR_1<black){
rotate_right;
}else if(SENSOR_1<darkgray){
turn_right;
}else if(SENSOR_1>lightdark){
turn_left;
t0=CurrentTick();
}else if(SENSOR_1<center){
go_straight;
t0=CurrentTick();
}else{
rotate_left;
t0=CurrentTick();
}
}
Off(OUT_BC);
Wait(1000);
}
sub followline_R2(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){
if(SENSOR_1<black){
rotate_right;
t0=CurrentTick();
}else if(SENSOR_1<darkgray){
turn_right;
t0=CurrentTick();
}else if(SENSOR_1>lightdark){
turn_left;
}else if(SENSOR_1<center){
go_straight2;
t0=CurrentTick();
}else{
rotate_left;
}
}
Off(OUT_BC);
Wait(2000);
}
sub Blackto_White()
{
while(SENSOR_1<darkgray){
OnFwd(OUT_BC,15);
}
Off(OUT_BC);
}
sub Blackto_White_R()
{
while(SENSOR_1<lightgray){
OnFwd(OUT_C,20);
OnRev(OUT_B,20);
}
Off(OUT_BC);
}
sub Blackto_White_L()
{
while(SENSOR_1<lightgray){
OnFwd(OUT_B,20);
OnRev(OUT_C,20);
}
Off(OUT_BC);
}
task main()
{
SetSensorLight(S1);
followline_L(200);
Blackto_White();
followline_L(150);
Blackto_White_R();
followline_R(200);
Blackto_White_R();
followline(150);
Blackto_White_R();
followline(150);
Blackto_White_R();
followline(150);
Blackto_White();
followline_R2(200);
catch;
turn;
followline_R(150);
Blackto_White();
followline_R(150);
Blackto_White_L();
followline_R(150);
release;
osidasi;
}
*まとめ [#y2be8016]
今回の課題では、ミスをせずきちんと完走させ、ゴールするこ...
ロボットの機体としての出来もよくきちんと走ってくれたが、...
動きが鈍くなる時があった。
結果だけを見ると良かったものの、まだプログラミングにかけ...
余計なプログラムもある。
今々考えてみると、途中の左旋回はいらなくて、そのままライ...
させればプログラムがもっと短くなると思った。~
まだまだ、プログラムの面で余計なところがあると思うので、~
次の課題ではそのようなミスを減らして、簡潔でよりよいプロ...
仕上げられるようにしたいと思う。
終了行:
目次
#contents
*課題について [#xd5df109]
下のような図をチームごとに作成し、黒い線の上を走るような...
#ref(2019a/Member/Gouki/Mission2/2019a-mission2.png,70%);
**課題の詳細 [#f419cc01]
A地点を出発し、次の経路を黒い線にそって動き、最後にピンポ...
#ref(2019a/Member/Gouki/Mission2/Inked2019a-mission2_LI.j...
?A地点から出発
?Bを直進
?Cを直進
?Dを一時停止の後に直進
?Eを直進
?Fを直進
?Gを一時停止の後に右折
?Hを直進
?Iを直進
?Jを右折
?Kを左折
?Lでピンポン玉をつかむ
?Kを直進
?Mで一時停止
?シュート
?A地点に入る(ゴール)
*ロボット本体について [#d3ddfb99]
**ロボット全体 [#f2f596ad]
#ref(2019a/Member/Gouki/Mission2/line_175788711878042.jpg...
今回の機体を制作するにあたり、図上できちんと小回りがきく...
**光センサー部分 [#z7f7e944]
#ref(2019a/Member/Gouki/Mission2/line_175812470413242.jpg...
光センサーの場所は、近すぎず遠すぎずなるべく正確な値を図...
**タイヤ部分 [#o8ddbba8]
#ref(2019a/Member/Gouki/Mission2/line_175792940901791.jpg...
タイヤはなるべく光センサーに近くなるように設計した。~
理由としては、光を検知し、タイヤをいち早く検知した光の値...
**つかむ機構 [#q8a37cf4]
#ref(2019a/Member/Gouki/Mission2/line_175760293908939.jpg...
#ref(2019a/Member/Gouki/Mission2/Inkedline_17575013233977...
アームの開閉の構造は図を見てもらった方が分かりやすいが、~
?モーターを向かって上から上方向に回すとアームを開く~
?モーターを向かって上から下方向に回すとアームが閉じる~
*個々のプログラムについて [#x8c757c8]
**ライントレース [#ja65743e]
今回は、黒い線を追従するライントレースのプログラミングを...
まずは光の値を測る。私たちは「完全に真っ白」、「白と境目...
「完全に黒」の5つの部分に色を分けて測った。~
それらの値は以下の図のようになった。
#ref(2019a/Member/Gouki/Mission2/Hikarinoatai.png,30%);
プログラミングでは、それぞれの値を以下のように定義する。
#define black 20
#define white 50
#define lightgray 40
#define darkgray 28
#define center 35
明かるさの値を5段階に分け、それらに対応する5つの動作を...
下の図がその動作であり、明るさや場合によってどの動きにな...
#ref(2019a/Member/Gouki/Mission2/ugokuhoukou.png,30%);
以下がその動作を定義したプログラミングである。
#define turn_right OnFwd(OUT_C,25);OnRev(OUT_B,15);//?
#define turn_left OnFwd(OUT_B,25);OnRev(OUT_C,15);//?
#define rotate_right OnFwd(OUT_C,20);OnRev(OUT_B,20);//?
#define rotate_left OnFwd(OUT_B,20);OnRev(OUT_C,20);//?
#define go_straight OnFwd(OUT_BC,20);//?
#define go_straight2 OnFwd(OUT_BC,15);//?の出力を少し下...
***左側のライントレース [#ye3aa3a8]
右側と左側とでのライントレースではプログラミングが異なっ...
それぞれ分けて考える。
sub followline_L(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){
if(SENSOR_1<black){
rotate_left; //明るさが20よ...
}else if(SENSOR_1<darkgray){
turn_left; //明るさが28よ...
}else if(SENSOR_1>lightdark){
turn_right; //明るさが35よ...
}else if(SENSOR_1<center){
go_straight; //明るさが40よ...
}else{
rotate_right; //明るさが50よ...
}
}
}
水色の矢印がプログラミングで動作する方向である。
#ref(2019a/Member/Gouki/Mission2/InkedHikarinoatai_LI.jpg...
***右側のライントレース [#ga54f680]
左側のライントレースと同様に右側のライントレースも考える。
sub followline_R(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){
if(SENSOR_1<black){
rotate_right; //明るさが20より...
}else if(SENSOR_1<darkgray){
turn_right; //明るさが28より...
}else if(SENSOR_1>lightdark){
turn_left; //明るさが35より...
}else if(SENSOR_1<center){
go_straight; //明るさが40より...
}else{
rotate_left; //明るさが50より...
}
}
}
#ref(2019a/Member/Gouki/Mission2/Inkedhikari2_LI.jpg,30%);
赤色の矢印がプログラミングで動作する方向である。
**交差点認識 [#pf6b85ac]
ライントレースをする際に途中で交差点にさしかかる。そのま...
そのために交差点を認識するプログラミングを作成する。それ...
又、今回は交差点を認識した際に、数秒間停止しなければなら...
***左側のライントレースの交差点認識 [#o18ba70d]
左側のライントレースの場合、「黒」と「黒と境目の間」の?と...
連続で何秒間か動作したときに、止まるようにする。
始めにt0=CurrentTickとおき、それぞれの変数の値の差(Curren...
ifやelse ifのなかにいれ、それをロボットが認識するたびにこ...
to=CurrentTickと入れていないとそれぞれの変数の差は0に更新...
すなわちifやelse ifの中にto=CurrentTickといれないならば、...
出来ず、それぞれの変数の差は0にならずto=CurrentTickと入っ...
この変数の値(CurrentTick)は増え続けているのである。そし...
がstop_timeに入れた値の時間分を超すとwhileの動作を停止し...
を実行し、ロボットは1秒間止まる。これがプログラム中のt0=C...
の意味合いとなる。~
そして左側のライントレースの場合 if(SENSOR_1<black)とelse...
t0=CurrentTick();が入っておらずblackすなわち20より小さい...
を検知した時間がstop_timeの値の時間分を超過した場合にはwh...
を実行し、ロボットは1秒間止まる
sub followline_L(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){ //stop_timeにい...
if(SENSOR_1<black){ //blackすなわち2...
rotate_left; //この動作が連続...
}else if(SENSOR_1<darkgray){ //darkgrayすなわ...
turn_left; //この動作が連続...
}else if(SENSOR_1>lightdark){ //lightdrayすな...
turn_right; //この動作中はラ...
t0=CurrentTick();
}else if(SENSOR_1<center){ //centerすなわち...
go_straight; //この動作中はラ...
t0=CurrentTick();
}else{ //whiteすなわち5...
rotate_right; //この動作中はラ...
t0=CurrentTick();
}
}
Off(OUT_BC);
Wait(1000);
}
***右側のライントレースの交差点認識 [#z33fa8be]
右側のライントレースの場合、「黒」と「黒と境目の間」の?と...
連続で何秒間か動作したときに、止まるようにする。~
この原理は左側のライントレースの場合と同じとなる。
sub followline_R(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){ //stop_timeにい...
if(SENSOR_1<black){ //blackすなわち2...
rotate_right; //この動作が連...
}else if(SENSOR_1<darkgray){ //darkgrayすなわ...
turn_right; //この動作が連...
}else if(SENSOR_1>lightdark){ //lightdrayすな...
turn_left; //この動作中は...
t0=CurrentTick();
}else if(SENSOR_1<center){ //centerすなわち...
go_straight; //この動作中は...
t0=CurrentTick();
}else{ //whiteすなわち5...
rotate_left; //この動作中は...
t0=CurrentTick();
}
}
Off(OUT_BC);
Wait(1000);
}
又、コースの途中のkからLに向かい、Lで止まるプログラミング...
右側のライントレースで「白」と「白の境目」の?と?の動作を...
止まるプログラミングが完成した。
この場合else if(SENSOR_1>lightdark) とelseに~
t0=CurrentTick();が入っておらずlightdrayすなわち40より大...
を検知した時間がstop_timeの値の時間分を超過した場合にはwh...
を実行し、ロボットは1秒間止まる。
#ref(2019a/Member/Gouki/Mission2/Inked2019a-mission23_LI....
sub followline_R2(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){ //stop_timeにい...
if(SENSOR_1<black){ //blackすなわ...
rotate_right; //この動作中は...
t0=CurrentTick();
}else if(SENSOR_1<darkgray){ //darkgrayすな...
turn_right; //この動作中は...
t0=CurrentTick();
}else if(SENSOR_1>lightdark){ //lightdrayす...
turn_left; //この動作が連...
}else if(SENSOR_1<center){ //centerすなわ...
go_straight2; //この動作中は...
t0=CurrentTick();
}else{ //whiteすなわ...
rotate_left; //この動作が連...
}
}
Off(OUT_BC);
Wait(2000);
}
**交差点横断 [#z69f3aff]
交差点を認識した後、直進、左折、右折の動作をしなければな...
そこで私たちは、ある値を検知するまで一定の動作を行い続け...
○直進~
28より小さい値を検知している時は直進し、~
28より大きい値を検知したら止まる。
→黒い線上では直進
sub Blackto_White()
{
while(SENSOR_1<darkgray){ //darkdrayすなわち28よ...
OnFwd(OUT_BC,15);
}
Off(OUT_BC);
}
○右折~
40より小さい値を検知している時は右折し、~
40より大きい値を検知したら止まる。
→黒い戦場では右折
sub Blackto_White_R()
{
while(SENSOR_1<lightgray){ //lightdrayすなわち40...
OnFwd(OUT_C,20);
OnRev(OUT_B,20);
}
Off(OUT_BC);
}
○左折~
40より小さい値を検知している時は左折し、~
40より大きい値を検知したら止まる。
→黒い戦場では左折
sub Blackto_White_L()
{
while(SENSOR_1<lightgray){ //lightdrayすなわち40...
OnFwd(OUT_B,20);
OnRev(OUT_C,20);
}
Off(OUT_BC);
}
**ボール [#m8834b2f]
今秋の課題ではコースの途中でボールをつかみ、~
ボールを運んで、最後にゴールしなければいけないので~
つかむためのプログラムとゴールするためのプログラムを作成...
***ボールをとるためのプログラム [#e0f200a7]
#define catch OnRev(OUT_A,25);Wait(500);Off(OUT_A);
***ボールを離し、ゴールするためのプログラム [#da74ff35]
ゴールする方法は、ボールを離した際に本体でコツンと押し出...
そのため最後の動作の出力は大幅に上げてある。~
#define release OnFwd(OUT_A,25);Wait(500);Off(OUT_A);
#define osidasi OnFwd(OUT_BC,100);Wait(100);Off(OUT_BC);
***ボールをとった後 [#uc47bf2f]
ボールをとったらある程度左に旋回させ、右側のライントレー...
#define turn OnFwd(OUT_B,25);OnRev(OUT_C,25);Wait(1500);...
*コースを動く流れ [#f050659c]
最終的には下記のような流れで動作を行う。
#ref(2019a/Member/Gouki/Mission2/Inked2019a-mission234_LI...
task main()
{
SetSensorLight(S1);
followline_L(200); //1
Blackto_White(); //2
followline_L(150); //3
Blackto_White_R(); //4
followline_R(200); //5
Blackto_White_R(); //6
followline(150); //7
Blackto_White_R(); //8
followline(150); //9
Blackto_White_R(); //10
followline(150); //11
Blackto_White(); //12
followline_R2(200); //13
catch; //ボールをつかむ
turn; //左に旋回する
followline_R(150); //14
Blackto_White(); //15
followline_R(150); //16
Blackto_White_L(); //17
followline_R(150); //18
release; //ボールを離す
osidasi; //ゴールする
}
*全体のプログラム [#t0578dcf]
#define turn_right OnFwd(OUT_C,25);OnRev(OUT_B,15);
#define turn_left OnFwd(OUT_B,25);OnRev(OUT_C,15);
#define rotate_right OnFwd(OUT_C,20);OnRev(OUT_B,20);
#define rotate_left OnFwd(OUT_B,20);OnRev(OUT_C,20);
#define go_straight OnFwd(OUT_BC,20);
#define go_straight2 OnFwd(OUT_BC,15);
#define turn OnFwd(OUT_B,25);OnRev(OUT_C,25);Wait(1500);...
#define catch OnRev(OUT_A,25);Wait(500);Off(OUT_A);
#define release OnFwd(OUT_A,25);Wait(500);Off(OUT_A);
#define osidasi OnFwd(OUT_BC,100);Wait(100);Off(OUT_BC);
#define black 20
#define white 50
#define lightgray 40
#define darkgray 28
#define center 35
sub followline_L(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){
if(SENSOR_1<black){
rotate_left;
}else if(SENSOR_1<darkgray){
turn_left;
}else if(SENSOR_1>lightdark){
turn_right;
t0=CurrentTick();
}else if(SENSOR_1<center){
go_straight;
t0=CurrentTick();
}else{
rotate_right;
t0=CurrentTick();
}
}
Off(OUT_BC);
Wait(1000);
}
sub followline_R(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){
if(SENSOR_1<black){
rotate_right;
}else if(SENSOR_1<darkgray){
turn_right;
}else if(SENSOR_1>lightdark){
turn_left;
t0=CurrentTick();
}else if(SENSOR_1<center){
go_straight;
t0=CurrentTick();
}else{
rotate_left;
t0=CurrentTick();
}
}
Off(OUT_BC);
Wait(1000);
}
sub followline_R2(int stop_time)
{
long t0=CurrentTick();
while(CurrentTick()-t0<stop_time){
if(SENSOR_1<black){
rotate_right;
t0=CurrentTick();
}else if(SENSOR_1<darkgray){
turn_right;
t0=CurrentTick();
}else if(SENSOR_1>lightdark){
turn_left;
}else if(SENSOR_1<center){
go_straight2;
t0=CurrentTick();
}else{
rotate_left;
}
}
Off(OUT_BC);
Wait(2000);
}
sub Blackto_White()
{
while(SENSOR_1<darkgray){
OnFwd(OUT_BC,15);
}
Off(OUT_BC);
}
sub Blackto_White_R()
{
while(SENSOR_1<lightgray){
OnFwd(OUT_C,20);
OnRev(OUT_B,20);
}
Off(OUT_BC);
}
sub Blackto_White_L()
{
while(SENSOR_1<lightgray){
OnFwd(OUT_B,20);
OnRev(OUT_C,20);
}
Off(OUT_BC);
}
task main()
{
SetSensorLight(S1);
followline_L(200);
Blackto_White();
followline_L(150);
Blackto_White_R();
followline_R(200);
Blackto_White_R();
followline(150);
Blackto_White_R();
followline(150);
Blackto_White_R();
followline(150);
Blackto_White();
followline_R2(200);
catch;
turn;
followline_R(150);
Blackto_White();
followline_R(150);
Blackto_White_L();
followline_R(150);
release;
osidasi;
}
*まとめ [#y2be8016]
今回の課題では、ミスをせずきちんと完走させ、ゴールするこ...
ロボットの機体としての出来もよくきちんと走ってくれたが、...
動きが鈍くなる時があった。
結果だけを見ると良かったものの、まだプログラミングにかけ...
余計なプログラムもある。
今々考えてみると、途中の左旋回はいらなくて、そのままライ...
させればプログラムがもっと短くなると思った。~
まだまだ、プログラムの面で余計なところがあると思うので、~
次の課題ではそのようなミスを減らして、簡潔でよりよいプロ...
仕上げられるようにしたいと思う。
ページ名: