[[2014a/Member]] *メンバー紹介 [#c4873052] sudo 須藤 海志(自分) kiyo 清原 雅司 sakar 金子 まさし totakeke 大森 武人 *課題説明 [#q361ca3e] コース上に6個の紙コップが置かれてる。そのうち3個をもう片方の3個に重ねる。紙コップには番号が降ってあり同じ番号のコップに重ねなくてはならない。 参照 [[2014a/Mission2]] *ロボット説明 [#q9d0fbaf] **ドライブベース [#hf146656] &ref(2014a/Member/sudo/Mission2/pic7.jpeg,タイヤ); &ref(2014a/Member/sudo/Mission2/pic4.jpeg,タイヤ2); (写真の向きはご了承ください) 小回りをきかせるために、動力となるタイヤ2つと後ろの補助輪1つからなる三輪車にしました。スリムな車体にするために横のタイヤは1番薄いものを使用しています。モーターの回転を直接、歯車でタイヤの回転につなげています。 これにより本体は非常に軽くなりアームやセンサーを付けてもしっかりと走ります。コップを運ぶのには大掛かりなアタッチメントが必要になると考えられたので軽量化できるところはできるだけ軽量化しました。 &ref(2014a/Member/sudo/Mission2/pic14.jpeg,25%,タイヤ3); 上記の写真のように前にセンサーを付けるためのブロックのスペースは必要です。 **アーム部分 [#d6cadae3] &ref(2014a/Member/sudo/Mission2/pic5.jpeg,アーム); &ref(2014a/Member/sudo/Mission2/pic10.jpeg,アーム2); &ref(2014a/Member/sudo/Mission2/pic13.jpeg,アーム3); アームは当初、開閉でモーターを1つと上下で1つ使いエレベーター方式にするつもりでしたが、安定性が無かったため授業中に先生が紹介したモーター1つで開閉と上下ができるものを採用しました。 紙コップを持ち上げた時に上で動いてしまうと被せるときに合わせるのが困難になります。そこでコップと摩擦を作るためのタイヤを2つ上と下に付けました。紙コップの上下での半径の違いを考慮してタイヤの大きさを変えています。あとは高さの調整でぴったりの幅になるようにしています。 &ref(2014a/Member/sudo/Mission2/pic16.jpeg,25%,アーム4); &ref(2014a/Member/sudo/Mission2/pic17.jpeg,25%,アーム5); &ref(2014a/Member/sudo/Mission2/pic8.jpeg,アーム6); アームを上げた時にモーターが邪魔になって上がり切らなかったので歯車でのばしモーターを後ろに置きました。しかし、逆にアームが上がり過ぎると重力によって、降ろす動作をする時に上でアームが開いてしまいます。 なので、左の写真中央やの黒いブロックと左の写真左側に見える黒い棒が当たってちょうどいいところで止まるように調整しました。 開閉と上下をモーター1つでやるので初めは力が弱くて上まで上がりませんでした。そこで、動力についた大きな歯車を次の小さな歯車につなげるのでなく、動力を小さな歯車にしてそれを大きな歯車につなげることで上がるようになりました。 **センサーと触覚 [#n2ece125] &ref(2014a/Member/sudo/Mission2/pic18.jpeg,25%,センサー); &ref(2014a/Member/sudo/Mission2/pic3.jpeg,センサー2); センサーはドライブベースの前面にライン感知用の光センサー2を付けその先にさらにコップ識別用の光センサー3を付けました。光センサー2の下にタッチセンサーが付いています。 当初は紙コップをタッチセンサーで判断させようと思いましたが紙コップが軽すぎて反応しないため断念しました。しかし、タッチセンサーには黒い棒が通せてその棒が触覚に必要だったため残っています。 &ref(2014a/Member/sudo/Mission2/pic15.jpeg,25%,センサー3); 触覚は黒い棒の両端に黄色の曲げられる筒を取り付けてあります。黄色の筒を滑らかに外側に曲げて紙コップをアームが降りてくる位置に導きます。黒い棒の長さによって触覚の幅が変わります。 ちょうど紙コップの直径と同じぐらいのものがあったのでそれにしました。これが無いと紙コップを正確に被せることは無理だと思います。 黄色の棒は外側に曲げるのと同時に少し下に曲げるのがコツです。そうしないとアーム開閉のときに当たってしまいます。 **全体 [#d2a99c1b] &ref(2014a/Member/sudo/Mission2/pic1.jpeg,全体); &ref(2014a/Member/sudo/Mission2/pic2.jpeg,全体); &ref(2014a/Member/sudo/Mission2/pic9.jpeg,全体); 通信がうまくいかなかった為今回RCXを1台しか使えませんでした。RCXの上にアームのモーターを乗せています。A,Cがタイヤのモーター、Bがアームのモーターです。アームの下、本体の前にセンサー2つと触覚が付いています。2がライン感知用の光センサー2、3がコップ識別用の光センサーです。 コンパクトを目指してつくりました。おかげでコップの隙間を抜けるのは楽です。 羽は飾りです。 *プログラム [#p19cc171] ライントレースはせずにラインを目印に使っています。基本的にコップを取りに行くためのターンは時間で行いそこから直進します。触覚のおかげで多少の左右のずれば問題ありません。ただアームを降ろすタイミングは時間では誤差が出てしまいます。そこで、紙コップが必ずラインの上にあることを利用してセンサーが黒い線を感知したらアームを降ろすようになっています。 紙コップは白、鉛筆で塗った灰色、マジックで塗った黒の3つです。ロボットは、スタート地点にまっすぐ置きます。 固定してあるコップの位置と色は 灰色・・・1 白・・・2 黒・・・3 全くの未完成プログラムです。スタートしAのコップを取りに行き、判別して置きに行き、Cのコップを取るまでです。 流れとしては Aのコップを取る→識別して置きに行く(3パターン)→Cのコップを取りに行く &ref(2014a/Member/sudo/Mission2/pic20.png,図); &ref(2014a/Member/sudo/Mission2/pic20.png,50%,図); **定義 [#x0c7df1a] #define black 40 //ラインだと判断する最低値 #define siro1 46 //コップを白だと判断する最低値 #define kuro3 40 //コップを黒だと判断する最高値 #define right OnFwd(OUT_A);OnRev(OUT_C); //右ターン #define left OnFwd(OUT_C);OnRev(OUT_A); //左ターン #define go OnFwd(OUT_AC); //前進 #define back OnRev(OUT_AC); //後退 #define Stop Off(OUT_AC); //停止 #define get OnFwd(OUT_B); //アームを降ろして掴み上げる #define put OnRev(OUT_B);Wait(31);Off(OUT_B); //アームを降ろし離して上げる **Aのコップを取る動作の直前まで [#rfb70cec] task main() { SetSensor(SENSOR_2, SENSOR_LIGHT); //ライン感知用の光センサー2 go; //スタートの枠の中からラインを感知するまで前進 until (SENSOR_2 < black); right; //感知したら90度右ターン Wait(74); go; //Aのコップの正面に行くまで前進 Wait(212); left; //コップAの方へ左ターン Wait(31); go; //コップAの下のラインを感知するまで前進 until (SENSOR_2 < black); Stop; //一時停止 Wait(20); SetSensor(SENSOR_3, SENSOR_LIGHT); //コップ識別用の光センサー3 この時点でAのコップの前にいます。 ここからはコップをの色によって3パターンに場合分けします **(1-1)Aでコップが白だった場合の2に置きに行くまで [#oa31765f] if (SENSOR_3 >= siro1){ //定義siroの値以上で白と判断 ClearSensor(SENSOR_3); //光センサー3は切っておく get; //掴む動作 Wait(50); //この時間が短いとアームが途中で落ちてしまい、長いとコップが落ちてしまう back; //2の位置に直前で入れるように後退 Wait(330); left; //2の方向へ左ターン Wait(27); go; //ラインを感知するまで前進 until (SENSOR_2 < black); Stop; back; //近すぎて被せることができないのである程度距離をとる Wait(40); Stop; //一時停止 Wait(20); put; //置く動作 back; //下がって(1-2)へ Wait(50); Stop; この時点で2のコップの前にいます **(1-2)2の位置からCのコップを取るまで [#g62d7a3f] back; // コップに当たらず旋回できる位置まで後退 Wait(50); right; //コップCの方向まで右ターン Wait(34); go; //コップCの下のラインの前にもラインがあるので Wait(500); そのうち最後のラインを越えるまで前進 until (SENSOR_2 < black); //そこからさらにコップCの下のラインを感知するまで前進 Stop; //一時停止 Wait(20); SetSensor(SENSOR_3, SENSOR_LIGHT); //コップ識別光センサー3 get; //掴む動作 Off(OUT_B); } //終了 この時点で位置Cにいます。 残念ながら流れではここまでです。 後は残りの2パターンです。 **(2-1)Aで灰色だった場合の1に置きに行くまで [#z1f340a8] else if (SENSOR_3 <= siro1 && SENSOR_3 >= kuro3){ //定義siro以下で定義kuro以上のとき灰色だと判断 ClearSensor(SENSOR_3); //光センサー3を切る get; //取る動作 go; //ターンしやすい位置へ前進 Wait(110); left; //1の方向へ左ターン Wait(98); go; //コップ1の下のラインの手前のラインを越えるまで前進 Wait(500); until (SENSOR_2 < black); //そこからさらにコップ1の下のラインを感知するまで前進 Stop; back; //止まってある程度の距離をとる Wait(40); Stop; //一時停止 Wait(20); put; //置く動作 back; Wait(50); Stop; //(2-2)へ この時点では1の位置にいます。 **(2-2)1の位置からCのコップを取りに行くまで [#mc1a7d90] ロボットは外側を向いています back; //右の用紙の一番左のラインまで後退 Wait(200); until (SENSOR_2 < black); right; //それから右ターンで位置Cの方向を向く Wait(145); (ここは前進が長くなるため2つに分けて正確性を上げた) go; //コップcの下のラインの直前のラインを越えるまで前進 Wait(200); until (SENSOR_2 < black); //そこからさらにコップCの下のラインを感知するまで前進 Stop; //(2-3)へ この時点では位置Cの前にいます。 **(2-3)Cで黒だった場合の3に置きに行くまで [#mb176b0b] この場合だけは置きに行くまでプログラムしてあります。 if (SENSOR_3 <= kuro3){ //定義kuroの値以下で黒だと判断 ClearSensor(SENSOR_3); //センサー3を切る get; //取る動作 back; //ターンできる位置まで後退 Wait(200); left; //3の方向を向く Wait(130); go; //コップ3の下のラインの手前のラ インを越えるまで前進 Wait(250); go; //そこからさらにコップ3の下のラインを感知するまで前進 until (SENSOR_2 < black); back; //距離をとる Wait(45); Stop; //一時停止 Wait(20); put; //置く動作 back; //下がって終了 Wait(50); Stop; } } **(3-1)Aで黒だった場合の3に置きに行くまで [#u8b6e8a5] else if (SENSOR_3 <= kuro3){ //定義kuro以下で黒と判断 ClearSensor(SENSOR_3); //光センサー3を切る get; //取る動作 left; //3の方向を向く Wait(66); go; //コップ3の下のラインの直前のラインを越えるまで前進 Wait(350); go; //コップ3の下のラインを感知するまで前進 until (SENSOR_2 < black); //コップ3の下のラインを感知するまで前進 back; //距離をとる Wait(45); Stop; //一時停止 Wait(20); put; //置く動作 back; //下がって(3-2)へ Wait(50); Stop; **(3-2)3の位置からCのコップを取りに行くまで [#w88600f4] back; //ターンできる位置まで後退 Wait(50); right; //Cの方向を向く Wait(116); go; //コップCの下のラインの直前のラインを越えるまで前進 Wait(100); until (SENSOR_2 < black); //コップCの下のラインを感知するんで前進 Stop; get; //取る動作 Off(OUT_B); //終了 } } **付け足し [#h9155f42] ・光センサー2の前に光センサー3があるためラインを感知する前に、センサーの先端がコップを押してくれるおかげで触覚を使って掴みやすい位置に誘導できます。 ・光センサー3はコップ識別のタイミングだけつける方が正確性が上がります。 ・コップの下以外にコップまでの直線上にラインがある場合はそのうちの最後のラインを越えるまでは、“時間で前進”してそこから“ラインを感知するまで前進”に切り替えます。この場合の“時間で前進”は、ラインとコップの間の空白のどこかまでで良いのでずれが起きても空白の真ん中あたりに時間を合わせておけば問題ありません。 *コメント [#w0fdf654] ・すべてifを使って場合分けだけで作ったのですが、もう少し上手くできたら良かったです。 ・時間が足りず完成させられなかったのが後悔です。 ・電池の消耗とともに少しずつ動きが変わるので大変でした。