今回自分は「森」という字を選んだ。
今回はロボットは基本のロボットから筆を上下に動かす装置を取り付けるように制作した。 写真手前のアームにペンを取り付け、本体ごと走りながら文字を書いていく。
考えた結果、今回のロボットでは「森」の字を書く方法として「書き順通り」に書くことを選択した。 理由として、まずプログラムを書く時間をとれなかったのと、「森」の字が木が三つで成り立っているので、部分毎に書いていく方がプログラムが簡単になると考えたからである。
プログラムは、まずプログラムの簡易化と整備のし易さを兼ねて上の木を書くプログラム、下の二つの木は同じプログラムにまとめるという方針をとった。
完成予想図。下の2つの木は同じ形となる。
#define SPEED 40 #define TIME 1000
SPEEDはモーターの回転させるスピード。速すぎると安定しないので40程度に設定しておいた。
TIMEは各動作の間に設ける時間。1秒おきに動く。
sub penup(){ //ペンを上げる動作 RotateMotor(OUT_A,SPEED,20); Wait(TIME); Off(OUT_A); } sub pendown(){ //ペンを下げる動作 RotateMotor(OUT_A,SPEED,-20); Wait(TIME); Off(OUT_A); } sub rotatem(int s){ //モーターを回転(前進・後退)させる動作。引数sをどれだけ進む距離(※)として用いている。 RotateMotor(OUT_BC,SPEED,s); Wait(TIME); Off(OUT_BC); }
基本となるペン上げ、ペン下げ、回転動作の3つの動作をサブルーチンとしてあらかじめ定義しておく。
なお、ロボット自体を旋回させるプログラムは、RotateMotorExの命令をそのまま利用した。
※引数sの値は20毎に約1cm進む。
sub writetree1(){ pendown(); rotatem(180); //一の線を引く penup(); rotatem(-20); //中心の位置に移動するため少し戻る RotateMotorEx(OUT_BC,SPEED,180,-100,true,true); //反時計回りに90°旋回 Wait(TIME); rotatem(-60); pendown(); rotatem(-160); //木の縦棒を引く penup(); rotatem(100); //戻る RotateMotorEx(OUT_BC,SPEED,90,100,true,true); //時計回りに45°旋回 Wait(TIME); rotatem(60); pendown(); rotatem(-120); //ノの部分を引く penup(); rotatem(180); RotateMotorEx(OUT_BC,SPEED,180,-100,true,true); //反時計回りに90°旋回 Wait(TIME); rotatem(60); pendown(); rotatem(-120); //払いの部分を引く penup(); rotatem(180); RotateMotorEx(OUT_BC,SPEED,90,100,true,true); //時計回りに45°旋回 Wait(TIME); }
次のサブルーチンwritetree1は上の「木」を書くプログラムである。
sub downmove(){ rotatem(-160); RotateMotorEx(OUT_BC,SPEED,180,100,true,true); //時計周りに90°旋回 Wait(TIME); rotatem(-220); }
サブルーチンdownmoveは、上の木の終了地点から、左下の木の開始地点へと移動するプログラムである。
sub writetree2(){ rotatem(120); //一の線を引く penup(); rotatem(60); //ちょっと進む RotateMotorEx(OUT_BC,SPEED,180,-100,true,true); //反時計回りに90°旋回 Wait(TIME); rotatem(-60); pendown(); rotatem(-180); //|を引く penup(); rotatem(120); //戻る RotateMotorEx(OUT_BC,SPEED,60,100,true,true); //時計回りに30°旋回 Wait(TIME); rotatem(60); pendown(); rotatem(-120); //ノを引く penup(); rotatem(180); RotateMotorEx(OUT_BC,SPEED,120,-100,true,true); //反時計回りに60°旋回 Wait(TIME); rotatem(60); pendown(); rotatem(-120); //払いを引く penup(); rotatem(180); RotateMotorEx(OUT_BC,SPEED,60,100,true,true); //時計回りに30°旋回 Wait(TIME); }
以下のサブルーチンwritetree2は下の少し縦長の木1つを書くプログラムである。
メインタスクではこれを位置替えを挟んで2回行う。
sub sidemove(){ RotateMotorEx(OUT_BC,SPEED,180,-100,true,true); //反時計回りに90°旋回 Wait(TIME); rotatem(150); RotateMotorEx(OUT_BC,SPEED,180,100,true,true); //時計回りに90°旋回 }
サブルーチンsidemoveは、右下の木の終了地点から左下の木を書くための位置まで移動する。
task main() { penup(); Wait(5000); //この時間中に開始地点にセットする writetree1(); downmove(); writetree2(); sidemove(); writetree2(); }
メインタスク。上記のサブルーチンを組み合わせる。
結果としては満足のいく結果が得られず、字がかけたことはあまりなかった。
失敗の要因として、
文字を大きく書くことにこだわりすぎた&ロボットのモーターをうまく制御できなかった結果紙に文字か書けない、
ロボット自体が不安定であり、まっすぐ進まない。
等があると思われるが、
その他にも今回はプログラムの不具合が多く、またスケジュール管理が甘く調整時間が短い時間しか取れなかったため、
上手い事ロボットを動かすプログラムを組むことが出来なかった。
反省として挙げられるのは、ロボット制作の適当さがあったと思われる。
左右不安定な位置に電池ボックスを置くと、重心が偏り、まっすぐ進まなくなるのに加え、
前後にも適切な位置に置かないと、後ろのモーターに繋がっていないタイヤが回りにくくなり、
適切な回転が行われないといった事態が発生する原因にもなるので、
電池ボックスの配置場所は考慮する必要があるのだと今回の課題から学んだ。
ロボットとプログラムを同時に製作することは今回が初めてであったが、
正直ロボット作りの細かさ、繊細さを少しみくびっていた所があった。
授業時間中はもちろんの事、授業時間外にも同じ班の人と協力しないと
期間中にきちんとしたロボットは作れないんだという事を強く認識させられた課題であった。