[[2015a/MemberOnly]] 今回のロボティクス入門の課題はライントレースです。具体的に説明すると作ったマシーンで道中にある玉を拾い、ゴールのかごに玉をシュートするというものです。 &ref(2015a/Member/ko-rusuro-/Mission2/コース2.png,50%); 今回は地点Cから十字路をまっすぐ進み、道中で玉を拾いながらその先の丁字路を右に曲がり地点Aにボールを運び入れるルートを選び課題に取り組みました。 ※最新のレポートは"結果2"以降です。時間の無い方は"結果2"からご覧ください。 #Contents *結果 [#zf4df7b5] **ロボットの画像 [#mbc0bafa] &ref(2015a/Member/ko-rusuro-/Mission2/WIN_20150717_053511.JPG,35%); &ref(2015a/Member/ko-rusuro-/Mission2/WIN_20150717_053528.JPG,35%); モーターCでアームを動かし、モーターA,Bで左タイヤ、右タイヤを動かします。また光センサーはS3に装着しました。右の写真を見てもらうと分かっていただけると思いますが、二つの白に近い灰色の長い棒がアームの役割を担っています。これを開閉することによりボールを保持します。 **所要時間 [#s3e62b9f] ロボット組立:三時間 プログラミング:八時間 レポート:二時間 **目標達成度 [#xbe7e64a] &ref(2015a/Member/ko-rusuro-/Mission2/WIN_20150717_053629.JPG,40%); タイヤのある位置まで制御することが出来ました。 その過程を説明すると次のようになります。「交差点で一時停止→ボール回収→丁字路で一時停止→方向転換」 ***この状態で課題を出した理由 [#p20d2857] +プログラムの直すべき点が何度見返しても見つからない +朝を迎えたから *プログラム [#rc828eef] **定義 [#raa67db7] #define Threshold 55 //閾値 今回は定義をあまり必要としなかったので閾値のみ定義することとなりました。 **サブルーチン [#oa0be254] ***交差点の対処 [#rbba37e3] sub aida(){ //交差点と丁字路の間を制御する ResetTachoCount(OUT_AB); RotateMotor(OUT_AB,30,240); Off(OUT_AB); Wait(2000); ResetTachoCount(OUT_B); RotateMotor(OUT_B,30,190); } これは交差点と丁字路の間を機械の判断に任せるには大変高度な技術が必要になるだろうと判断し、時間制御によりコントロールしました。また、角度で設定することにより電池の残量に依らず一定の距離進むことを可能にしました。 ***ボールの回収 [#d61a2b4c] sub tsukamu(){ //ボールを掴む ResetTachoCount(OUT_C); RotateMotor(OUT_C,20,100); } これも角度を指定することにより安定して同じ距離動かすことを可能にしました。 ***ボールのシュート [#s9048b81] sub shot(){ //ボールを相手のゴールにシュウウウン! ResetTachoCount(OUT_C); RotateMotor(OUT_C,40,-100); OnFwdSync(OUT_AB,40,0); Wait(200); Off(OUT_ABC); } 一瞬だけ動かしてボールを前に押し出しました。 **メインプログラム [#wd3f5e3d] ここからはコメント文を用いて説明させていただきます。 task main(){ SetSensorLight(S3);//光センサーの使用 int kousatenn=0;//交差点を判断するための値 int last=0;//二回目の交差点に行くための値 int syuuryou=0;//終わるための値 while(kousatenn < 400 && syuuryou == 0){ //交差点カウンターが貯まるまで道に沿って動く OnFwdSync(OUT_AB,30,(SENSOR_3-Threshold)*23/10);//ラインに沿って動くように調整したもの if(40>SENSOR_3){ //交差点カウンターを貯める kousatenn++; }else { kousatenn = 0; } Wait(1);//検知の間隔 } while(kousatenn >= 400 && last == 0){ //交差点カウンターが溜まった一回目の動き Off(OUT_ABC); Wait(2000); tsukamu(); aida(); last = 1; //2つの交差点終了 kousatenn = 0;//交差点カウンターのリセット } while(kousatenn >= 400 && last == 1){ //交差点カウンターが溜まった二回目の動き Off(OUT_ABC); Wait(2000); shot(); kousatenn = 0;//交差点カウンターのリセット syuuryou = 1;//終了の合図 } } *反省 [#uc2100dd] 今回は悩むことが少なかった。その代わりにとても越えられない壁があった。 **初め [#g00b19ce] ロボット作りでは光センサーの位置を決めるのに時間がかかった。プログラム作成中も手直しするほど気を遣う、繊細なものでした。 **中盤 [#t255bb7a] ロボティクス入門のホームページにある「サーボ・モータの機能をもっと使おう」という項目を発見し、プログラムの幅が広がった。他のページも見返すことで「&&」や「||」など色々な演算子を覚えたり、思い出したりした。 **終盤 [#r58dbad8] 所々プログラムにミスが見つかるようになったが直すことが出来るものが大半になって来た。一回目の交差点を通るためのプログラムが渡った後にもう一度来るようになった。グループのメンバーに聞くが解決することがなく、色々と変えてはみたがループすることは変わらず朝を迎えた。 *感想 [#t7374085] 一度詰まってしまうと新しい解決策を見つけるには大変な労力が必要であると分かった。また、解決策が分かったら&size(25){''もう一度チャレンジしてみたい''};と思いました。 #br *結果2 [#aa1a6d97] CENTER:&size(25){もう一度チャレンジしてみました}; ルートはそのままに、マシン、プログラム、情熱、その他もろもろをさらに良いものへと変更してきました。 説明を始める前に前回の反省点を考えていきたいと思います。 *前回の反省点とその解説 [#x1121e3b] -プログラムがループしないこと 前回、"while"で囲まれた三つのプログラムが二つ目の"while"の動作を終えた後動かなくなってしまった。原因は単純に三つの"while"で囲まれたプログラムを一つの大きな"while"で囲んでいなかったというものでした。 -後輪の挙動が不安定であること 説明書に書かれていた方法で作られた360度どの方向にも回る便利なタイヤですが、左右に揺れやすいこのロボットとは相性が悪く、マシン全体の動きが悪くなっていました。 -タイヤの動きがなめらかにならなかったこと これはライントレース中のプログラムが原因だと考えられます。次のプログラムを見てください。 OnFwdSync(OUT_AB,30,(SENSOR_3-Threshold)*23/10);//ラインに沿って動くように調整したもの この三つめの値を複雑に書いてしまったため分かりにくいプログラムになってしまいましたが、三つめの面倒な計算式は「タイヤの同期率」を表すものだということは分かっていただけていると思います。"SENSOR_3"は光センサーの値、"Threshold"はライン左側の境界線上の値です。三つめの値が大体+30を上回ると右のタイヤが逆の方向に回り始め、−30を下回ると左のタイヤが逆の方向に回り始めるという性質を利用したプログラムですが、"SENSOR_3"の値が"Threshold"から大きくずれると急な旋回を始めてしまいます。それによりマシンが左右に大きく揺られ滑らかに走ることが出来ないという問題がありました。 -不要なプログラムが多々あったこと 全くスマートじゃないと思います。 ** [#oc052243]