目次 #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から車輪の回転数を計算してくれるものである。これはかなり正確らしいが、実際に動かすと多少のずれが生じるので、実際に動かして検討してみる必要がある。 #define SPEED 30 #define SPEEDm -30 #define Ninety GetAngle(16) //90度回転させる #define Nine GetAngle(9) #define NL RotateMotor(OUT_B,SPEED,Ninety);RotateMotor(OUT_BC,-30,Nine);//左 #define NR RotateMotor(OUT_C,SPEED,Ninety);RotateMotor(OUT_BC,-30,Nine);//右 #define TwelTen GetAngle(20) //120度回転させる #define Three GetAngle(3) #define Eleven GetAngle(17) #define EL RotateMotor(OUT_BC,SPEEDm,Three);RotateMotor(OUT_B,SPEED,TwelTen);RotateMotor(OUT_BC,SPEEDm,Eleven);//左 #define Sixty GetAngle(10) //60度回転させる #define Seven GetAngle(7) #define Two GetAngle(2) #define SR RotateMotor(OUT_BC,30,Two);RotateMotor(OUT_C,30,Sixty);RotateMotor(OUT_BC,-30,Seven); //右 #define aten GetAngle(10) #define afourfive GetAngle(4.5) #define aeight GetAngle(8) #define asixth GetAngle(6.3) #define afour GetAngle(4) #define PU RotateMotor(OUT_A,SPEED,60); //ペンを上げる #define PD RotateMotor(OUT_A,SPEED,-60); //ペンを下げる #define twelc RotateMotor(OUT_BC,SPEED,GetAngle(12)); #define tenc RotateMotor(OUT_BC,SPEED,aten); #define fourfivec RotateMotor(OUT_BC,SPEED,afourfive); #define eightc RotateMotor(OUT_BC,SPEED,aeight); #define sixthc RotateMotor(OUT_BC,SPEED,asixth); #define fourc RotateMotor(OUT_BC,SPEED,GetAngle(4)); #define twoc RotateMotor(OUT_BC,SPEED,GetAngle(2)); #define nineB RotateMotor(OUT_BC,SPEEDm,GetAngle(9)); #define fiveB RotateMotor(OUT_BC,SPEEDm,GetAngle(5)); #define fourB RotateMotor(OUT_BC,SPEEDm,GetAngle(4)); #define twothB RotateMotor(OUT_BC,SPEEDm,GetAngle(2.3)); #define fourfiveB RotateMotor(OUT_BC,SPEEDm,GetAngle(4.5)); #define fivec RotateMotor(OUT_BC,SPEED,GetAngle(5)); #define twentyc RotateMotor(OUT_BC,SPEED,GetAngle(20)); task main() { PD; twelc; PU; nineB; EL; twoc; PD; fourB; PU; twothB; SR; sixthc; PD; fourB; PU; twothB; SR; nineB; PD; tenc; PU; fiveB; twoc NL; // fiveB; twoc; PD; fourfiveB;// twoc; PU; NR; // nineB; PD; twelc; PU;// fivec; NR; fiveB; PD; sixthc; PU;// fivec; twothB NR; fiveB; PD; twentyc; PU;// NR; twothB; PD; sixthc; PU; } *まとめ [#i37e3d8c] 今回のロボットはfloat GetAngle(float d)という関数を用いたが、タイヤと紙の間の摩擦や電池の状態によってかなりの誤差が出てしまい、頭の中で思い描いていたイメージとだいぶ違う動きをしてしまったので、数値を変えて動かすことを何回もくりかえした。 -aiueo +yfyuf +ygy