目次
「空」という漢字をロボットにペンをもたせて、紙に書かせる。 「空」を選んだ理由は、最近秋晴れや夜空が綺麗なので。
3輪で、ペンのついたアームを上下させるロボットを最初に作ったのだが、
等の理由により、ロボットもプログラムも一度白紙に戻してやり直すことにする。
失敗作から反省してできたものがこちら。地面に接する部分が近くなり、その結果縦長になった。
下からとった写真。両輪のほぼ中間点にペン先が落ちる(白線)。ペン先を紙に着けたまま自由にその場で回転できるようになった。
また支持脚を前後にそれぞれ二本付けた(赤丸)。摩擦が小さいので紙を巻きこむことなく、安定してロボットが移動できる。
上部に着けたモーターAの腕は円弧上に動くが、下の穴の中を通すのでペンは垂直に上下する。
番号の通りに○画目と呼ぶことにする。
#define turn_left(t) RotateMotorEx(OUT_BC,50,t,-100,true,true); //その場で左折する #define turn_right(t) RotateMotorEx(OUT_BC,50,t,100,true,true); //その場で右折する #define go(t) RotateMotor(OUT_BC,50,t); //直進する #define back(t) RotateMotor(OUT_BC,-50,t); //後退する
sub hitohude(int t) { RotateMotor(OUT_A,50,-45); OnFwd(OUT_A,5); //ペン先を下げ、押し続ける RotateMotor(OUT_BC,50,t); Wait(200); RotateMotor(OUT_A,50,45); //ペン先を上げる }
ペンで直線を書かせるプログラム。RotateMotorは動作が終わるとモーターを止めてしまうので、ペンを押し続ける命令(OnFwd(OUT_A,5); )がなければ線がかすれてしまう。
「空」の2,4画目では使用していない。
task main() { hitohude(80); //1画目 go(100); turn_right(260); go(100); turn_right(240); RotateMotor(OUT_A,50,-45); OnFwd(OUT_A,5); go(80); turn_right(260); go(200); turn_right(240); go(50); RotateMotor(OUT_A,50,45); //2画目 back(80); turn_right(240); go(110); turn_left(150); hitohude(110); //3画目 back(110); turn_right(150); back(50); turn_left(240); RotateMotor(OUT_A,50,-45); OnFwd(OUT_A,5); go(100); turn_left(240); go(80); RotateMotor(OUT_A,50,45); //4画目 back(200); turn_right(280); go(50); turn_left(330); hitohude(160); //5画目 back(50); turn_right(240); back(50); hitohude(100); //6画目 go(10); turn_left(260); back(120); hitohude(220); //7画目 }
後半になるにつれモーターが回りづらく、数値通りには動かないので値を大きくする必要があった。
電圧によっても変化してくるので調整が難しかった。とはいえ、失敗作と比べると修正する手間と修正箇所の発見が大幅に楽になった。
書き順によるペン先のわずかなズレ、次のhitohudeまでの移動距離など、実際に動かしてみないとわからないことがたくさんあった。一回一回少しずつ調整した。
バランスよく、満足いく出来だと思う。 大きさは15cm*15cmぎりぎりだった。
ロボットの構造によってプログラミング・調整の難しさが大きく違うことを痛感した。
失敗作に早めに見切りをつければ楽だっただろう。