目次
#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);//右
**スピード [#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 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 TwelveTenLeft RotateMotor(OUT_BC,SPEEDm,GetAngle(3));RotateMotor(OUT_B,SPEED,GetAngle(20));RotateMotor(OUT_BC,SPEEDm,GetAngle(17));//左に120度回転

#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 SixtyRight RotateMotor(OUT_BC,SPEED,GetAngle(2));RotateMotor(OUT_C,SPEED,GetAngle(10));RotateMotor(OUT_BC,SPEEDm,GetAngle(7)); //右に60度回転

#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;
}
**ペンの動き [#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


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