[[2009a]] *目次 [#f4e29bb1] #contents **課題・ロボコン [#lc482827] 紙パックを収集して色ごとに所定の場所に運ぶ。 途中に超えなければいけない壁があり、またラインの判定、色の識別、障害物の認識など今までに学んだことを応用する必要がある。 **メンバー [#qca2151a] 今回は、ロボットを2機作りそれぞれで違う働きをするものだったので2チームに分けて作業をしました。 おくりびと制作委員会~ ・スガ~ ・はやぶさ~ プロジェクトI~ ・かおりん~ ・ハる~ ・松~ special thanks~ ・ぴーちゃん **ロボットの特徴、工夫 [#u3e83e8a] 課題の特性上2つのロボットで役割を分担するのが最良と考えたので以下の2機を制作しました。~ まず中央の壁の向こう側までもう1機のロボットを運ぶ役割をする「おくりびと」byハる。~ 次に壁の向こうで紙パックを所定の位置まで運ぶ「愛ちゃん」byハる。 ***おくりびと [#ca1c8503] ・愛ちゃんを壁の向こう側まで送りとどけるため、壁の前まで運び、足場を作って壁を越えさせます。 ・ロボットを上に載せるので必然的に大きくなってしました。そのため、曲がるときに周りに引っかかってしまいうまく曲がれませんでした。 ・上のロボットを支えないといけないので強度を強くし、なるべく高さを低くしました。 ・車体を低くしたところ、本体を入れるスペースがなくなったので、足場とのバランスを取るのも兼ねて後ろに取り付けました。 ・はじめ前後輪をつなげて四輪駆動で馬力を出そうと思ったが、タイヤとホイールが空回りしてしまったりしてうまくいかなかった。 三輪にしても曲がる時にバランスを崩し、前輪が変な方向を向き安定しなかった。 前輪はモーターとはつながずに、横にすべりやすいものにしたところうまくいきました。その際、スピードが出過ぎだったのでギアの組み合わせで遅くしました。 ・移動中に勝手に足場がおりてしまうことがあったので、ストッパーを付けてモーターで外せるようにした。 ***愛ちゃん [#df22dd37] 作業の途中で、致命的な不具合を発見しましたので、ここにアップしておきます。 1.四輪駆動の取扱説明書のロボットが動かない 二輪駆動にし、前輪を一輪にすることで対処しました。 原因は、モータの出力が不足している、重量過多であるなど、さまざまな原因が考えられましたが、結局、前段階の課題では正しく動作していた、取扱説明書の正規のデザインのロボットであることから、部品などの摩耗が原因だと思われます。 2.スロットCの回線が断線している これは、端子を拭き取ることで対処しようと試みましたが、復旧できませんでした。 原因は、ワセリンを使用していないことであると推測されます。 **各プログラム [#e3e3741b] ***おくりびと [#ra79abe2] スタート地点から黒線で曲がる位置を判断し、方向転換して壁の真ん中まで進みます。 //定数・マクロ群 #define L_B 40 //白と黒の境界線の値(line_boder) #define T_T 105 //90°回転の所要時間(turn_time) #define GO_SIGN 22 //愛ちゃん起動の暗号(go_sign) #define ALL_OFF Off(OUT_A+OUT_B+OUT_C);Wait(100); //全停止(all_stop) #define T_L OnFwd(OUT_A);OnRev(OUT_C); //左回転(turn_left) #define G_F OnRev(OUT_A+OUT_C); //前進(go_front) //メインプログラム task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); //光センサーをセット SetPower(OUT_A+OUT_B+OUT_C,7); //全力全開 Wait(200); //スタート後の余裕 G_F //前進 until ( SENSOR_1 < L_B ); //1本目のラインを横切る Wait(50); //1本目のラインをパス until ( SENSOR_1 < L_B ); //2本目のラインを横切る Wait(80); //十分に通り過ぎる ALL_OFF //呼吸を整える T_L //左回転 Wait(T_T); //90° ALL_OFF //全停止 G_F //前進 until ( SENSOR_1 < L_B ); 3本目のラインを横切る Wait(30); //少し通り過ぎる ALL_OFF //全停止 T_L //左回転 Wait(T_T); //90° ALL_OFF //全停止 G_F //前進 until ( SENSOR_1 < L_B ); //中央右ラインを横切る Wait(100); //中央へ ALL_OFF //全停止 OnFwd(OUT_C);OnRev(OUT_A); //右回転 Wait(T_T); //90° ALL_OFF //全停止 G_F //前進 Wait(30); //壁に密着 ALL_OFF //全停止 Wait(100); //余裕 OnFwd(OUT_B); //足場のストッパーをはずす Wait(50); //足場展開 Off(OUT_B); //停止 Wait(50); //余裕 SendMessage(GO_SIGN); //暗号送信(愛ちゃん発進) PlaySound(SOUND_CLICK); //確認音 Wait(150); //愛ちゃんが下りるまで待機 OnFwd(OUT_A+OUT_C); //後退 Wait(200); //後退完了 ALL_OFF //終了 } ***愛ちゃん [#k78cf1c6] #define THRESHOLD 50 #define GO_SIGN 22 通信機能を定義する task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); 光センサーは左右に設置 SetSensor(SENSOR_3,SENSOR_LIGHT); SetPower(OUT_B,7); 牛乳パックを落とさないように出力を7に ClearMessage(); 通信機能を使う until (Message() == GO_SIGN); 通信されるまでおくりびとの上で待機 OnFwd(OUT_A+OUT_C); 通信されたら直進してはしごを渡る Wait(150); Off(OUT_A+OUT_C); 降りたら一度停止 Wait(100); OnRev(OUT_A); 90度旋回する OnFwd(OUT_C); Wait(60); Off(OUT_A+OUT_C); Wait(100); OnFwd(OUT_A+OUT_C); 直進する while(true) { if(SENSOR_1<THRESHOLD) { 左の光センサーが黒線上で if(SENSOR_3<THRESHOLD) { 右の光センサーも黒線上の時 OnFwd(OUT_A+OUT_C); 光センサーが前に付いていて、回転軸が前ぎみになっているので、少し前進する Wait(40); Off(OUT_A+OUT_C); Wait(100); OnRev(OUT_A); 90度回転し、牛乳パックの正面に立つ OnFwd(OUT_C); Wait(55); Off(OUT_A+OUT_C); Wait(200); OnFwd(OUT_A+OUT_C); 前進して牛乳パックに近づく Wait(60); Off(OUT_A+OUT_C); Wait(100); OnFwd(OUT_B); アームを使って牛乳パックをはさむ Wait(80); OnRev(OUT_A+OUT_C); そのままか移転すると前輪が壁に当たるので、少し下がる Wait(65); Off(OUT_A+OUT_C); Wait(100); OnFwd(OUT_A); 180度回転する OnRev(OUT_C); Wait(130); OnFwd(OUT_A+OUT_C); 指定の場所に運ぶため前進する Wait(150); OnRev(OUT_B); 牛乳パックを放す OnRev(OUT_A+OUT_C); そのままの向きで下がる Wait(110); Off(OUT_A+OUT_C); Wait(70); OnRev(OUT_A); 90度回転する OnFwd(OUT_C); Wait(60); Off(OUT_A+OUT_C); Wait(100); OnRev(OUT_A+OUT_C); 後ろに下がり、また左右の光センサーが同時に黒線上になったら、先ほどと同じような動きをして、もう一つの牛乳パックを運ぶ Wait(150); } } } } **感想 [#nd2b43c3] 難しかったです。 壁を越えるプログラムがうまくいかなかったです。真ん中の低いところを狙わないで行けばよかったと思いました。 ロボットのプログラムを考え、思い通りに動かすのは大変でした。最後になっていい感じにできたので、成功させたかったです。 **コメント欄 [#r45d621d] コメントお願いします。 #comment