[[2016a/Member]] *目次 [#i0d6b39b] #contents *はじめに [#xf9492f0] 今回の課題はかなり試行錯誤したため使わなくなった機体システム、プログラムが多く存在する&br; それらも紹介しなければ、せっかく作ったのにかわいそうなので別ページにてそれらを紹介する。&br; またわかりやすいように、機体の改良の歴史も少し書いてある。&br; &size(30){[[過去の産物:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2Frin331%2FMission3%2Fold_idea]]}; *課題と自分チームの考え [#ae5afe92] 今回の課題3は模擬的なロボコンということで2つのマイコンを用いての課題だったが、 自分たちのチームは &color(red){1つのロボットのみ}; でほぼ全体の処理を行う。&br; %%のこりの1つは音楽でも流せればよかったなぁ。%% 今回このような形になった理由には2つ理由が存在する。&br; 1つ目 センサーが1つに集結させることができ、より正確な動作ができる&br; 2つ目 3つのモータで処理全体がカバーできた&br; これらの理由から一体型でなくても処理できると判断したため、重さを考慮して1台のみで行うこととした。 *機体の説明 [#b380836f] 説明が細分化するため分けて記述する。 **全体像 [#t48321e5] 全体像としてこんな感じになっている。 先ほど書いたがマイコンは1つだ。&br; &ref(./機体01.jpg,45%,機体画像 全体); **パーツ [#kff1a7ff] パーツとしては&br; ・車体&br; ・紙コップ処理部分&br; ・マイコン &br; &ref(./機体02.jpg,45%,機体画像 パーツ);&br; の3つとなる。 **タイヤ [#y3831b02] タイヤの幅はライントレースをするため、できる限り狭くなっている。&br; また、前回先生にアドバイスをもらった通りタイヤは薄いものを使用した。&br; &ref(./機体03.jpg,45%,機体画像 タイヤ); **センサ [#rbf386e7] センサに関しては&br; 1.光センサ (ラントレース)&br; 2.光センサ (紙コップがあるのかの判定)&br; 3.タッチセンサ (上下にどこまで上がっているのかの判別)&br; の3つを使用していた。&br; 画像はよいモノがなかったのでなし。 &color(red){しかしこのうち2は本番では目標が一個だったためしようしていない。&br;そして3に関しては途中で使用理由が消えてしまった。([[過去の産物:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2Frin331%2FMission3%2Fold_idea]]で説明)}; ちなみに最終的には使わなかった2だが、&br; 書いてある通り紙コップが手前にあるかを判定しているが最初に自分の考えで紙コップを黒くして&br; 判別しようとした。だが実際はなにもない空間だと黒に近い値になり白で判別したほうがよかったためこれはミスといえる。&br; %%コップは買いなおした。(140円)%% **上下の動作と掴む動作を1つのモータで行うシステム [#b7a97bc6] 今回の機体の一番大変だった部分である。&br; なお正直自分のみで説明が十分できる自信がないと思うので制作者のURLを載せておく。&br; 製作者:「[[RaikouRK:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2FRaikouRK%2FMission3]]」 *プログラムの仕組みについて [#c50d9608] 今回のプログラムは過去最大のためもちろん分けて話す。&br; また今回はプログラムをパーツ化し、分担し作ろうということでメンバーで分担して作った。&br; そのためそのプログラムはだれが作ったのかも記述する。 **レース用プログラム [#md0edf53] 製作者:「[[RaikouRK:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2FRaikouRK%2FMission3]]」 彼には悪いが省略 読みたきゃ過去の自分のを見てほしい。 ** 上下に動かすプログラム[#wfd9c2e8] 製作者:「自分」 sub up() //上に上げる動作 { while(SENSOR_2==0) OnFwd(OUT_B); Off(OUT_B); } sub down() //下に下げる動作 { while(SENSOR_2==0) OnRev(OUT_B); Off(OUT_B); } センサー2にはタッチセンサが入っている。&br; down()にFwdが書いてあって動かなかったときは申し訳なかった。&br; **180度回転するプログラム [#x12ea7d4] 製作者:「[[Yamada:http://yakushi.shinshu-u.ac.jp/robotics/?2016a%2FMember%2FYamada%2FMission3]]」 sub TURN_180() //180ど回転 { OnFwd(OUT_AC); Wait(70); Off(OUT_AC); OnRev(OUT_A); Wait(125); while(SENSOR_1>40) { OnFwd(OUT_C); OnRev(OUT_A); } Off(OUT_AC); } 説明として180度回転と書いているが実際にしていることは少し違う。&br; まず3行で後ろに後退する。&br; その後Aのモータのみ一定時間動かし回転し、その後センサが一定になるまでもう一度回転を行う。&br; 一見して簡単なプログラムだがこのプログラムの凝っている点は&br; 一回目と二回目で回転の半径が違うという点だ!&br; これによって大きな回転でだいたいの位置を決め、&br; 小さな回転で正確な位置を決めるということを可能にしている。 *プログラムの全体 [#wf4f2eaf] 前日まで機体の改良をしたため、最終目標は1個だけになってしまった。&br; (しかもそれすらできなかった。) #define Middle 45 //ライントレース用 (中央値) task main() { setting();//初期設定(センサ、モータ) //////////////////////////////////////Cへ移動 STARTING_OPERATION();//四角い枠から脱出 repeat(2) { TRACE(); zensin(); } //交差点からCへ向かう TRACE(); OnRev(OUT_C); Wait(25); TRACE(); //誤差修正 OnRev(OUT_A); Wait(95); Off(OUT_AC); ////////////////////////////////////////Cに到着 OnFwd(OUT_B);//コップつかむ Wait(250);//上に上げる start keep;//紙コップの保持 TURN_180();//反転 OnFwd(OUT_A);//Qの方向を向く OnRev(OUT_C); Wait(200); Off(OUT_AC); OnRev(OUT_AC);//進む Wait(100); Off(OUT_AC); //センサー使って進む while(SENSOR_1 > Middle-4) OnRev(OUT_AC); stop keep; //放す Off(OUT_AC); down(); } sub setting() { //初期設定(パワー、センサー) SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_TOUCH);//モータB止める用 SetSensor(SENSOR_3,SENSOR_LIGHT); SetPower(OUT_AC,4);//タイヤ SetPower(OUT_B,7);//上下、開き } sub zensin() //プログラム名は前進だがライントレース終了後右にずれるためAのみ稼働 { OnRev(OUT_A); Wait(106); Off(OUT_A); } sub copjugde()*使ってない //コップが前にくるまで前進(過去の遺産で説明) { while(SENSOR_3 < 46) OnRev(OUT_AC); Off(OUT_AC); Wait(100); } task keep() //上でキープしておくただし、ラインとレースと並列動作させるためtaskで定義 { while(1) { OnRev(OUT_B); Wait(1); OnFwd(OUT_B); Wait(1); } } sub TRACE() //トレース用メソッド { ClearTimer(0); while(FastTimer(0)<=42){ if(SENSOR_1>Middle+4)//白 左旋回 { OnFwd(OUT_C); OnRev(OUT_A); ClearTimer(0); } else if(SENSOR_1>Middle+2)//やや白 左折 { Off(OUT_C); OnRev(OUT_A); ClearTimer(0); } else if(SENSOR_1>Middle)//直進 { OnRev(OUT_AC); ClearTimer(0); } else if(SENSOR_1>Middle-2)//やや黒 右折 { Off(OUT_A); OnRev(OUT_C); } else //黒 右旋回 { OnFwd(OUT_A); OnRev(OUT_C); } } Off(OUT_AC); PlaySound(SOUND_FAST_UP);//トレース終了、交差点認識 } sub down() //下に下げる動作 { OnRev(OUT_B); Wait(200); } sub STARTING_OPERATION() //スタート地点の四角から脱出する { while(SENSOR_1<Middle) { OnRev(OUT_AC); } while(SENSOR_1>Middle) { OnRev(OUT_AC); } OnRev(OUT_AC); Wait(50); Off(OUT_C); OnRev(OUT_A); Wait(40); while(SENSOR_1<Middle) { OnRev(OUT_AC); } Off(OUT_AC); } sub TURN_180() { OnFwd(OUT_AC); Wait(80); Off(OUT_AC); OnRev(OUT_A); Wait(130); while(SENSOR_1>40) { OnFwd(OUT_C); OnRev(OUT_A); } Off(OUT_AC); }