課題は自分の苗字・名前の中から7画以上の漢字を一つ選び、その文字を自律して書くロボット及びプログラムをつくることである。自分は「真」という文字を選んだ。
基本的な構造はマインドストームの基本形を元にしている。BとCそれぞれのポートにつないだモーターで前進・後退・旋回をコントロールし、Aのポートにつないだモーターでペンの上げ下げをコントロールする。ペンが下りた状態でロボットが移動した軌跡がそのまま文字となる。
基本形からの改造点としては下ろしたときのペンの位置が車軸の中心に近くなるようにした。
#define put_pen OnFwd(OUT_A,20);Off(OUT_BC);Wait(400);Off(OUT_A); #define rise_pen OnRev(OUT_A,20);Off(OUT_BC);Wait(400);Off(OUT_A);
この二つのプログラムによってペンの上げ下げをコントロールする。
#define go(t,s) OnFwd(OUT_BC,s);Wait(t);Off(OUT_BC); #define back(t,s) OnRev(OUT_BC,s);Wait(t);Off(OUT_BC); #define turn_l(tt) OnFwd(OUT_B,70);OnRev(OUT_C,70);Wait(tt);Off(OUT_BC); #define turn_r(tt) OnFwd(OUT_C,70);OnRev(OUT_B,70);Wait(tt);Off(OUT_BC);
go(t,s)とback(t,s)という定数で前進・後退、turn_l(tt)とturn_r(tt)という定数で左折(左旋回)・右折(右旋回)をコントロールする。
移動する距離や機体が回転する角度は全て時間とスピードで調整した。定数の中では数値は設定せず、場面に応じてプログラムの中で数値を決めた。
なお、tはtime、sはspeed、ttはturn timeである。
以下に文字の各パーツごとに分けて解説していく。
put_pen; go(1000,50); rise_pen; back(140,50); turn_r(500); back(680,50); put_pen; go(400,50); rise_pen; //十の終わり
turn_r(460); go(300,50); turn_l(470); put_pen; go(800,50); rise_pen; go(360,50); turn_l(440); back(360,50); put_pen; go(600,50); rise_pen; go(360,50); turn_l(440); back(360,50); put_pen; go(800,50); rise_pen; go(360,50); turn_l(440); back(360,50); put_pen; go(600,50); rise_pen; go(720,50); turn_l(440); go(280,50); turn_l(440); put_pen; go(600,50); rise_pen; go(720,50); turn_r(470); go(280,50); turn_r(470); put_pen; go(600,50); rise_pen; //目の終わり
この部分での工夫点としては、書き順や方向は指定しないとのことだったので、一筆書きのルートでムダをなくしたことである。
又、go(360,50);turn_l(440);back(360,50);の部分は、直角に曲がる時に車軸の中心とペンを下ろした位置との距離によって生じるズレを補正している。
go(920,50); turn_l(430); go(400,50); turn_l(430); put_pen; go(1000,50); rise_pen; back(300,50); turn_l(180); back(680,50); put_pen; back(200,50); rise_pen; go(1000,50); turn_l(560); back(700,50); put_pen; back(200,50); rise_pen;
プログラムの中で同じ距離、角度でも数値が違う部分があるが、これは動作中に徐々に生じる誤差を修正するために調整したためである。
自宅では微調整を重ねて文字を識別できるレベルにはできたが、いざ先生に見せてみると酷い有様だった。これは移動距離や回転角度を全て時間でコントロールしたため、床の摩擦や電池残量によって動きにバラツキができるためだと考えられる。改善点としては移動をモーターの回転角によって制御し、どのような環境でも安定した動きをできるようにするべきだった。
今回初めて課題を与えられ、それを自分自身でつくるという経験をしてプログラムの難しさを改めて実感した。今回は残念ながら失敗に終わり、おそらくこれからも失敗の連続だろうが、その失敗を活かして解決策を導いていきたい。