*目次 [#lef54b85]
#contents
*課題 [#v8a88bd5]
今回の課題はロボットを使って自分の名前の漢字を一つ書かせるものでした。
私は「智」という漢字に挑戦しました。
*ロボット本体 [#kc02f76f]
&ref(./image[1].jpeg,40%);
&ref(./image[2].jpeg,40%);
これがロボット本体です。
サンプルのロボットからあまり形を変えずに本体中央にアームを取り付けて、紙面上を動き回らせるようにしました。
開始当初はアームをロボット本体の左側に取り付けて作業していましたが、左右に回転するときのブレ幅が大きくなるので、中央に変えました。
アームはモーターの回転角度を指定することを利用しました。
このおかげでアームが正確に上下運動してくれるので、筆圧の調整が楽になりました。
ペンには太く、はっきりと書いてくれるマッキーを選びました。
*プログラミングについて [#jded4873]
**定義の説明 [#b742d1ad]
#define up RotateMotor(OUT_A,-40,87);Off(OUT_A);Wait(500); //アームを上げる
#define down RotateMotor(OUT_A,40,87);Off(OUT_A);Wait(500); //アームを下げる
#define hd45 RotateMotorEx(OUT_BC,50,201,0,true,true);Off(OUT_BC);Wait(300);/
RotateMotorEx(OUT_BC,50,88,-100,true,true);Off(OUT_BC);Wait(300);RotateMotorEx(OUT_BC,-50,203,0,true,true); //左に45度回転させる
#define hd90 RotateMotorEx(OUT_BC,50,203,0,true,true);Off(OUT_BC);Wait(300);/
RotateMotorEx(OUT_BC,50,180,-100,true,true);Off(OUT_BC);Wait(300);RotateMotorEx(OUT_BC,-50,187,0,true,true); //左に90度回転させる
#define mg45 RotateMotorEx(OUT_BC,50,190,0,true,true);Off(OUT_BC);Wait(300);/
RotateMotorEx(OUT_BC,50,93,100,true,true);Off(OUT_BC);Wait(300);RotateMotorEx(OUT_BC,-50,192,0,true,true); //右に45度回転させる
#define mg90 RotateMotorEx(OUT_BC,50,183,0,true,true);Off(OUT_BC);Wait(300);/
RotateMotorEx(OUT_BC,50,185,100,true,true);Off(OUT_BC);Wait(300);RotateMotorEx(OUT_BC,-50,188,0,true,true); //右に90度回転させる
#define mae1 RotateMotorEx(OUT_BC,50,18,0,true,true); //1�兪或�
#define mae2 RotateMotorEx(OUT_BC,50,37,0,true,true); //2�兪或�
#define mae25 RotateMotorEx(OUT_BC,50,45,0,true,true); //2.5�兪或�
#define mae3 RotateMotorEx(OUT_BC,50,56,0,true,true); //3�兪或�
#define mae4 RotateMotorEx(OUT_BC,50,77,0,true,true); //4�兪或�
#define mae5 RotateMotorEx(OUT_BC,50,99,0,true,true); //5�兪或�
#define mae6 RotateMotorEx(OUT_BC,50,112,0,true,true); //6�兪或�
#define mae7 RotateMotorEx(OUT_BC,50,142,0,true,true); //7�兪或�
#define mae8 RotateMotorEx(OUT_BC,50,163,0,true,true); //8�兪或�
#define ush1 RotateMotorEx(OUT_BC,-50,18,0,true,true); //1�儻綽�
#define ush2 RotateMotorEx(OUT_BC,-50,37,0,true,true); //2�儻綽�
#define ush25 RotateMotorEx(OUT_BC,-50,45,0,true,true); //2.5�儻綽�
#define ush3 RotateMotorEx(OUT_BC,-50,56,0,true,true); //3�儻綽�
#define ush4 RotateMotorEx(OUT_BC,-50,77,0,true,true); //4�儻綽�
モーターはどの定義も回転角度の指定を用いました。
なぜかというと、時間指定でプログラミングをしていたら電池の残量によって動き方が変わってしまい上手くできなかったからです。
回転角度の指定を使えば、電池に依存しないので常に同じ動きをしてくれました。
前進、後進は1�僂世餌�定して後は倍々していけば良いと考えましたが、ブレーキをするときに誤差が出るらしくそれぞれの長さを測定しました。
各動作の後に少し時間を置くことで、行動の間に余裕が生まれてブレが少なくなりました。
また前輪のモーターは同期させて真っ直ぐ進むようにしました。
**プログラムの説明 [#z7a900dd]
これが「智」という漢字を書くプログラムです。
task main()
{
down;
mae4;
up;
hd45;
ush1;
down;
mae3;
up;
ush1;
mg45;
ush2;
hd90;
down;
mae2;
up;
mae1
mg90;
ush25;
down;
mae5;
up;
ush25;
hd45;
down;
mae3;
up;
ush3;
hd90;
down;
mae3;
up; //ここで『矢』の字が終わる
ush3;
hd45;
mae4;
mg90;
mae25;
hd90;
down;
mae4;
up;
mae1
hd90;
down;
mae4;
up;
mae1;
hd90;
down;
mae4;
up;
mae1;
hd90;
down;
mae4;
up;
mae1;
hd90; //ここで『口』の字が終わる
mae25;
mg90;
mae1;
down;
mae7;
up;
mae1;
mg90;
down;
mae6;
up;
mae1;
mg90;
down;
mae7;
up;
mae1;
mg90;
down;
mae6;
up;
mae1;
mg90;
mae4;
mg90;
down;
mae5;
up; //ここで『日』の字が終わる
}
このプログラムでロボットが「智」という字を『矢』→『口』→『日』の順に動いて書きます。
基本的に定義の45度回転、90度回転を多く使っています。
A4用紙に大きく書こうとするプログラムを作ったところ誤差も大きくなり、読めない代物が出来上がったので、小さくしたところ誤差が減り、上手くいきました。
実際に書いたものがこちらになります。
&ref(./1433753911097.jpg,80%);
*苦労したところ [#gd5c80c6]
45度回転、90度回転の定義を作るのに多くの時間を使いました。
ロボット本体が90度回転しても、ペンが移動する前と同じ位置に来るようにしないといけないため、何度も調整しました。
90度回転したように見えても、繰り返すと少しずつずれていくため、定規を用いて二人係で測定しました。
またモーターの角度を指定出来ることに気づくまでは時間指定で作業していたため、電池の残量によるパワーの出力の違いに苦しまされました。
*反省点とまとめ [#v8299e6f]
今回私が作ったプログラムは直進しか出来ず、漢字の止め、はね、はらいを完璧に再現することが出来ませんでした。
またプログラミングに多くの時間を割き、ロボット本体に改良を加えるという案が自分の頭に浮かばなかったのが残念です。
もっと早くモーターの角度指定に気が付いていれば、よりクオリティの高いものが出来たと考えます。
しかし今回の経験で得た知識は次の課題で生かせるので、次回こそは完璧なロボット制御を目指したいです。