[[2006a/C2/練習page]] [[ロボティクス入門ゼミ]] #contents *『水』を書くロボット [#t8b8939d] **製作概要[#t5cc8db8] -まず、ロボットの構造をメンバー二人で一緒に考えました。話し合った結果、ロボットがペンを持ちながら動くものではなく、ロボットは動かないで、ペンを上下左右に動かすロボットを作ることに決まりました。しかしモーター3個でペンの上げ下げと上下左右に動かすロボの構造を考えると、横移動が難しくなったので横移動は車輪でロボごと動かすことにしました。その結果なんとか水を書くロボが完成することができました。 -ロボの名前は、&size(25){ジェット・田中!!};です。&br; &ref(2006a/C2/課題1左/proGRA/shuji_03.jpg,75%,ジェット田中!!(写真でないなぁ…)); -ジェット・田中の利点は、小さい字を書けることと、早く書けることです。逆に弱点は、大きい字を書けないことと、耐性がないことです。 **ロボットの構造 [#z9098021] -まず、このジェット・田中は製作概要にもある通り前後左右の動きで文字を書くタイプのロボットです。他のチームはほとんど走行マシンにペンを取り付けて走りながら文字を書いているので、ロボット自体の構造ではかなり特徴的だと思っています。 -動力部分の構造について、まず前後の動きはラックギアを用いることで前後行動を実現しました。(写真で示せないのが惜しいです…)また、左右の動きは何度も考えてみましたが、最終的にはタイヤを回して移動しました。つまり、左右の動きでは普通に走っているわけです。本当は前後左右の動きはXY座標で動かしたいと思っていたのですが、どうしても左右の動きを上手い構造を考えて実現できなかったのが残念です。 -ペンの上げ下げについては、普通にギアとプーリーを回してプーリーの先にゴムで止めたペンを上げ下げしました。ペンの機構自体は一番最初に思いついたため、考えが固定されていたかもしれません。 **マシンの弱点 [#h5f2ac92] -今回のマシンは先に述べたように小さい文字しか書けない、耐性がない、という問題があります。&br; まず、小さい文字しか書けない理由は、一番はラックギアの存在です。今回ラックギアは入っていた四枚全てのラックギアを使いましたが、ギア自体の長さが短く途中できれてしまうため、どうしても短い距離で止めなければなりませんでした。そのため、どうしても文字が小さくしか書けなかった、というわけです。&br; また、耐性がない理由は、前後の機構を実現するためにつくられた長いアームとCPU本体をおくことを考慮せずにつくった本体にあります。アーム自体は頑丈だったのですが、前後移動をする際にアームが独立していないとどうしてもスライドできませんでした。そのために独立させていたのですが、アームの重心が前に固まっていたせいか、アームを前に出すと、本体が傾いたりアームがてこようになって本体を破戒したりということがありました。&br; それにCPUを搭載するところを全く考えてなかったせいで、CPUが上にいきグラグラと揺れたり、落ちたりしました。その時に一緒に本体も破損するということも起こりました。この二つの点を改善できたらよかったかもしれません。 **水プログラム概要 [#gdc276ad] task main() { while(1){ pen_down(); wt(); Retreat(); wt(); hane(); wt(); pen_up(); wt(); move_left(); wt(); pen_down(); wt(); left(); wt(); diagonal_left(); wt(); pen_up(); wt(); move_light(); wtl(); pen_down(); wt(); light(); wt(); diagonal_light(); wt(); pen_up(); wt(); neta(); } } void wt(void){ //20msの待ち時間 Wait(20); } void wtl(void){ //50msの待ち時間 Wait(50); } void pen_up(void){ //ペンを持ち上げる(紙から離す) OnRev(OUT_C); Wait(50); Off(OUT_C); } void pen_down(void){ //ペンを下げる(紙につける) OnFwd(OUT_C); Wait(50); Off(OUT_C); } void Retreat(void){ //アームを引く OnFwd(OUT_B); Wait(70); Off(OUT_B); } void hane(void){ //刎ねる OnFwd(OUT_A); OnRev(OUT_B); Wait(10); Off(OUT_A+OUT_B); } void move_left(void){ //二画目の開始点へ移動 OnFwd(OUT_A); OnRev(OUT_B); Wait(13); Off(OUT_A); Wait(20); Off(OUT_B); } void left(void){ //二画目をかく OnRev(OUT_A); Wait(20); Off(OUT_A); } void diagonal_left(void){ //二画目の斜め OnFwd(OUT_A+OUT_B); Wait(30); Off(OUT_A+OUT_B); } void move_light(void){ //三画目の開始点へ移動 OnRev(OUT_A+OUT_B); Wait(30); Off(OUT_B); Wait(23); Off(OUT_A); } void light(void){ //三画目を書く OnFwd(OUT_A); Wait(20); Off(OUT_A); } void diagonal_light(void){ //三画目の斜め OnRev(OUT_A); OnFwd(OUT_B); Wait(30); Off(OUT_A+OUT_B); } void neta(void){ //次の開始点へ(オマケ) OnRev(OUT_A+OUT_B); Wait(60); Off(OUT_A+OUT_B); } ***プログラムの説明 [#x74bf5b5] -プログラムの簡単な解説は、水を書くのに必要な数値をそれぞれのサブルーチン(void)から呼び出し、それをwhileでくりかえしています。 -wt()というサブルーチンがあるのは、このマシン自体が脆い構造をしていて、連続で動くと自壊してしまう恐れがあるため、待ち時間をもうけて連続で動かない用にしてみました。 -また、wtl()というのが一カ所だけ使われていますが、それはバグ修正時のなごりです。 -このプログラムのおかげでジェット・田中が"水"を書くことができるようになりました。めでたし、めでたし。 -余談ではありますが、今回のプログラムはもっと効率よくコンパクトに書き直せるはずなのではないか、と未だに考えています。個人的には、今回のプログラムはあまりにぐだぐだと長すぎているので、改善の余地は必ずあると思いますし、何より私自身(加筆・訂正者)がとても気にくわないのです(あまりに個人的な感情ではあるとは思いますが)。 *反省及び感想等 [#s5401ee6] -今回のロボットは、他のチームとは全く異なったタイプのロボットを造ろう、というところからスタートしました。実際、発表時にうちのロボットとタイプが似ているロボットは他に一台しか存在せず、コンセプトに対するロボットとしてはよかったと思います。しかし、構造的に脆くなってしまった点・文字が小さくしか書けない点は悪かったと感じます。ロボットを製作するにあたって、お互いに時間が合わずなかなか製作出来なかったことがロボットの弱点を改善せず中途半端に終わらせてしまった原因だと思われます。&br; また、このホームページを更新する頻度がとても少なかったのが悪かったのか、後から訂正・改善をしようとしてもデータが少なくなかなか出来ませんでした。おかげでとても内容の薄いレポートになってしまっています。&br; この二つの点を踏まえて、次の課題からは今回の失敗をしないようにしていきたいです。&br; &br; **コメントお願いします [#a5586628] 何かアドバイスなどがあれば書き込んでください #comment &br; 編集:ITO&br; 加筆・訂正:SATO