目次
・A4の紙に松本の大学生活を表す漢字1文字を書くロボットを制作する。
・7画以上の文字であること。
・15cm四方に収まる大きさであること。
大学生活が始まってから、晩御飯に貝が入った味噌汁が度々出たので「貝」という漢字を選んだ。
本体は、最初に組み立てたモデルをベースとして作った。また重心が低くなるようにし、できるだけ不安定にならないように組み立てた。
モーターにペンを固定させ、モーターの回転によってペンを上げ下げさせた。
実際の書き順とは異なる
・自分たちが組み立てたロボットは右のタイヤと左のタイヤの回転数が違ったので、それぞれのタイヤの出力を変えることで同じ回転数にした。
・動作の間に1秒間停止させることで誤差が起きないようにさせた。
・90度曲がる際に、曲がる時の秒数と元に戻る秒数が異なったのでそれぞれを別に定義した。
・貝の漢字の長い線と短い線をひとまとまりにし、それを繰り返すことでプログラムを簡略化した。
#define SPEED 50//ペンの上げ下げ、左タイヤの出力 #define SPEED_R 47//右タイヤの出力 #define TIME_PEN 90//ペンを上げ下げする時間 #define MOVE_TIME_L 500//長い線の書く時間 #define MOVE_TIME_S 350//短い線の書く時間 #define TURN 520//曲がる時の時間 #define TURNX 540//元に戻る時間
・長い線を書くプログラム
長い線を書いた後、初期位置まで戻る
#define long_line OnFwd(OUT_A,50);Wait(TIME_PEN);Off(OUT_A);Wait(1000);\ OnRev(OUT_B,SPEED_R);OnRev(OUT_C,SPEED);Wait(MOVE_TIME_L);Off(OUT_BC);Wait(1000);OnRev(OUT_A,50);\ Wait(TIME_PEN);Off(OUT_A);Wait(1000);OnFwd(OUT_B,SPEED_R);OnFwd(OUT_C,SPEED);Wait(MOVE_TIME_L);Off(OUT_BC);Wait(1000);
・短い線を書くプログラム
短い線を書いた後、初期位置まで戻る
#define short_line OnFwd(OUT_A,50);Wait(TIME_PEN);Off(OUT_A);Wait(1000);\ OnFwd(OUT_B,SPEED_R);OnFwd(OUT_C,SPEED);Wait(MOVE_TIME_S);Off(OUT_BC);Wait(1000);OnRev(OUT_A,50);\ Wait(TIME_PEN);Off(OUT_A);Wait(1000);OnRev(OUT_B,SPEED_R);OnRev(OUT_C,SPEED);Wait(MOVE_TIME_S);Off(OUT_BC);Wait(1000);//
・短い線を書く時の横移動のプログラム
左に90度旋回→前進→右に90度旋回
#define turn_s OnFwd(OUT_B,SPEED_R);OnRev(OUT_C,SPEED);Wait(510);\ Off(OUT_BC);Wait(1000);OnFwd(OUT_B,SPEED_R);OnFwd(OUT_C,SPEED);Wait(185);Off(OUT_BC);Wait(1000);OnFwd(OUT_C,SPEED);\ OnRev(OUT_B,SPEED_R);Wait(530);Off(OUT_BC);Wait(1000);//
task main()//メイン { long_line;//一画目 OnFwd(OUT_C,SPEED);OnRev(OUT_B,SPEED_R);Wait(TURN);Off(OUT_BC);//右に90度旋回 Wait(1000); OnFwd(OUT_B,SPEED_R);OnFwd(OUT_C,SPEED);Wait(350);Off(OUT_BC);//右の長い線まで移動 Wait(1000); OnFwd(OUT_B,SPEED_R);OnRev(OUT_C,SPEED);Wait(TURNX);Off(OUT_BC);//左に90度旋回(元の向き) Wait(1000); long_line;//二画目 OnFwd(OUT_B,SPEED_R);OnFwd(OUT_C,SPEED);Wait(700);Off(OUT_BC); // Wait(1000); // OnFwd(OUT_B,SPEED_R);OnRev(OUT_C,SPEED);Wait(TURNX);Off(OUT_BC); // Wait(1000); // OnRev(OUT_B,SPEED_R);OnRev(OUT_C,SPEED);Wait(650);Off(OUT_BC); //ペン先を短い線の書き出しに揃える Wait(1000); repeat(3){ short_line;//三画目、四画目、五画目 turn_s; } short_line;//六画目 OnFwd(OUT_B,SPEED_R);OnFwd(OUT_C,SPEED);Wait(850);Off(OUT_BC);//短い線の真ん中まで移動 Wait(1000); OnFwd(OUT_B,SPEED_R);OnRev(OUT_C,SPEED);Wait(260);Off(OUT_BC);//左に45度旋回 Wait(1000); OnRev(OUT_B,SPEED_R);OnRev(OUT_C,SPEED);Wait(500);Off(OUT_BC);//後退(書き出しを揃える) Wait(1000); OnFwd(OUT_A,50);Wait(TIME_PEN);Off(OUT_A);//ペンを下ろす Wait(1000); OnFwd(OUT_B,SPEED_R);OnFwd(OUT_C,SPEED);Wait(200);Off(OUT_BC);//七画目 Wait(1000); OnRev(OUT_A,50);Wait(TIME_PEN);Off(OUT_A);//ペンを上げる Wait(1000); OnFwd(OUT_B,SPEED_R);OnFwd(OUT_C,SPEED);Wait(450);Off(OUT_BC);//短い線の真ん中まで移動 Wait(1000); OnFwd(OUT_B,SPEED_R);OnRev(OUT_C,SPEED);Wait(TURNX);Off(OUT_BC);//左に90度旋回 Wait(1000); OnRev(OUT_B,SPEED_R);OnRev(OUT_C,SPEED);Wait(500);Off(OUT_BC);//後退(書き出しを揃える) Wait(1000); OnFwd(OUT_A,50);Wait(TIME_PEN);Off(OUT_A);//ペンを下げる Wait(1000); OnFwd(OUT_B,SPEED_R);OnFwd(OUT_C,SPEED);Wait(200);Off(OUT_BC);//八画目 Wait(1000); OnRev(OUT_A,50);Wait(TIME_PEN);Off(OUT_A);//ペンを上げる }
全体として見るとだいぶ整った形に仕上がった。だが、小さいタイヤの向きによって2画目の線がぶれてしまったり、3画目が2画目の端とピッタリ合わなかったりするなど、まだ改善する必要がありそうだ。
初めてのプログラムだったので大文字にし忘れたり、セミコロンを付け忘れたりするなど、最初は失敗することが多かった。また、調整を重ねていくうちに電池が消耗してモーターの回転数が変わってしまい、何度も秒数を調整しないといけなくて大変だった。だけどその分やりがいもあって、最終的にはそれなりにうまくいったので良かったと思う。