[[2016a/Member]] 目次 #contents *課題内容 [#pe377acb] 今回の課題は、A4の紙にロボットを用いて班のメンバーの似顔絵を描くというものでした。 *ロボット [#xd8888aa] 今回、私達の班が作成したロボットはこちらです。~ このロボットは作成時に、重心を上手く定めるのがたいへんでした。~ また、プログラムとの誤差を小さくするためにペンの位置をなるべく本体に近づけるようにしたためこのような型になりました。 #ref(2016a/Member/jake57/Mission1/IMG_20160603_162129313.jpg,20%,ロボット1) このロボットは作成時に、重心を上手く定めるのがたいへんでした。また、プログラムとの誤差を小さくするためにペンの位置をなるべく本体に近づけるようにしたためこのような型になりました。 #ref(2016a/Member/jake57/Mission1/IMG_20160603_162200279.jpg,20%,ロボット2) このロボットは、ペンをタイヤ2つで挟んで回転させることによって、ペン先の上下運動を可能にしています。 #ref(2016a/Member/jake57/Mission1/IMG_20160603_162207900.jpg,30%,ペン) この方法だとペンによって、摩擦抵抗が異なり力の調整がたいへんでした。そのため摩擦抵抗が小さく摩擦が一定の鉛筆を用いて試してみましたが摩擦が小さすぎてうまくいきませんでした。 次に問題となったのはロボットが紙からはみ出したときに、紙の端がロボットに引っかかってしまうことでした。この問題は以下の写真ように摩擦が小さく引っかからない丸みを帯びた部品を使うことによって解決することができました。 #ref(2016a/Member/jake57/Mission1/IMG_20160603_162217301.jpg,20%,工夫したところ) *プログラム [#r7dab898] プログラムについては、ロボットを見て分かるとおり前後が反転しているため回転させる際などは何度も確認しました。~ 輪郭は班員で統一したためvoidを用いた関数を使用して簡略化しました。 #define MoveTime 8 task main() { Setting(); pen_move(); OnRev(OUT_C); Wait(1500); //円で顔 //:::::::::::::::::::::::::::::::::::::: turn(45); //45turn move(6); //6cm turn(45); //45 move(9); //6cm // 頭終了 //::::::::::::::::::::::::::::::::::::: pen_back(); turn(60); turn(45); OnFwd(OUT_AC); Wait(4); Off(OUT_AC); pen_move(); move(3); //右目 pen_back(); turn(3); turn(3); move(3); pen_move(); move(3); //左目 pen_back(); Off(OUT_AC); turn(90); turn(45); OnFwd(OUT_AC); Wait(4); Off(OUT_AC); pen_move(); //口 OnRev(OUT_A); OnFwd(OUT_C); Wait(150); pen_back(); Off(OUT_AC); } void Setting() //モーターのパワーを上手く調整するための関数 { SetPower(OUT_B,4); SetPower(OUT_AC,1); } void pen_move() //ペンを下ろすための関数 { OnRev(OUT_B); Wait(100);//先が地面につくまで待機 //Offすると上に行くのでそのまま前進 } void pen_back() //ペンを上げるための関数 { OnFwd(OUT_B); Wait(100); Off(OUT_B); } void turn(int kakudo) //髪や目を描くときの角度を調整するための関数 { //pen_back(); OnRev(OUT_C); OnFwd(OUT_A); if(kakudo ==3) Wait(5); else if(kakudo==15) Wait(16); else if(kakudo==30) Wait(32); else if(kakudo==45) Wait(48); else if(kakudo==90) Wait(96); else if(kakudo==60) Wait(64); //OnRev(OUT_AC); Wait(7); } void move(int cench){ int time=cench*MoveTime; //ロボットを前進させるための関数 OnRev(OUT_AC); Wait(time); Off(OUT_AC); Wait(100); } void back(int cench){ int time=cench*MoveTime; //ロボットを後退させるための関数 OnFwd(OUT_AC); Wait(time); Off(OUT_AC); Wait(100); } *作品(似顔絵) [#zf060580] 今回私が作成したプログラムで描けた似顔絵はこちらです。~ まず、輪郭を描くときにロボットが紙からはみ出してしまうことを考慮して1周半描けるようにしました。~ はじめは輪郭を五角形にするつもりでしたが1周した時に角度が合わず繋がらなかったので丸い輪郭にしました。~ 口を描こうと試行錯誤してみましたがなかなか上手くいかずピカソの作品の鼻のようになってしまいました。 #ref(2016a/Member/jake57/Mission1/20160608_192632.jpg,10%,似顔絵) *感想・考察 [#ee4eaf87] 今回の課題ではじめてプログラミングをしましたが面白い反面やはり難しかったです。~ プログラムに関しては、詳しい班員に沢山質問して様々なことを教わりました。~ ~ 考察としては、ロボットを動かす時に同じプログラムを使っても毎回違う顔になってしまったため、毎回プログラムを変えるのではなくて、表示された電池残量をみてその度にプログラムを変えたらよかったと思いました。また、はじめは油性ペンを使っていてロボットが上手く動かなかったのでシャーペンに変えましたが、今思えば油性 考察としては、ロボットを動かす時に同じプログラムを使っても毎回違う顔になってしまったため、毎回プログラムを変えるのではなくて、表示された電池残量をみてその度にプログラムを変えたらよかったと思いました。また、はじめは油性ペンを使っていてロボットが上手く動かなかったのでシャーペンに変えましたが、今思えば油性ペンでは使ってるうちにペン先が乾いて摩擦の程度が変わっていたためかもしれないと思いました。