[[2015a/Member]] *目次 [#n1e276e4] #contents *課題 [#d72ac0bf] 今回の課題は図のC地点からA地点までの経路を黒線に沿って動くロボットを作成することです。 そして途中においたボールを目的地まで運んでゴールに入れます。 私は図の位置にボールを置きました。 &ref(./1436512614602.jpg,60%); *ロボット本体 [#u904dac9] &ref(./1436512653984.jpg,100%); &ref(./1436512644974.jpg,100%); こちらが今回の課題で用いたロボットです。 本体部分はサンプルを参考にして大きくは形を変えませんでした。 アームを本体上部前方に設置するにあたって、前すぎると前のめりになってバランスが悪くなり、 後ろすぎるとボタンが隠れてしまい起動することもままならないので、微調整が必要でした。 また本体上部と本体下部をしっかりとつなげるために、4つの長い棒パーツで固定しました。 そして光センサーはタイヤの間に地面すれすれに設置しました。 このロボットは一見複雑な構造に思えますが、個々のパーツは独立して取り外すことが出来、 接続部分の構造は簡単なので、解体して片付けやすく、そして組立やすいロボットです。 **アーム [#ydf7a7b8] &ref(./1436512665516.jpg,100%); &ref(./1436861196570.jpg,100%); &ref(./1436861188081.jpg,100%); 今回のロボット製作において一番力を入れて取り組んだのがアーム製作です。 私はボールをつかみ持ち上げて運ぼうとしたのですが、ギアが足りなかったので ボールを囲み転がしてゴールまで運ぶことにしました。 ロボット下部に付けた「クワガタ」状のアームでボールを左右に逃さず、 ロボット上部に付けた「ショベル」状のアームを途中で下すことで完璧に囲みます。 ショベルの部分は重くて勝手に降りてきてしまうので、 アームの間に黒く長い棒をブレーキ代わりに付けました。 ショベルの幅とクワガタの幅は都合のよいように作ったので、ボールがすり抜ける隙間はありません。 *プログラミングについて [#d8ef53cc] **定義の説明 [#j405f11b] #define THRESHOLD 39 #define SPEED_H 30 #define SPEED_L 20 #define downtime 15000 #define down OnFwd(OUT_A,50);Wait(500);Off(OUT_A);Wait(300); //アームを下ろす #define up OnRev(OUT_A,60);Wait(500);Off(OUT_A);Wait(300); //アームを上げる #define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL); #define go_forward OnRL(SPEED_H, SPEED_H); #define turn_left1 OnRL(SPEED_L, -SPEED_L); //左旋回 #define turn_left0 OnRL(SPEED_L, 0); //左折 #define turn_right0 OnRL(0, SPEED_L); //右折 #define turn_right1 OnRL(-SPEED_L, SPEED_L); //右旋回 #define STEP 1 #define nMAX 300 #define short_break Off(OUT_BC); Wait(1000); #define CROSS_TIME 200 #define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break; //交差点を渡る #define goal OnRev(OUT_BC,50);Wait(500);Off(OUT_BC);Wait(500); up;OnFwd(OUT_BC,100);Wait(300);Off(OUT_BC); //ゴールに向かってシュートする しきい値は途中で電池を交換したところ、正常に動かなくなったので改めて測り直しました。 またスタートしてから15秒後にアームが降りはじめてボールを捕捉します。 この秒数は目安であり15秒前後ならしばらくの間はクワガタ内にボールがあるので、 多少の誤差は問題になりません。 ロボットの速度は遅く設定しました。なぜなら速くすると動作が大降りになりラインから外れやすくなってしまうからです。 ゴールは勢いをつけるために一度後ろに下がってから、アームを上げシュートします。 **プログラムの説明 [#h56df72c] task main() { SetSensorLight(S3); int nOnline=0; // 続けて黒になった回数 (カウンタ) long t0 = CurrentTick(); int g=0; while(CurrentTick()-t0<10000000.0){ while (nOnline < nMAX) { if(CurrentTick()-t0==downtime){ down; }if (SENSOR_3 < THRESHOLD-8){ turn_right1; nOnline++; // カウンタを増やす g=0; }else if (SENSOR_3 >= THRESHOLD+5){ turn_left1; g++; nOnline=0; if(g==nMAX){ nOnline=nMAX;} }else{ if (SENSOR_3 < THRESHOLD-5){ turn_right0;} else if (SENSOR_3 < THRESHOLD+5){ go_forward;} else if (SENSOR_3 < THRESHOLD+8){ turn_left0;} nOnline=0; // カウンタをリセット g=0;} Wait(STEP); }if(g<nMAX){ short_break; // 小休憩 turn_left1; Wait(nMAX*STEP); // 進行方向修正 cross_line; // 交差点を渡る nOnline=0; //カウンタをリセット }else if(g==nMAX){ short_break; turn_right1; Wait(nMAX*STEP); goal; t0-=10000000;}}} こちらが今回の課題で動かしたプログラムです。 光センサーが黒を連続で確認したら、交差点突破プログラムが作動します。 逆にゴール付近で光センサーが白を連続で確認したらボールをシュートして行動を終了します。 私はC地点からロボットを出発させるにあたってラインの左側をトレースさせると、 下図の強調した場所においてロボットが別のラインと誤認してしまう恐れがあったのでラインの右側をトレースさせました。 &ref(./origin.jpg,100%); 実際に動いている写真が下のものになります。 &ref(./1436862829737.jpg,100%); *反省点とまとめ [#u6b76ac8] アーム部分を凝りすぎて大量の部品を使った結果、アームが重くかつパーツがなくなってしまったので、 ある程度設計の予想図をたててから組み立て始めた方がよかったと思いました。 そうすれば無駄なパーツを使うことなくもっと洗練されたロボットが出来上がったでしょう。 個人的にはアームで「つかむ」動きをさせたかったので、ロボット設計をさらに追及していきたいです。