[[2009a]] *目次 [#f4e29bb1] #contents **課題・ロボコン [#lc482827] 紙パックを収集して色ごとに所定の場所に運ぶ。 途中に超えなければいけない壁があり、またラインの判定、色の識別、障害物の認識など今までに学んだことを応用する必要がある。 **メンバー [#qca2151a] おくりびと制作委員会~ ・スガ~ ・はやぶさ~ プロジェクト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 GO_SIGN 22 たすくめいん until (Message() == GO_SIGN); OnFwd(OUT_A+OUT_C); Wait(100); チェック #define THRESHOLD 50 #define GO_SIGN 22 task main() { SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_LIGHT); SetPower(OUT_B,7); ClearMessage(); until (Message() == GO_SIGN); OnFwd(OUT_A+OUT_C); Wait(100); Off(OUT_A+OUT_C); Wait(100); OnRev(OUT_A); 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); 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); 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); OnFwd(OUT_C); Wait(60); Off(OUT_A+OUT_C); Wait(100); OnRev(OUT_A+OUT_C); Wait(150); }} } } task main() { OnFwd(OUT_A+OUT_C); Wait(400); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C); ラインを両方とらえたとき・・ until ((SENSOR_1 < 45) && (SENSOR_3 < 45)); Off(OUT_A+OUT_C); OnFwd(OUT_A); 旋回します。 OnRev(OUT_C); Wait(50); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C); パックまで接近 Wait(150); Off(OUT_A+OUT_C); OnFwd(OUT_B); アームを作動させます。 OnRev(OUT_A+OUT_C); 少し下がる。旋回のためのスペースを得るためです。 Wait(10); Off(OUT_A+OUT_C); OnFwd(OUT_A); 180度旋回。 OnRev(OUT_C); Wait(100); Off(OUT_A+OUT_C); OnFwd(OUT_A+OUT_C);ゴールまでは変数を調整します。 Wait(550); Off(OUT_A+OUT_C); OnRev(OUT_B); アームを解除します。 } void cross_right(int t) { OnFwd(OUT_A+OUT_C); until ((SENSOR_1 < 45) && (SENSOR_3 < 45)); Off(OUT_A+OUT_C); OnFwd(OUT_A); OnRev(OUT_C); Wait(t); Off(OUT_A+OUT_C); } void cross_left(int t) { OnFwd(OUT_A+OUT_C); until ((SENSOR_1 < 45) && (SENSOR_3 < 45)); Off(OUT_A+OUT_C); OnFwd(OUT_C); OnRev(OUT_A); Wait(t); Off(OUT_A+OUT_C); } **感想 [#nd2b43c3] **コメント欄 [#r45d621d] コメントお願いします。 #comment