目次 #Contents *課題1の内容 [#u39f4112] A4の紙に今年の大学生活を表す漢字一文字を書くロボットを作製せよ。というものである。僕は今年たくさん失敗をしてしまい苦い思いをしたので「苦」という字をロボットで書こうと思った。 * ロボットの説明 [#lfb8fa77] **全体 [#a00d56a2] 今回のロボットは一番最初に作成した基本のものにペンを上げ下げする部品を取り付けたシンプルな構造になっている。それにより分解するのも簡単になっている。 #ref(2016b/Member/god22ila/Mission1/IMG_0448.JPG,50%,基本の構造) 基本の構造 **車輪 [#rfcac9af] 直角に曲がったりするには車輪は二つのほうがプログラミングしやすいと思ったので、基本のものを崩さずに使用した。曲がるときには二つの車輪を逆方向に回転させる方法をとろうとしたが、やってみて難しく感じたので、片方の車輪を軸にしてコンパスが円を描くようにもう片方の車輪を動かす方法をとった。 **アームについて [#s2b33552] -今回は構造を簡単にするために一つのモータとギアでペンを上げ下げするものにした。 -ペンがロボットの前方の中心にくるようにするとペンの位置のずれをわざわざ計算しなくて済むと思ったのでペンが本体の中心に来るようにブロックをつなげて調節をした。 -ブロック一つにペンを輪ゴムで止めるような構造にするのではなく二つのブロックで挟むような構造にしたのは、ブロックでペンを挟むことによってペンが完全に固定されないから。 -ペンが完全に固定されていないとペン先が下を向いたときに若干下に落ちてしまうが、それによって確実に紙にインクが付くようになる。だが、そこまでゆるくなっているわけではないのでペンを上げてもペン先が紙につきっぱなしという事態にはならない。 #ref(2016b/Member/god22ila/Mission1/IMG_0452.JPG,50%,アーム) #ref(2016b/Member/god22ila/Mission1/IMG_0457.JPG,50%,アーム2) アームの取り付け *プログラム [#r2fc00fa] float GetAngle(float d) { const float diameter = 5.45; const float pi = 3.1415; float ang = d/(diameter*pi)*360.0; return ang; } この関数は資料のp31に載っているもので、距離dから車輪の回転数を計算してくれるものである。これはかなり正確らしいが、実際に動かすと多少のずれが生じるので、実際に動かして検討してみる必要がある。 **スピード [#fdd90b36] #define SPEED 30 #define SPEEDm -30 今回は紙が大きく動いたりしないようにスピードを遅めの30に統一する。SPEEDmのmはマイナスの意味である。 **回転について [#g683fd1d] 方向を変えるときは上の車輪の部分で説明したようにやってみたが回転後に位置がずれてしまったので回転する前後の位置を調節した。GetAngle()内の数字は実際に動かしてみて調節しながら決めた。 #define NinetyLeft RotateMotor(OUT_B,SPEED,GetAngle(16));RotateMotor(OUT_BC,-30,GetAngle(9));//左に90度回転 #define NinetyRight RotateMotor(OUT_C,SPEED,Getangle(16));RotateMotor(OUT_BC,-30,GetAngle(9));//右に90度回転 #define TwelveTenLeft RotateMotor(OUT_BC,SPEEDm,GetAngle(3));RotateMotor(OUT_B,SPEED,GetAngle(20));RotateMotor(OUT_BC,SPEEDm,GetAngle(17));//左に120度回転 #define SixtyRight RotateMotor(OUT_BC,SPEED,GetAngle(2));RotateMotor(OUT_C,SPEED,GetAngle(10));RotateMotor(OUT_BC,SPEEDm,GetAngle(7)); //右に60度回転 **ペンの動き [#l9f35134] #define PenUp RotateMotor(OUT_A,SPEED,60); //ペンを上げる #define PenDown RotateMotor(OUT_A,SPEED,-60); //ペンを下げる **本体の前後の動き [#q95f23c4] 前に進む命令には進む距離の次にGoを、後ろに下がる命令にはBackを付ける。少々長くなって面倒に感じるが、プログラムを書いたときに一目でどういう動きをするかが分かる。 #define twelveGo RotateMotor(OUT_BC,SPEED,GetAngle(12)); #define tenGo RotateMotor(OUT_BC,SPEED,GetAngle(10)); #define fourfiveGo RotateMotor(OUT_BC,SPEED,GetAngle(4.5)); #define eightGo RotateMotor(OUT_BC,SPEED,GetAngle(8)); #define sixthreeGo RotateMotor(OUT_BC,SPEED,GetAngle(6.3)); #define fourGo RotateMotor(OUT_BC,SPEED,GetAngle(4)); #define twoGo RotateMotor(OUT_BC,SPEED,GetAngle(2)); #define twentyGo RotateMotor(OUT_BC,SPEED,GetAngle(20)); #define fiveGo RotateMotor(OUT_BC,SPEED,GetAngle(5)); #define nineBack RotateMotor(OUT_BC,SPEEDm,GetAngle(9)); #define fiveBack RotateMotor(OUT_BC,SPEEDm,GetAngle(5)); #define fourBack RotateMotor(OUT_BC,SPEEDm,GetAngle(4)); #define twothreeBack RotateMotor(OUT_BC,SPEEDm,GetAngle(2.3)); #define fourfiveBack RotateMotor(OUT_BC,SPEEDm,GetAngle(4.5)); **全体の動き [#q51ebc11] 回転する動作をプログラミングしたときは床の上で行っていたので、紙の上で動かしてみると若干ズレが生じた。紙の上と床の上では摩擦が違うからだ。また、紙の上で方向を変える時や紙からはみ出し机の上で方向を変える時があるので、様子を見ながら回転する前後にロボットの位置を調節するためのプログラムを差し込んだ。 task main() { PenDown; twelveGo; PenUp; //一画目 nineBack; TwelveTenLeft; twoGo; PenDown; fourBack; PenUp; //ニ画目 twothreeBack; SixtyRight; sixthreeGo; PenDown; fourBack; PenUp; //三画目 twothreeBack; SixtyRight; nineBack; PenDown; tenGo; PenUp; //四画目 fiveBack; twoGo; NinetyLeft; // fiveBack; twoGo; PenDown; fourfiveBack;// twoGo; PenUp; //五画目 NinetyRight; // nineBack; PenDown; twelveGo;//ここから書き順の七画目から始めて口を書く PenUp;// fiveGo; NinetyRight; fiveBack; PenDown; sixthreeGo; PenUp;// fiveGo; twothreeBack NinetyRight; fiveBack; PenDown; twentyGo; PenUp;// NinetyRight; twothreeBack; PenDown; sixthreeGo; PenUp; } *まとめ [#i37e3d8c] 今回のロボットはfloat GetAngle(float d)という関数を用いたが、タイヤと紙の間の摩擦や電池の状態によってかなりの誤差が出てしまい、頭の中で思い描いていたイメージとだいぶ違う動きをしてしまったので、数値を変えて動かすことを何回もくりかえした。 -aiueo +yfyuf +ygy