2019a/Member/sotaex/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2019a/Member]]
#contents
*課題・方針 [#tf80aef5]
**ポリシー [#q02baee2]
まず、課題やロボットが具体的に明らかになる前に、決めてい...
それは、作動速度は遅くても、正確に動作するロボットを作ろ...
**課題 [#s6a09795]
今回の課題3は…~
課題2で使用した紙を使用し2つを上下逆になるように組み合わ...
生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片方...
残りの2個の玉は課題2と同じ位置に置く。~
それらの玉を、空の容器の方に入れる。~
フィールド(Z,Z'および2枚の境界のラインはルールに則って付...
&ref(コース.jpeg);
**方針 [#f59d202b]
ラインをたどってボール間を移動、その合間にボールの補足、...
*ハード [#t554702d]
2台連携ではタイミングよく連携を取れるかどうかにおいて不確...
**ルールに従うために [#q9277dd4]
ロボットはAの四角い枠に入らなくてはいけないので、できるだ...
その際、課題1で作成したロボットの『移動用モーターを上から...
**構成案 [#w9d2426c]
-ギアを使ってモーター一つで左右から同時に挟めるクレーンゲ...
-そのアームを上下させる機構が必要ではないか~
-やはり移動のモーターは安定性のためにギアが必要ではないか~
-色覚センサーを2つ搭載してライントレースを左右の端を決め...
-超音波センサーを使ってボールとの距離を測れば良いのではな...
などの案が出た
**構成案実現のために [#a9abcc92]
分担をしてパーツごとで組むことにした。~
それを持ち寄って、互いに改良していけば更に高度なものがで...
**概形完成後のテコ入れ [#ie60f14f]
その『持ち寄り』の先で、完成後も新たに変更した点について...
***直上型モーター配置 [#a46f5c41]
先述の通り、コンパクト型にするために課題1でのロボットを参...
そのほかにも、横置き型のモーター配置で設計したところ、全...
参考:課題1のロボット~
&ref(v1robot.jpeg);~
***クレーン先 [#h553004e]
クレーン先のアームはクレーンゲームのように緻密な操作でな...
***クレーン関連のギア [#u52477b9]
-当初は同じものをアームじゅうにつたわせて、シンプルな構造...
-両側からギアで挟むことで、アームの連動性も上がった。
***クレーン上下用モーターの周辺ギア [#fc3d87c8]
クレーンをもちあげるのはたった一つのモーターなので、速さ...
なので、比重の大きいギアを採用した。
***ダブルカラーセンサー [#q9283bdb]
課題2と同様、色覚センサーの位置にこだわった。作成したプロ...
**最終的な構成 [#b8e6a18c]
プログラムの組みやすさを考えると以下の通りとなった。超音...
&ref(system.jpeg);
**完成系 [#p574c054]
クレーンの系~
&ref(clane.jpeg);~
それ以外の(ライントレーサー)~
&ref(tracer.jpeg);~
全体像~
&ref(v3robot.jpeg);~
**まとめ [#i8c2d495]
-確実にボールを捉えることができ
-安定して走破でき~
るための工夫を凝らした。
*プログラム [#ub2b3db5]
**連携 [#p8edf9fd]
二台はbluetoothで連携している。ラグの考慮として、short_br...
**注意した点 [#ee2b0939]
効率にも目を向けて、作業中も注釈文やビープ音を使って修正...
**ルート [#ma530ef8]
黒いラインを辿ることのみの移動とし全ての行程を確実なもの...
**SLAVE [#pc3ef195]
SLAVEのなす操作は、ボールをホールド、リリースしたり、クレ...
~
まずメールボックス用のナンバーを定義して…~
#define ball_release 11
#define ball_catch 12
#define arm_up 13
#define arm_down 14
#define completed 15
#define up_catch 16
#define down_release 17
あとは受け取った番号に合わせて動作するのみである。(センサ...
task main()
{
int msg;
while(true){
ReceiveRemoteNumber(MAILBOX1,true,msg);
if(msg==ball_release){ //メッ...
OnFwd(OUT_A,50);Wait(500);Off(OUT_A);Wait(500);//(ボ...
SendResponseNumber(MAILBOX1,completed); //compl...
masterに送る(以下これに倣う)
} //ボー...
if(msg==ball_catch){
OnRev(OUT_A,50);Wait(600);Off(OUT_A);Wait(500);
SendResponseNumber(MAILBOX1,completed);
} //ボー...
if(msg==arm_up){
OnFwd(OUT_B,50);Wait(600); OnFwd(OUT_B,5);Wait(500);
SendResponseNumber(MAILBOX1,completed);
} //クレ...
if(msg==arm_down){
OnRev(OUT_B,30);Wait(600); OnFwd(OUT_B,5);Wait(500);
SendResponseNumber(MAILBOX1,completed);
} //クレ...
if(msg==up_catch){
OnFwd(OUT_B,40);OnRev(OUT_A,15);Wait(300);
SendResponseNumber(MAILBOX1,completed);
} //ボー...
クレーンを上げる動作
if(msg==down_release){
OnRev(OUT_B,10);OnFwd(OUT_A,20);Wait(150);
SendResponseNumber(MAILBOX1,completed);
} //ボー...
クレーンを下げる動作
Wait(100); //小休...
これがなければカクカクした動作となり、ちょっとずつしか動...
の名残。今はif文の中の動作でwaitが使われているので必要が...
msg=0; //メッ...
} //while閉
} //task ...
**MASTER [#ib2e4e7e]
***defineとサブルーチン [#he52402a]
説明の前段階として定義とサブルーチンを紹介しておく~
-defineの紹介~
#define KOSATEN 37 //色覚センサー黒...
#define completed 15 //slaveから送られ...
#define turn_left OnRev(OUT_A,70);OnFwd(OUT_B,70); //...
#define go_left OnRev(OUT_A,85);Off(OUT_B); //...
#define go_straight OnRev(OUT_AB,70); //...
#define go_right OnRev(OUT_B,85);Off(OUT_A); //...
#define turn_right OnRev(OUT_B,100);OnFwd(OUT_A,100) //...
#define short_break Off(OUT_AB);Wait(1000); //...
#define brake Off(OUT_AB) //...
define_その他説明~
--何故逆回転の右回転がパワー100なのかは今考えると不明。(...
--それぞれの動作のパワーの大きさは、内側に行く動きの大き...
--break(小休憩)とbrake(ブレーキ)は綴りが似ているが意味は...
-subの説明~
sub follow_line() //...
{
while((SENSOR_1>KOSATEN)||(SENSOR_2>KOSATEN)){
int d=SENSOR_1-SENSOR_2;
if (d<-6){
turn_right;
}else if (d<-3){
go_right;
}else if (d<=3){
go_straight;
}else if (d<=6){
go_left;
}else {
turn_left;
}
}
PlaySound(SOUND_CLICK);
brake;Wait(200);
}
sub follow_line2(int followtime) //タイマーを使...
{
long t0=CurrentTick();
while(CurrentTick()-t0<followtime){
int d=SENSOR_1-SENSOR_2;
if (d<-6){
turn_right;
}else if (d<-3){
go_right;
}else if (d<=3){
go_straight;
}else if (d<=6){
go_left;
}else {
turn_left;
}
}
PlaySound(SOUND_CLICK);
brake;Wait(200);
}
sub chokusinL() //直進左
{
go_left;Wait(500); //Waitは調整
}
sub chokusinR() //直進右
{
go_right;Wait(500); //同上
}
sub sasetsu() //左折
{
turn_left;Wait(500); //左回転と左前方直...
go_left;Wait(500); //同上
}
sub usetsu(int migi) //右折(行程に含ま...
{
turn_right;Wait(500); //右回転と右前方直...
go_right;Wait(migi); //同上
}
sub turn_behind() //振り向く
{
turn_left;Wait(1000); //右の色覚センサー...
ースをストップさせる)
while(SENSOR_1>KOSATEN){ //右の色覚センサー...
turn_left; //左に回転しろ
}
Off(OUT_BC); //ブレーキの役割
}
sub backleft() //後退し右を向く
{
OnFwd(OUT_A,100);Off(OUT_B);Wait(1500);//(時間調整のた...
turn_right;Wait(600);
Off(OUT_AB);
}
sub backright() //後退し左を向く
{
OnFwd(OUT_B,100);Off(OUT_A);Wait(1400);//同上
turn_left;Wait(500);
Off(OUT_AB);
}
sub ball_catch() //玉を掴む(slaveの...
{
int msg;
SendRemoteNumber(1,MAILBOX1,12);
while(msg==completed){
ReceiveRemoteNumber(MAILBOX1,true,msg);
}
}
sub ball_release() //玉を放す(slaveの...
{
int msg;
SendRemoteNumber(1,MAILBOX1,11);
while(msg==completed){
ReceiveRemoteNumber(MAILBOX1,true,msg);
}
}
sub arm_up() //アームを上げる(sl...
{
int msg;
SendRemoteNumber(1,MAILBOX1,13);
while(msg==completed){
ReceiveRemoteNumber(MAILBOX1,true,msg);
}
}
sub arm_down() //アームを下げる(sl...
{
int msg;
SendRemoteNumber(1,MAILBOX1,14);
while(msg==completed){
ReceiveRemoteNumber(MAILBOX1,true,msg);
}
}
sub up_catch() //アームを上げなが...
{
int msg;
SendRemoteNumber(1,MAILBOX1,16);
while(msg==completed){
ReceiveRemoteNumber(MAILBOX1,true,msg);
}
}
sub down_release() //アームを下げなが...
{
int msg;
SendRemoteNumber(1,MAILBOX1,17);
while(msg==completed){
ReceiveRemoteNumber(MAILBOX1,true,msg);
}
}
sub_その他の説明
-masterが行う右折・左折・直進右・直進左・直進などは交差点...
***新ライントレース (左右2つのカラーセンサーを用いて)[#ae...
色覚センサーが二つになったので、正確に、ラインの端ではな...
しきい値を使った方法もあり得るのだが、研究した結果、シン...
左右を比べて、値が小さい方に動けば、黒色を辿ることができ...
例)左の方が右より小さければ左前方へ進む~
具体的には以下のような形…~
int d=SENSOR_1-SENSOR_2;//differenceの頭文字をとって
dでSENSOR_1(右)とSENSOR_2(左)の差を定義
if (d<-6){ //(小さい順から考えていく)右より...
turn_right; //右に(左右逆での)回転
}else if (d<-3){ //右より左の値がわずかに大きいな...
go_right; //右前へ進む
}else if (d<=3){ //左右の値がほぼ同じならば
go_straight; //直進
}else if (d<=6){ //左より右の値がわずかに大きいな...
go_left; //左前へ進む
}else { //左より右の値が極端に大きいならば
turn_left; //左に(左右逆での)回転
}
-距離の測り方 ~
サブルーチンの紹介で明らかになっているが、もう一度示して...
sub follow_line2(int followtime) //followtimeの関...
汎用性が高い。
{
long t0=CurrentTick(); //この時点での時...
while(CurrentTick()-t0<followtime){ //関数followtime...
小さいときのみ繰り返す。
int d=SENSOR_1-SENSOR_2; //以下上述の新ラ...
if (d<-6){
turn_right;
}else if (d<-3){
go_right;
}else if (d<=3){
go_straight;
}else if (d<=6){
go_left;
}else {
turn_left;
}
} //while閉
PlaySound(SOUND_CLICK); //whileが終わり...
brake;Wait(200); //小休憩
}
-交差点の識別 ~
こちらもサブルーチンは上で紹介したが、もう一度示す。
sub follow_line() //...
{
while((SENSOR_1>KOSATEN)||(SENSOR_2>KOSATEN)){ //...
満たしている間繰り返す。
int d=SENSOR_1-SENSOR_2; //...
if (d<-6){
turn_right;
}else if (d<-3){
go_right;
}else if (d<=3){
go_straight;
}else if (d<=6){
go_left;
}else {
turn_left;
}
} //while閉
PlaySound(SOUND_CLICK); //whileが終わり...
brake;Wait(200); //小休憩
}
ある条件について~
意味的には、左右両方黒とならない。ことなのだが、~
論理積でなく論理和を用いた。高校数学?で習うことだが、~
ド・モルガンの定理:「”条件A”または”条件B”の否定」は「”条...
という定理があった。~
ここではSENSOR_1もSENSOR_2も”黒でない”という否定の条件の...
***task main(全体の行程の説明) [#i1552100]
下準備は整ったので、予定したコースに従っていく。(参照のア...
予定のルート~
&ref(ルート.jpeg);
task main()
{
SetSensorLight(S1); //右カラーセンサー
SetSensorLight(S2); //左カラーセンサー
arm_up(); //クレーン上昇(以下同コ...
short_break; //※1
ball_release(); //ボールをリリース(アー...
go_straight;Wait(2000); //Mまで直進
follow_line(); //交差点判別付きライント...
chokusinR(); //K
follow_line2(1500); //KL間を時間を測りながら...
short_break; //L
arm_down(); //クレーン降下(以下同コ...
short_break; //※1
ここより1球目
ball_catch(); //ボールキャッチ(アーム...
short_break; //※1
arm_up();
short_break; //※1
turn_behind(); //振り返って方向転換(以...
follow_line();
chokusinL(); //K
follow_line();
usetsu(500); //M
follow_line();
sasetsu();
follow_line();
chokusinL(); //B
follow_line();
usetsu(500); //X
follow_line();
sasetsu(); //X'
follow_line();
chokusinR(); //B'
follow_line();
sasetsu(); //M'
follow_line();
sasetsu(); //K'
follow_line2(1000);
short_break; //J'
ball_release(); //リリース
1球目終了、2球目(L')まで移動
short_break;
backleft(); //K'
follow_line2(3700);
short_break; //L'
arm_down();
short_break; //※1
ここより2球目
ball_catch(); //ボールキャッチ
short_break; //※1
arm_up();
short_break; //※1
turn_behind();
OnFwd(OUT_AB,30);Wait(100);
follow_line();
usetsu(500); //K'
follow_line2(500);
short_break; //J'
ball_release(); //リリース
2球目終了。3・4球目(I)まで移動
short_break; //※1
backright();
follow_line();
chokusinL();
follow_line();
usetsu(500); //M'
follow_line();
chokusinL(); //B'
follow_line();
usetsu(500); //X'
follow_line();
sasetsu(); //X
follow_line();
sasetsu(); //B
follow_line();
usetsu(400); //C
follow_line2(1650);
short_break; //I
ここより3・4球目
arm_down();
short_break; //※1
ball_catch(); //ボールキャッチ
short_break; //※1
up_catch();
short_break; //※1
backleft(); //C
follow_line();
usetsu(500); //B
follow_line();
usetsu(500); //X
follow_line();
sasetsu(); //X'
follow_line();
sasetsu(); //B'
follow_line();
usetsu(700);
follow_line2(900);
short_break; //J'
down_release(); //リリース
short_break; //※1
arm_up();
short_break; //※1
backright(); //K'
}
※1 slaveが動作する間、masterが動かないようにする
*感想 [#r59f5759]
急ピッチで仕上げたので2台での連携でもっと発展的なことがで...
チームメイト3人の協力で、特に私以外の2人の力が大きくて、...
皆さんの協力だけでなく、説明のなかにも、『課題1』、『課...
達成感がものすごくて、充実した前期を過ごすことができたと...
終了行:
[[2019a/Member]]
#contents
*課題・方針 [#tf80aef5]
**ポリシー [#q02baee2]
まず、課題やロボットが具体的に明らかになる前に、決めてい...
それは、作動速度は遅くても、正確に動作するロボットを作ろ...
**課題 [#s6a09795]
今回の課題3は…~
課題2で使用した紙を使用し2つを上下逆になるように組み合わ...
生協のお弁当の四角いプラ容器2つをそれぞれ円内に置き、片方...
残りの2個の玉は課題2と同じ位置に置く。~
それらの玉を、空の容器の方に入れる。~
フィールド(Z,Z'および2枚の境界のラインはルールに則って付...
&ref(コース.jpeg);
**方針 [#f59d202b]
ラインをたどってボール間を移動、その合間にボールの補足、...
*ハード [#t554702d]
2台連携ではタイミングよく連携を取れるかどうかにおいて不確...
**ルールに従うために [#q9277dd4]
ロボットはAの四角い枠に入らなくてはいけないので、できるだ...
その際、課題1で作成したロボットの『移動用モーターを上から...
**構成案 [#w9d2426c]
-ギアを使ってモーター一つで左右から同時に挟めるクレーンゲ...
-そのアームを上下させる機構が必要ではないか~
-やはり移動のモーターは安定性のためにギアが必要ではないか~
-色覚センサーを2つ搭載してライントレースを左右の端を決め...
-超音波センサーを使ってボールとの距離を測れば良いのではな...
などの案が出た
**構成案実現のために [#a9abcc92]
分担をしてパーツごとで組むことにした。~
それを持ち寄って、互いに改良していけば更に高度なものがで...
**概形完成後のテコ入れ [#ie60f14f]
その『持ち寄り』の先で、完成後も新たに変更した点について...
***直上型モーター配置 [#a46f5c41]
先述の通り、コンパクト型にするために課題1でのロボットを参...
そのほかにも、横置き型のモーター配置で設計したところ、全...
参考:課題1のロボット~
&ref(v1robot.jpeg);~
***クレーン先 [#h553004e]
クレーン先のアームはクレーンゲームのように緻密な操作でな...
***クレーン関連のギア [#u52477b9]
-当初は同じものをアームじゅうにつたわせて、シンプルな構造...
-両側からギアで挟むことで、アームの連動性も上がった。
***クレーン上下用モーターの周辺ギア [#fc3d87c8]
クレーンをもちあげるのはたった一つのモーターなので、速さ...
なので、比重の大きいギアを採用した。
***ダブルカラーセンサー [#q9283bdb]
課題2と同様、色覚センサーの位置にこだわった。作成したプロ...
**最終的な構成 [#b8e6a18c]
プログラムの組みやすさを考えると以下の通りとなった。超音...
&ref(system.jpeg);
**完成系 [#p574c054]
クレーンの系~
&ref(clane.jpeg);~
それ以外の(ライントレーサー)~
&ref(tracer.jpeg);~
全体像~
&ref(v3robot.jpeg);~
**まとめ [#i8c2d495]
-確実にボールを捉えることができ
-安定して走破でき~
るための工夫を凝らした。
*プログラム [#ub2b3db5]
**連携 [#p8edf9fd]
二台はbluetoothで連携している。ラグの考慮として、short_br...
**注意した点 [#ee2b0939]
効率にも目を向けて、作業中も注釈文やビープ音を使って修正...
**ルート [#ma530ef8]
黒いラインを辿ることのみの移動とし全ての行程を確実なもの...
**SLAVE [#pc3ef195]
SLAVEのなす操作は、ボールをホールド、リリースしたり、クレ...
~
まずメールボックス用のナンバーを定義して…~
#define ball_release 11
#define ball_catch 12
#define arm_up 13
#define arm_down 14
#define completed 15
#define up_catch 16
#define down_release 17
あとは受け取った番号に合わせて動作するのみである。(センサ...
task main()
{
int msg;
while(true){
ReceiveRemoteNumber(MAILBOX1,true,msg);
if(msg==ball_release){ //メッ...
OnFwd(OUT_A,50);Wait(500);Off(OUT_A);Wait(500);//(ボ...
SendResponseNumber(MAILBOX1,completed); //compl...
masterに送る(以下これに倣う)
} //ボー...
if(msg==ball_catch){
OnRev(OUT_A,50);Wait(600);Off(OUT_A);Wait(500);
SendResponseNumber(MAILBOX1,completed);
} //ボー...
if(msg==arm_up){
OnFwd(OUT_B,50);Wait(600); OnFwd(OUT_B,5);Wait(500);
SendResponseNumber(MAILBOX1,completed);
} //クレ...
if(msg==arm_down){
OnRev(OUT_B,30);Wait(600); OnFwd(OUT_B,5);Wait(500);
SendResponseNumber(MAILBOX1,completed);
} //クレ...
if(msg==up_catch){
OnFwd(OUT_B,40);OnRev(OUT_A,15);Wait(300);
SendResponseNumber(MAILBOX1,completed);
} //ボー...
クレーンを上げる動作
if(msg==down_release){
OnRev(OUT_B,10);OnFwd(OUT_A,20);Wait(150);
SendResponseNumber(MAILBOX1,completed);
} //ボー...
クレーンを下げる動作
Wait(100); //小休...
これがなければカクカクした動作となり、ちょっとずつしか動...
の名残。今はif文の中の動作でwaitが使われているので必要が...
msg=0; //メッ...
} //while閉
} //task ...
**MASTER [#ib2e4e7e]
***defineとサブルーチン [#he52402a]
説明の前段階として定義とサブルーチンを紹介しておく~
-defineの紹介~
#define KOSATEN 37 //色覚センサー黒...
#define completed 15 //slaveから送られ...
#define turn_left OnRev(OUT_A,70);OnFwd(OUT_B,70); //...
#define go_left OnRev(OUT_A,85);Off(OUT_B); //...
#define go_straight OnRev(OUT_AB,70); //...
#define go_right OnRev(OUT_B,85);Off(OUT_A); //...
#define turn_right OnRev(OUT_B,100);OnFwd(OUT_A,100) //...
#define short_break Off(OUT_AB);Wait(1000); //...
#define brake Off(OUT_AB) //...
define_その他説明~
--何故逆回転の右回転がパワー100なのかは今考えると不明。(...
--それぞれの動作のパワーの大きさは、内側に行く動きの大き...
--break(小休憩)とbrake(ブレーキ)は綴りが似ているが意味は...
-subの説明~
sub follow_line() //...
{
while((SENSOR_1>KOSATEN)||(SENSOR_2>KOSATEN)){
int d=SENSOR_1-SENSOR_2;
if (d<-6){
turn_right;
}else if (d<-3){
go_right;
}else if (d<=3){
go_straight;
}else if (d<=6){
go_left;
}else {
turn_left;
}
}
PlaySound(SOUND_CLICK);
brake;Wait(200);
}
sub follow_line2(int followtime) //タイマーを使...
{
long t0=CurrentTick();
while(CurrentTick()-t0<followtime){
int d=SENSOR_1-SENSOR_2;
if (d<-6){
turn_right;
}else if (d<-3){
go_right;
}else if (d<=3){
go_straight;
}else if (d<=6){
go_left;
}else {
turn_left;
}
}
PlaySound(SOUND_CLICK);
brake;Wait(200);
}
sub chokusinL() //直進左
{
go_left;Wait(500); //Waitは調整
}
sub chokusinR() //直進右
{
go_right;Wait(500); //同上
}
sub sasetsu() //左折
{
turn_left;Wait(500); //左回転と左前方直...
go_left;Wait(500); //同上
}
sub usetsu(int migi) //右折(行程に含ま...
{
turn_right;Wait(500); //右回転と右前方直...
go_right;Wait(migi); //同上
}
sub turn_behind() //振り向く
{
turn_left;Wait(1000); //右の色覚センサー...
ースをストップさせる)
while(SENSOR_1>KOSATEN){ //右の色覚センサー...
turn_left; //左に回転しろ
}
Off(OUT_BC); //ブレーキの役割
}
sub backleft() //後退し右を向く
{
OnFwd(OUT_A,100);Off(OUT_B);Wait(1500);//(時間調整のた...
turn_right;Wait(600);
Off(OUT_AB);
}
sub backright() //後退し左を向く
{
OnFwd(OUT_B,100);Off(OUT_A);Wait(1400);//同上
turn_left;Wait(500);
Off(OUT_AB);
}
sub ball_catch() //玉を掴む(slaveの...
{
int msg;
SendRemoteNumber(1,MAILBOX1,12);
while(msg==completed){
ReceiveRemoteNumber(MAILBOX1,true,msg);
}
}
sub ball_release() //玉を放す(slaveの...
{
int msg;
SendRemoteNumber(1,MAILBOX1,11);
while(msg==completed){
ReceiveRemoteNumber(MAILBOX1,true,msg);
}
}
sub arm_up() //アームを上げる(sl...
{
int msg;
SendRemoteNumber(1,MAILBOX1,13);
while(msg==completed){
ReceiveRemoteNumber(MAILBOX1,true,msg);
}
}
sub arm_down() //アームを下げる(sl...
{
int msg;
SendRemoteNumber(1,MAILBOX1,14);
while(msg==completed){
ReceiveRemoteNumber(MAILBOX1,true,msg);
}
}
sub up_catch() //アームを上げなが...
{
int msg;
SendRemoteNumber(1,MAILBOX1,16);
while(msg==completed){
ReceiveRemoteNumber(MAILBOX1,true,msg);
}
}
sub down_release() //アームを下げなが...
{
int msg;
SendRemoteNumber(1,MAILBOX1,17);
while(msg==completed){
ReceiveRemoteNumber(MAILBOX1,true,msg);
}
}
sub_その他の説明
-masterが行う右折・左折・直進右・直進左・直進などは交差点...
***新ライントレース (左右2つのカラーセンサーを用いて)[#ae...
色覚センサーが二つになったので、正確に、ラインの端ではな...
しきい値を使った方法もあり得るのだが、研究した結果、シン...
左右を比べて、値が小さい方に動けば、黒色を辿ることができ...
例)左の方が右より小さければ左前方へ進む~
具体的には以下のような形…~
int d=SENSOR_1-SENSOR_2;//differenceの頭文字をとって
dでSENSOR_1(右)とSENSOR_2(左)の差を定義
if (d<-6){ //(小さい順から考えていく)右より...
turn_right; //右に(左右逆での)回転
}else if (d<-3){ //右より左の値がわずかに大きいな...
go_right; //右前へ進む
}else if (d<=3){ //左右の値がほぼ同じならば
go_straight; //直進
}else if (d<=6){ //左より右の値がわずかに大きいな...
go_left; //左前へ進む
}else { //左より右の値が極端に大きいならば
turn_left; //左に(左右逆での)回転
}
-距離の測り方 ~
サブルーチンの紹介で明らかになっているが、もう一度示して...
sub follow_line2(int followtime) //followtimeの関...
汎用性が高い。
{
long t0=CurrentTick(); //この時点での時...
while(CurrentTick()-t0<followtime){ //関数followtime...
小さいときのみ繰り返す。
int d=SENSOR_1-SENSOR_2; //以下上述の新ラ...
if (d<-6){
turn_right;
}else if (d<-3){
go_right;
}else if (d<=3){
go_straight;
}else if (d<=6){
go_left;
}else {
turn_left;
}
} //while閉
PlaySound(SOUND_CLICK); //whileが終わり...
brake;Wait(200); //小休憩
}
-交差点の識別 ~
こちらもサブルーチンは上で紹介したが、もう一度示す。
sub follow_line() //...
{
while((SENSOR_1>KOSATEN)||(SENSOR_2>KOSATEN)){ //...
満たしている間繰り返す。
int d=SENSOR_1-SENSOR_2; //...
if (d<-6){
turn_right;
}else if (d<-3){
go_right;
}else if (d<=3){
go_straight;
}else if (d<=6){
go_left;
}else {
turn_left;
}
} //while閉
PlaySound(SOUND_CLICK); //whileが終わり...
brake;Wait(200); //小休憩
}
ある条件について~
意味的には、左右両方黒とならない。ことなのだが、~
論理積でなく論理和を用いた。高校数学?で習うことだが、~
ド・モルガンの定理:「”条件A”または”条件B”の否定」は「”条...
という定理があった。~
ここではSENSOR_1もSENSOR_2も”黒でない”という否定の条件の...
***task main(全体の行程の説明) [#i1552100]
下準備は整ったので、予定したコースに従っていく。(参照のア...
予定のルート~
&ref(ルート.jpeg);
task main()
{
SetSensorLight(S1); //右カラーセンサー
SetSensorLight(S2); //左カラーセンサー
arm_up(); //クレーン上昇(以下同コ...
short_break; //※1
ball_release(); //ボールをリリース(アー...
go_straight;Wait(2000); //Mまで直進
follow_line(); //交差点判別付きライント...
chokusinR(); //K
follow_line2(1500); //KL間を時間を測りながら...
short_break; //L
arm_down(); //クレーン降下(以下同コ...
short_break; //※1
ここより1球目
ball_catch(); //ボールキャッチ(アーム...
short_break; //※1
arm_up();
short_break; //※1
turn_behind(); //振り返って方向転換(以...
follow_line();
chokusinL(); //K
follow_line();
usetsu(500); //M
follow_line();
sasetsu();
follow_line();
chokusinL(); //B
follow_line();
usetsu(500); //X
follow_line();
sasetsu(); //X'
follow_line();
chokusinR(); //B'
follow_line();
sasetsu(); //M'
follow_line();
sasetsu(); //K'
follow_line2(1000);
short_break; //J'
ball_release(); //リリース
1球目終了、2球目(L')まで移動
short_break;
backleft(); //K'
follow_line2(3700);
short_break; //L'
arm_down();
short_break; //※1
ここより2球目
ball_catch(); //ボールキャッチ
short_break; //※1
arm_up();
short_break; //※1
turn_behind();
OnFwd(OUT_AB,30);Wait(100);
follow_line();
usetsu(500); //K'
follow_line2(500);
short_break; //J'
ball_release(); //リリース
2球目終了。3・4球目(I)まで移動
short_break; //※1
backright();
follow_line();
chokusinL();
follow_line();
usetsu(500); //M'
follow_line();
chokusinL(); //B'
follow_line();
usetsu(500); //X'
follow_line();
sasetsu(); //X
follow_line();
sasetsu(); //B
follow_line();
usetsu(400); //C
follow_line2(1650);
short_break; //I
ここより3・4球目
arm_down();
short_break; //※1
ball_catch(); //ボールキャッチ
short_break; //※1
up_catch();
short_break; //※1
backleft(); //C
follow_line();
usetsu(500); //B
follow_line();
usetsu(500); //X
follow_line();
sasetsu(); //X'
follow_line();
sasetsu(); //B'
follow_line();
usetsu(700);
follow_line2(900);
short_break; //J'
down_release(); //リリース
short_break; //※1
arm_up();
short_break; //※1
backright(); //K'
}
※1 slaveが動作する間、masterが動かないようにする
*感想 [#r59f5759]
急ピッチで仕上げたので2台での連携でもっと発展的なことがで...
チームメイト3人の協力で、特に私以外の2人の力が大きくて、...
皆さんの協力だけでなく、説明のなかにも、『課題1』、『課...
達成感がものすごくて、充実した前期を過ごすことができたと...
ページ名: