[[2007b/A5/りんた]]

目次
#contents
*課題 1:文字書きロボットの製作[#y45b8ba3]
『本』『板』『林』の文字を書く
**メンバー紹介 [#re3f23dd]
~一平くん…プログラム担当
~だいすけ…ロボット製作担当
~りんた…HP製作担当
*ロボット紹介[#i9ae234b]
~我々の製作したロボットはタイヤでの移動を前後のみにし、アームを二段階に動く構造にした(写真は下に掲載)
~そして『本』と『板』『林』を書かせた
**他のロボットとの違い [#gd828ea8]
~本体がモータが一つだけで動くように構造を工夫(過程1参照)
~アームを2段階の動き(上下左右)できるような構造にした(筆の運び方参照)
~筆ペンを用いることによりロボット特有の角ばった線をなくすことができた。
**筆の運び方 [#f886c517]

~&ref(2007b/A5/課題1右/あーむ.jpg);
~写真1:この写真でわかるようにギアの噛み合わせにより、アームを左右に移動させる。

さらにギアを組み合わせることにより左右の移動スピードを本体の前後の移動に合わせた。

むかって左側の離れたギアはモーターとは独立しておりアームを上から押える役割がある。
~&ref(2007b/A5/課題1右/上下.jpg);
~写真2:このアームで筆の上げ下げをする。ここでは単純な回転運動を上下運動に変える構造を用いた。

さらに写真からもわかるように大きめなギアを二つもちいた。これは上げ下げのスピードを調整するだけでなく、

筆ペンの重さに耐えらるようにするためである。

当初ここの部分はギアではなく青いゴムと円盤を用いてベルトコンベア状にしていたがペンの重さが予想以上にあり、負荷がかかり過ぎて空回りしてしまった。そこでしっかり噛み合うギアのにしたのである。
**アームを2段階構造にするメリット [#abe25031]
~本体自体は前後に進むだけなので、曲線を書くとき角度の計算をせずにアームの動く時間だけで良いので、プログラムを大幅に変えることなく、いろんな文字に挑戦することができる。さらに他の方向転換を必要とするロボットと違い細かい動きが可能となり小さいもじを奇麗に書くことができる。

そして文字を書き順通り書くうえで無駄が少なくスムーズに書くことができる。これは人の文字の書き方に近いためである。
**デメリット [#o6ca2fd0]

~なめらかな曲線を書くの難しく直線のみになってしまう。さらに一つの文字の中で斜めの線の角度を変えることができない
~左右に動く範囲が限られてるので、二つのモーターを移動に用いるタイプのロボットより文字が小さくなる
~また特殊な形をしているためバランスが悪くなりロボットが安定しな、壊れやすいなどの問題がある
**直進するロボット [#k25683c4]
~&ref(2007b/A5/課題1右/直進.jpg);
~上の写真のようにロボは前後に直進する.なぜこのような仕組みにしたかというと、ロボット本体を希望の角度通りに回転させる時に1回転させた時の時間を割って移動時間を出す.そうすると、計算が面倒なのだ.しかも常に同じ角度に回るとも限らない.だから直進運動させるだけに絞ったのである

*制作過程 [#l4d49906]
**過程1 土台作り [#s5235401]
~&ref(2007b/A5/課題1右/ぎあのひりつ.jpg);
~上の写真のようにモーター1個でも走れるようにする
~この形にしたメリットは早さの調整がしやすいからだ。
~そしてなによりもモーター1個にすることによりアームの自由な動きを可能にした。
**過程2 アーム作り [#u7eb3fa9]

2段階のアームを作るため、バランスなどの調整
~この過程に大部分の時間を割くことになるとはこの頃誰一人思ってなかった…
~最初ものすごく速く横移動してしまい壊れてしまうほどだった。そこで小さいギアをモーターにその横に大きいギアを組み合わせた。これによりモーターの回転を速さではなく力にもっていくことができた。
**過程3 組み立て [#t18d4bac]
~&ref(2007b/A5/課題1右/がいかん1.jpg);
~この時やはりバランスが悪く書いている最中にアームがとれてしまうなど問題がより明らかに…
~そこでまず土台の補強、アームと土台の設置するところにブロックを足すなどして動きをスムーズにそして丈夫にした。
~また上下運動するアームのモーターのコードがタイヤにからまるなどのアクシデントも…
~簡単な処理としてゴムでまとめた。
~&ref(2007b/A5/課題1右/がいかん2.jpg);
~アームと土台をつなげて出来上がり〜♪
**このロボットでやりたいこと、目指すもの [#ua411c67]
~我々は人が描くような文字に近づけるために文字の終りに右はねができるようにしたい
~そして少しでも人の書く文字近づけたい
* プログラム [#ldea66e7]
**『本』のプログラム [#l87ac80a]
~&ref(2007b/A5/りんた/本.jpg);
~本の写真:約15センチ
 int write_time, sayuu;		//sayuuha  1=migi 0=hidari 
 sub fudesage ()          //筆を下げます
 {
 	OnFwd(OUT_C); 
 	Wait(15);
 	Off(OUT_C);
 }
 
 sub fudeage()           //筆を上げます
 {
 	OnRev(OUT_C);
 	Wait(15);
 	Off(OUT_C);
 }                 //何回か書くのでサブルーチンにしました
 
 void yoko()            //横線を引きます
 {
 	fudesage();
 	OnFwd(OUT_A);
 	Wait(write_time);     //Waitにwrite_timeという変数を用いたことにより時間の調整を簡単にしました。
 	Off(OUT_A);
 	fudeage();
 }
 
 void tate()            //縦線を引きます
 {
 	fudesage();
 	OnFwd(OUT_B);
 	Wait(write_time);
 	Off(OUT_B);
 	fudeage();
 }
 void naname(){          //斜めに線を引きます
	fudesage();
	OnFwd(OUT_B);
	if(sayuu==1){      //このとき変数sayuuが1なら右斜めの線に
		OnFwd(OUT_A);
		Wait(write_time);//このプログラムではこのロボット特有の左にはらう癖があるため右移動だけを少し
                 長くすることにより奇麗な右はらいを実現した。
		Off(OUT_B);
		Wait(30);
	}else{          //0なら左斜めの線になります
		OnRev(OUT_A);
		Wait(write_time);
	}
	Off(OUT_B+OUT_A);
	fudeage();
  }                //縦横斜めの線を引く関数を作ることでほかのプログラムを作る時にも応用できます。
                  そしてifを用いることにより左右の斜め線を書くときに楽になる。
 task main(){
 	write_time=220;     //本の一画目です
 	yoko();
 	OnRev(OUT_A);
 	Wait(100);
 	OnRev(OUT_B);
 	Wait(20);
 	Off(OUT_A+OUT_B);
 	
 	write_time=130;     //本の二画目です
 	tate();
 	OnRev(OUT_B);      //ここプログラムは縦線の書き始めの位置をしています。
 	Wait(110);       //ここでのプログラムは斜め線を書き始める位置を指定していますが、
                 横線の位置に合うように縦線を書いた時間より短くしてあります。
 	Off(OUT_B);
 	
 	sayuu=0;        //本の三画目です
 	write_time=100;    //ここで斜めを書くのでsayuuも指定しています
 	naname();
 	OnFwd(OUT_A);     
 	OnRev(OUT_B);
 	Wait(90);       
 	Off(OUT_A+OUT_B);
 	
 	sayuu=1;        //本の四画目です
 	naname();
 	OnRev(OUT_A);//
 	Wait(170);
 	Off(OUT_A);
 	OnRev(OUT_B);//
 	Wait(40);
 	Off(OUT_B);
 	
 	
 	write_time=80;     //本の五画目です
 	yoko();
 	Off(OUT_C+OUT_A+OUT_B);
 }
**『板』のプログラム [#j9cb1ed4]
~&ref(2007b/A5/りんた/itaita.jpg);
~板の写真:約15センチ
~ int write_time, sayuu;		//sayuuha  1=migi 0=hidari 本のプログラムの関数をそのまま引き継いでいます
 sub fudesage (){          
	OnFwd(OUT_C); 
	Wait(15);
	Off(OUT_C);
 }
 sub fudeage(){
	OnRev(OUT_C);
	Wait(15);
	Off(OUT_C);
 }
 void yoko(){
	fudesage();
	OnFwd(OUT_A);
	Wait(write_time);
	Off(OUT_A);
	fudeage();
 }
 void tate(){
	fudesage();
	OnFwd(OUT_B);
	Wait(write_time);
	Off(OUT_B);
	fudeage();
 }
 void naname(){
	fudesage();
	OnFwd(OUT_B);
	if(sayuu==1){
		OnFwd(OUT_A);
		Wait(write_time);
		Off(OUT_B);
		Wait(30);
	}else{
		OnRev(OUT_A);
		Wait(write_time);
	}
	Off(OUT_B+OUT_A);
	fudeage();
 }	
 task main(){
            write_time=160;     //板の一画目です
            yoko();
            OnRev(OUT_A);
            Wait(60);
            OnRev(OUT_B);
            Wait(15);
            Off(OUT_A+OUT_B);
            
            write_time=130;     //板の二画目です
            tate();
            OnRev(OUT_B);
            Wait(110);
            Off(OUT_B);
            
            sayuu=0;        //板の三画目です
            write_time=100;
            naname();
            OnFwd(OUT_A);
            OnRev(OUT_B);
            Wait(95);
            Off(OUT_A+OUT_B);
            
            sayuu=1;        //板の四画目です
            write_time=60;
            naname();
            OnFwd(OUT_A);
            Wait(30);
            OnRev(OUT_B);
            Wait(60);
            Off(OUT_A+OUT_B);
            
            write_time=100;    //板の五画目です
            yoko();
            OnRev(OUT_A);
            Wait(100);
            Off(OUT_A);
            
            sayuu=0;       //板の六画目です
            write_time=100;
            naname();
            OnFwd(OUT_A);    //ここで七画目の書き始めの位置を指定しています。
            OnRev(OUT_B);
            Wait(60);
            Off(OUT_A+OUT_B);
            
            write_time=110;   //板の七画目です
            yoko();
            OnRev(OUT_A);
            Wait(20);
	    Off(OUT_A);
            sayuu=0;
            write_time=70;
            naname();
            OnRev(OUT_B);   //ここで八画目の書き始めの位置を指定していますが、
                ロボットの性質上斜め線が右よりに始まってしまうためここのプログラムで調整しています。
            Wait(60);
            Off(OUT_B);
            OnRev(OUT_A);
            Wait(40);
            Off(OUT_A);
            
            sayuu=1;      //板の八画目です
            write_time=70;
            naname();
            Off(OUT_A+OUT_B+OUT_C);
  }
**『林』のプログラム [#u6ed6d5d]
~&ref(2007b/A5/課題1右/hayasi.jpg);
『林』の写真:13×20
~int write_time, sayuu;		//sayuuha  1=migi 0=hidari本のプログラムの関数をそのまま引き継いでいます
sub fudesage (){
	OnFwd(OUT_C); 
	Wait(15);
	Off(OUT_C);
 }
 sub fudeage(){
	OnRev(OUT_C);
	Wait(15);
	Off(OUT_C);
 } 
 void yoko(){
	fudesage();
	OnFwd(OUT_A);
	Wait(write_time);
	Off(OUT_A);
	fudeage();
 }
 void tate(){
	fudesage();
	OnFwd(OUT_B);
	Wait(write_time);
	Off(OUT_B);
	fudeage();
 }
 void naname(){
	fudesage();
	OnFwd(OUT_B);
	if(sayuu==1){
		OnFwd(OUT_A);
		Wait(write_time);
		Off(OUT_B);
		Wait(30);
	}else{
		OnRev(OUT_A);
		Wait(write_time);
 }
	Off(OUT_B+OUT_A);
	fudeage();
 }	
 task main(){
           write_time=160;//hayashiの一画目です
           yoko();
           OnRev(OUT_A);
           Wait(60);
           OnRev(OUT_B);
           Wait(15);
           Off(OUT_A+OUT_B);
           
           write_time=130;//hayashiの二画目です
           tate();
           OnRev(OUT_B);
           Wait(110);
           Off(OUT_B);
           
           sayuu=0;//hayashiの三画目です
           write_time=100;
           naname();
           OnFwd(OUT_A);
           OnRev(OUT_B);
           Wait(95);
           Off(OUT_A+OUT_B);
           
           sayuu=1;//hayashiの四画目です
           write_time=60;
           naname();
           OnFwd(OUT_A);
           Wait(5);
           OnRev(OUT_B);
           Wait(60);
           Off(OUT_A+OUT_B);
           
             write_time=160;//あとは繰り返し
           yoko();
           OnRev(OUT_A);
           Wait(60);
           OnRev(OUT_B);
           Wait(15);
           Off(OUT_A+OUT_B);
           
           write_time=130;
           tate();
           OnRev(OUT_B);
           Wait(110);
           Off(OUT_B);
           
           sayuu=0;//
           write_time=100;
           naname();
           OnFwd(OUT_A);
           OnRev(OUT_B);
           Wait(95);
           Off(OUT_A+OUT_B);
           
           sayuu=1;//
           write_time=100;
           naname();
 }
**プログラムの工夫点 [#hb185e8f]
 関数やサブルーチンを使い、いろいろな文字に応用できる汎用的なものにした。

 それにより縦、横、斜めのプログラムの組み合わせだけで様々な文字を書くことを可能にした。

*まとめ [#e29a9da5]
**製作にあたって… [#ib82b698]
試行錯誤と微調整の末ようやく上下左右動くアームを完成させた
~きれいな文字の追求ならアームなど必要ないかもしれない
だが、我々は他とは違う『個性』の追求を忘れなかった。
~上下左右に動くアームの構想、製作、調整は手こずったが、その分この経験が次ぎに生かせそうだと思う。
~特に回転運動を直進運動に変える技術は今後のロボット製作を助ける。
**苦労した所 [#pe98d5a5]
まず、そもそもモーターの回転運動をどうやってアームの横移動に変えるかでなかなか思い浮かばなかった。そこで過去のロボットを参考に独自のアームを作成した。しかし、そこでさらにそれぞれの移動スピードの違いに直面した。
~これが合わないと斜め線の角度がおかしなことになるため重要な問題だった。そして速過ぎる移動はロボットの負担となり、書いている最中何度もパーツがはずれる原因となった。レゴの接着面が少ないので取れやすい
~&ref(2007b/A5/課題1右/よわい.jpg);
~これを上手く合わせるためにギアの組み合わせ色々試すなど苦労した
**考察&改善点 [#i4c77150]
改善する点については
 .前腕部分の強度不足
 .プログラムの性質上おり返す時も筆を上げ下げしてしまう
 .斜め線の角度の調整と曲線の多いじへの対応
~考察

.プログラムの改善をすることで不必要な筆の上げ下げを無くすことができる

.強度はパーツの組み合わせを考え直すとともに重心の位置をもっとロボットの中心に移す必要がある

.他の字を書くうえで問題はまだ多々あるが今回の字では小さいながらかなり人の字に近い奇麗なものを書くこと ができたのである程度満足している
 
~.今後同じようなロボットを作るさいもしもっと時間があれば字を書く能力の向上の他にデザイン上の向上を目指したい
~.特にアームのところである。本体の幅に対して極端に長くバランスが悪い。アームの長さは文字の横幅に左右されるためそのアームに合った本体の幅を調整していきたい
~.左右に動かすアームの機構がギヤであるが、タイヤで動く風にすれば制限なく大きな文字が書ける
~.このロボットは左利きだが、右利きにすればもう少しうまく文字が書けるのではないこと思う
**文字のプログラムの話 [#f8bb8d70]
実は『林』は『板』の木へんをコピー&ペーストしただけなのだ!!
~見よこの応用力!!っと調子に乗るのは自重しよう
~名字に『木』がついてよかったっす
**結果 [#vcfc4f08]
~&ref(2007b/A5/課題1右/071108_1904~01.jpg);
~よくできました<(_ _)>
~目指していた文字の右はねもできました.たぶん偶然なった
~いつの日か、なぜなったかを解明したい…
~いつの日か、なぜ右はねになったかを解明したい…
*コメントをどうぞ [#f5bcbecf]
-上の評価になるには説明不足な印象を受けます。 -- [[クノ]] &new{2007-11-07 (水) 19:37:01};

#comment


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS