*ロボティイクス [#fb1f5d30]
**書道ロボットを作る!! [#e4c6ff94]
 #define L(t) OnRev(OUT_A);OnFwd(OUT_C);Wait(t);Off(OUT_AC);//左回転
目次
#contents
*課題1 [#x2b39d92]
A4サイズのコピー用紙に2文字以上の自分の住んでいる地域の名前を書く。
**選んだ地名 [#m4c597fe]
自分は長野県上田市に住んでいるが、「長野」は画数が多く複雑になってしまうため「上田」にした。
*ロボットの説明 [#mf505b21]
**ロボット全体 [#b4099b6c]
x軸、y軸をとり、ペンを移動させるロボットを作ることができればプログラムをより少ない量で書けるとは思ったが、うまく作ることができなかった。なので、プログラムが多少複雑になるとは思ったが、RISのテキストに載っていた4輪の車を参考にし、その4輪車の先にペンを上下させる構造を取り付けたのみのシンプルな構造にした。
プログラムが複雑になる理由は、この構造で機体を回転させた際の回転軸がペン先ではないので、ペン先を紙から離し、機体を90度回転させた後にペンを下すだけでは、ペン先を離した位置と同じ位置に機体が90度回転した状態で再度ペン先を置くことができないため、下図のような動きをしなければならないからだ。
**ペンを動かす構造 [#m6e60530]
モーターから伸ばした腕にペンをゴムで固定するのみのシンプルな構造。
*プログラム [#ma5ef275]
**文字の書き方 [#b636bb55]
「上田」の「上」は本来の書き順通りに書いた。「田」の書き順に少し悩まされたが、口を書いた後にその中に十を書くのが一番単純になると考えた。
**プログラム全体 [#ca2e431d]
右回転、前進、後進、ペンの上げ下げを定義付けし、あえて左回転を用いないことでプログラムを減らそうと試みた。また、「上田」を書く際に90度回転を多用することが予想されたため、サブルーチンを用いて90度回転をすぐに呼び出せるようにした。
 #define R(t) OnFwd(OUT_A);OnRev(OUT_C);Wait(t);Off(OUT_AC);//右回転
 #define F(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);//前進
 #define B(t) OnRev(OUT_AC);Wait(t);Off(OUT_AC);//後進
 #define pen_up OnFwd(OUT_B);//ペン上げる
 #define pen_up OnFwd(OUT_B);//ペン上げる(ここでペンを上げようとする動きを止めると重力でペンが下がってきてしまったため、常にペンを上げる動きをするようにした。)
 #define pen_down OnRev(OUT_B);;Wait(20);Off(OUT_B);//ペン下げる
 sub edge_curve()//90度右回転
ペンを下げた後すぐはペンを下した勢いでペンが跳ねてしまい、そのまま字を書こうとロボットを動かすと点線のようになってしまうことが分かった。なので、ペンを下した後に0.5秒動きを止めるようにしたところそれが改善された。
 sub edge_curve()//90度右回転
 {
     pen_up;
     F(75);
     R(110);
     B(80);
     pen_down;
     Off(OUT_AC);
     Wait(50);
 }
「上」
 task main()
 {
     F(25);//上
     Off(OUT_AC);
     Wait(30);
     F(25);//上1画目
     Wait(50);
     pen_up;
     F(80);
     R(100);
     R(100);//本来R(110)で約90度回転するが、ここは車輪と紙の摩擦の関係上R(100)にしたところずれが少し解消された。
     B(50);
     pen_down;//足した
     Off(OUT_AC);
     pen_down;
     Wait(50);
     B(60);
     B(60);//上2画目
     pen_up;
     F(90);
     R(110);
     B(110);
     pen_down;
     Off(OUT_AC);
     Wait(50);
     F(60);
     F(60);//上3画目
「上」の書き終わりから「田」の書き始めまでの移動
     pen_up;
     F(70);
     F(50);
     R(110);
     B(40);//元二十だった
     pen_down;//田
     Off(OUT_AC);
     B(40);
     pen_down;
     Wait(50);
「田」のうちの「口」の部分(forを用いて前進→90度回転を4回繰り返し、最後に「田」の「十」の部分の書き始めの位置まで移動する)
     int i;
     for (i=1; i<=4; i++){
     F(50);
     edge_curve();
     }
     F(28);
     F(25);
「田」のうちの「十」の部分
     edge_curve();
     F(50);
     B(25);
     edge_curve();
     F(25);
     B(50);
     Off(OUT_B);
 }


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