[[2019a/Member]] 目次 #contents *課題について [#n09c5be2] 次のようなコースを作ります。 そして、4つのボールを空の弁当箱に集めます。 詳しくは[[2019a/Mission3]]を参照してください。 *基本的な作戦 [#jf8b7958] 1つのつかむ機構では、床のボールと弁当箱に入っているボールの両方を回収することはできない。 もともとは、1つのアームに2のつかむ機構を搭載し、ボールを4つ回収できるようなロボットを作成した。 しかし、アームが重すぎて上がらなくなってしまったことで、アームを作り直す必要が出てきてしまい、プログラムにかけられる時間が少なくなってきてしまったことから、床に置いてあるボールを諦め、点数の高い弁当箱に入っている2つのボールを確実に回収できるようなロボットを目指した。 *ロボットの本体の説明 [#y99352ff] #ref(IMG_4909.jpg) カップをしっかりとつかむことができるアームです。 #ref(IMG_5014.jpg) 二輪駆動で移動します。 タイヤの少し前にラインセンサが付いており、モーターが回り、ロボットが移動したときに、適度にラインセンサが動き、地面の状況を調べることができます。 #ref(IMG_4997.jpg) 弁当箱を持ち上げ、中に入っているボールをレールを伝わせて、ボール収納スペースに入れます。 #ref(IMG_5015.jpg) ボール収納スペースに入っているところ。 #ref(./IMG_5016.jpg) ストッパーでボールが出てくるのを止めています。 #ref(IMG_4927.jpg) 坂になっているので、ストッパーをあげると、自動的にボールが出てきます。 #ref(IMG_5017.jpg) モーターに高いギヤ比をかけることで、大きなパワーを出すことができ、重いアームを持ち上げることができるようになりました。 #ref(IMG_4952.jpg) アームを開閉させるためのモーターをギヤによってアームの先まで力を伝導させています。 #ref(IMG_4948.jpg) ボールをつかむためのアーム フェースギアを用い、モーターの回転軸を90度回転させることで、ボールをつかむためのアームを製作しました。 *プログラムの説明 [#l0b5f21e] マスター側 #define CONN 1 #define on1 1 #define on2 2 #define on3 3 #define zenshin OnFwd(OUT_BC,60); //前進 #define koushin OnFwd(OUT_BC,-60); //後進 #define migikaiten OnFwd(OUT_B,-70);OnFwd(OUT_C,40); //右回転 #define hidarikaiten OnFwd(OUT_B,40);OnFwd(OUT_C,-70); //左回転 #define migi OnFwd(OUT_C,40);Off(OUT_B);//右に進む #define hidari OnFwd(OUT_B,40);Off(OUT_C); //左に進む #define tomaru Off(OUT_BC); //ストップ long A=0;//コーナーで止まる時間を計測する変数 long B=0;//ライントレースしている時間を計測する変数 void re_stop_corner(){ SetSensorLight(S1); while(A<400){ if(SENSOR_1>40){ hidari; A=0; B=B+1; }else{ migi; A=A+1; B=B+1; } } tomaru; Wait(1000); B=0; }//交差点で止まるライントレース(ラインの右側を進む) void re_cross_line(){ SetSensorLight(S1); if(SENSOR_1>40){ hidari; B=B+1; }else{ migi; B=B+1; } }//交差点を直進するライントレース(ラインの右側を進む) task main() { SetSensorLight(S1); while(B<8000){ re_cross_line();//逆側のライントレース } while(B>=8000){ re_stop_corner(); }//逆側のライントレース tomaru; Wait(500); koushin; Wait(1600); migi; Wait(300); zenshin; Wait(1300); migikaiten; Wait(1300); tomaru; Wait(100); koushin; Wait(300); tomaru; Wait(100); zenshin; Wait(300); tomaru; Wait(100); SendRemoteNumber(CONN,MAILBOX1,on2); Wait(18000); zenshin; Wait(300); tomaru; Wait(100); SendRemoteNumber(CONN,MAILBOX1,on1); //tukamu Wait(30000); OnFwd(OUT_B,50);OnFwd(OUT_C,-80); Wait(400); tomaru; Wait(100); koushin; Wait(1500); tomaru; Wait(100); SendRemoteNumber(CONN,MAILBOX1,on3); Wait(1000); tomaru; Wait(100); } スレーブ側 #define on1 1 #define on2 2 #define on3 3 #define tomaru Off(OUT_AB);Wait(100);//ストップ task main() { int msg1; int msg2; while(1){ ReceiveRemoteNumber(MAILBOX1,true,msg1); if(msg1==on1){ OnFwd(OUT_B,50); Wait(1500); tomaru; OnFwd(OUT_A,-100); Wait(20000); OnFwd(OUT_A,100); Wait(20000); tomaru; OnFwd(OUT_B,-50); Wait(1500); tomaru; msg1=100; } if(msg1==on3){ OnFwd(OUT_C,-30); Wait(200); msg1=100; } if(msg1==on2){ OnFwd(OUT_A,100); Wait(20000); msg1=1; } } } *難しかったところ [#q17bbad3]