[[2019a/Member]] 目次 #contents *課題2 [#tc14e1ff] A地点を出発し、次のいずれかの経路を黒い線にそって動くロボットを作成する。 ・A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(右折) → J(一時停止の後、左折) → I(直進) → H(直進) → G(左折) → F → E → D(一時停止の後、直進) → C(直進) → B(一時停止) → シュート→ A地点に入る(ゴール) 交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止すること。 #ref(rout.png) *ロボットの説明 [#s3fa59df] 機体はマニュアルどおりのものを使用した。マニュアルにあるロボットはシンプルで安定性が高いため今回の課題に適していると思ったので使用した。 機体はマニュアルどおりのものを使用した。マニュアルにあるロボットはシンプルで安定性が高いため今回の課題に適していると思ったので使用した。ライントレースのための光センサーは前輪より前に取り付けた。 #ref(kitai.jpeg) ボールを掴む動作は、四角形のアームで囲うことによって行うことにした。モーター1つでアームを下げてボールを掴む(囲う)。そして、そのままボールを引きずって移動させるようにした。 ボールを掴む動作は、四角形のアームで囲うことによって行うことにした。モーター1つでアームを下げてボールを掴む(囲う)。そして、そのままボールを引きずって移動させるようにした。アームの輪っかの部分が大きめなので少しずれても意外と入る。シュートするための機構は作らず、体当たりをしてシュートをすることにした。 #ref(arm.jpeg) *プログラム [#ff7bcb4f] **マクロ [#d70149be] #define THRESHOLD 50 #define THRESHOLD 50//この値にプラスしたりマイナスしたりしてラインのあるなしを判別する #define left1 OnFwd(OUT_B,20);OnFwd(OUT_C,5);//左回り #define left2 OnFwd(OUT_B,20);OnFwd(OUT_C,-15);//左旋回 #define left2 OnFwd(OUT_B,20);OnFwd(OUT_C,-15);//左旋回、その場で止まっての旋回ではなく少しだけ進みながら回る #define right1 OnFwd(OUT_B,-20);OnFwd(OUT_C,-5);//右回り #define right2 OnFwd(OUT_B,-15);OnFwd(OUT_C,20);//右旋回 #define front OnFwd(OUT_BC,20);//前進 **サブルーチン [#r2bdadbf] sub followlineleft()//左の境目でライントレースと交差点でストップ { SetSensorLight(S2); long t0; t0=CurrentTick(); while(CurrentTick()-t0<300){ while(CurrentTick()-t0<300){//連続して黒の部分のときタイマーをリセットせず、タイマーが0.3秒になると止まる if(SENSOR_2>THRESHOLD+10){//白い部分のとき right2;t0=CurrentTick(); right2;t0=CurrentTick();//タイマーリセット }else if(SENSOR_2>THRESHOLD+5){//黒よりの白のとき right1;t0=CurrentTick(); right1;t0=CurrentTick();//タイマーリセット }else if(SENSOR_2>THRESHOLD-5){//白よりの黒のとき front;t0=CurrentTick(); front;t0=CurrentTick();//タイマーリセット }else if(SENSOR_2>THRESHOLD-10){//黒の部分のとき left1;t0=CurrentTick(); left1;t0=CurrentTick();//タイマーリセット }else{ left2; left2;//リセットしない } } Off(OUT_BC); Wait(1000); } sub followlineright()//右の境目でライントレースと交差点でストップ { SetSensorLight(S2); long t0; t0=CurrentTick(); while(CurrentTick()-t0<300){ while(CurrentTick()-t0<300){//上のプログラムの左右逆バージョン if(SENSOR_2>THRESHOLD+15){ left2;t0=CurrentTick(); }else if(SENSOR_2>THRESHOLD+5){ left1;t0=CurrentTick(); }else if(SENSOR_2>THRESHOLD-5){ front;t0=CurrentTick(); }else if(SENSOR_2>THRESHOLD-15){ right1;t0=CurrentTick(); }else{ right2; } } Off(OUT_BC); Wait(1000); } sub crosslineleft()//左の境目基準で交差点横断 { SetSensorLight(S2); long t0; t0=CurrentTick(); while(SENSOR_2<THRESHOLD+10){ while(SENSOR_2<THRESHOLD+10){//白になるまで前進 front; } Off(OUT_BC); while(SENSOR_2>THRESHOLD-15){ while(SENSOR_2>THRESHOLD-15){黒になるまで右回り right1; } Off(OUT_BC); } **メインプログラム [#j5be30a0] (このプログラムは途中で止まってしまい、最後まで実行できていない) task main () { SetSensorLight(S2); long t0; t0=CurrentTick(); followlineleft();//MからK crosslineleft();//Kの交差点を渡る followlineleft();//KからL Wait(500); catchball();//ボールを掴む left2;//方向変換 Wait(200); while(SENSOR_2>THRESHOLD-10){ while(SENSOR_2>THRESHOLD-10){//黒の部分になるまで左旋回 left2; } Off(OUT_BC); followlineright();//LからK while(SENSOR_2<THRESHOLD-10){ while(SENSOR_2<THRESHOLD-10){黒の部分まで直進 front; } followlineleft();//KからJ left1; Wait(500); int n=0;//JからI、IからH while(n<3){ while(n<3){//2回交差点を渡らせる followlineleft(); crosslineleft(); n++; } followlineleft();//HからG left2; Wait(300); int m=0;//GからF、FからE while(m<3){ while(m<3){//交差点ではなく直角の曲がり角なので上と差別化 followlineleft(); left2; Wait(500); m++; } int l=0;//EからD,DからC while(l<3){ while(l<3){//交差点を渡る followlineleft(); crosslineleft(); l++; } followlineleft();//CからB right2; Wait(2000); releaseball();//ボールを放す OnFwd(OUT_BC,70);//ボールにぶつかる OnFwd(OUT_BC,70);//ボールにぶつかってシュート Wait(500); } *考察 [#wddfbcda] ライントレースと交差点停止は動作したが交差点で停止したまま動かなくなってしまった。交差点を渡れるときもあったが成功したとは言えない。原因として、プログラミングの方法がそもそも良くないか、電池の消耗でタイヤにうまく出力されていなかったかが考えられる。 その他に安定してボールに車体をぶつけてシュートすることができなかったことが反省点としてあげられる。