[[2014a/Member]] 目次 #contents * 課題の説明 [#mffb653f] 詳しい説明は[[2014a/Mission1]]を参照 私はスタート→ゴールの順路をたどった。 * メンバー [#j0ee8e63] mame dai * ロボット本体 [#g0b2bc6e] シンプルに作りあげたので容易に取り外し&取り付けが可能。 http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=__%282%29.JPG&refer=2014a%2FMember%2Fmame%2FMission1 ** ライトセンサー [#jf97ef47] 車体の軸に近づけるように地面に垂直にライトが当たるように工夫した。 http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=__%285%29.JPG&refer=2014a%2FMember%2Fmame%2FMission1 http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=__%283%29.JPG&refer=2014a%2FMember%2Fmame%2FMission1 ** アーム [#qa948bf2] クレーン車のようにすくい上げる。 http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=%A5%DA%A5%A4%A5%F3%A5%C8%A3%B1.jpg&refer=2014a%2FMember%2Fmame%2FMission1 青く囲んだのがアームです。 http://yakushi.shinshu-u.ac.jp/robotics/?plugin=attach&pcmd=open&file=image%281%29.jpeg&refer=2014a%2FMember%2Fmame%2FMission1 ↑つかんだ直後の状態 シュートをする場合はアームを強めに逆回転させてそのままボールを打ちます。 * プログラム [#w9871f04] ** プログラムの概要 [#v140454d] 定義 #define THRESHOLD 39//しきい値 #define SPEED_H 43//最も早い速度 #define SPEED_L 30//最も遅い速度 #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_H, 0); //左に曲がる #define turn_right0 OnRL(0, SPEED_H); //右に曲がる #define turn_right1 OnRL(-SPEED_L,SPEED_L); //右に旋回 #define STEP 1 //白と黒の境界をセンサが読む時間(1/1000秒) #define nMAX 300 //通常のカーブとして許容できる繰り返しの最大値 #define short_break Off(OUT_BC); Wait(1000); //小休止 #define CROSS_TIME 100 //交差点通過にかかる時間 #define cross_line OnRL(SPEED_L,SPEED_L);Wait(CROSS_TIME);short_break; //交差点を渡る #define Catch Off(OUT_BC); OnFwd(OUT_A,40);Wait(500);Off(OUT_A) //アームを前に回し、ボールを取る #define Shot Off(OUT_BC);OnRev(OUT_A,70);Wait(500);Off(OUT_A) //アームを後ろに回し、ボールを打つ プログラム task main() { SetSensorLight(S1); //光センサーをセット SetSensorLowspeed(S4); //超音波センサーをセット int nOnline=0; //黒い線になった回数 long t0 = CurrentTick(); //時間を計算する。 OnFwd(OUT_BC,40); Wait(500);//白い枠から出るために少し進む while (CurrentTick() <= 29000) { //動き始めてから29秒以内の時の場合 while (nOnline < nMAX) { //黒の認識が最大値より小さい場合 if(CurrentTick()- t0 == 8000){Catch} //動き始めてから8秒の時にボールをつかむ if(CurrentTick()- t0 == 29000){Shot} //動き始めてから29秒の時にボールを打つ if (SENSOR_1 < THRESHOLD -14) { //黒の場合 turn_left1; //左に旋回 } else { if (SENSOR_1 < THRESHOLD-8) { //やや黒の場合 turn_left0; //左に曲がる } else if (SENSOR_1 < THRESHOLD-3) { //やや白の場合 go_forward; //直進 } else if (SENSOR_1 < THRESHOLD +8) { //白の場合 turn_right0; //右に曲がる } else { turn_right1; //右に旋回 } nOnline=0; //カウントをリセットする } Wait(STEP); //(1/1000秒待機) } short_break; //小休止 turn_right1; Wait(nMAX*STEP); //進行方向修正 cross_line; //交差点を渡る nOnline=0; //カウントをリセットする } } * 一連の動作 [#rb37cd95] 黒い線に乗る→ 線の右側トレース→ 動き始めてから8秒経ったところでボールをつかむ→ 動き始めてから29秒経ったところでボールをシュート * 反省と感想 [#a4021e1b] プログラミングは初めてだったので難しかった。しきい値が安定しにくかった。成功率がとても低い。 車体の前半分が重すぎてバランスがとれないこともあった。場所や条件により交差点を認知しない場合がある。赤外線センサーを用いたが、車体が長すぎてセンサーとボールが反応しない。時間を計るのではなく交差点の数を数え、その数に応じてボールをつかむなどのプログラムを作れば成功率を上げられたと思う。 授業外においてとても時間がかかってしまったので細かい作業も効率よく行えると良かったと思う。 電池の残量によって結果が変わってしまうこともあった。 ** 良い点 [#l6b3d7cb] ライトセンサーを車体の軸に近づけるように工夫することでプログラム通りにライントレースをすることができた。 機体自体の取り付け&取り外しが容易なのですぐに作業に入ることができました。 しきい値を細かく調整することでスムーズにライントレースをすることができた。 アームを回転させてキャッチ&シュートをする案は確実性が増し、非常に良かったと思う。