目次
課題1については,2019a/Mission1を参照してください.
岐阜県にある「高山」という地名を選びました.
ロボットの全体像は以下の写真のようです.ロボットは大きく分けて3つの部分に分かれています.それぞれの部分について説明をしていきます.
ロボットの前後に動く部分はタイヤで動いています.タイヤは,ロボット全体のバランスを保つために前に1つ,真ん中に2つ(駆動輪),後ろに1つの計4輪ついています.そのうち,前と後ろにあるタイヤは駆動しません.真ん中にある2輪が駆動するようになっています.1本の車軸で2つの車輪をつなぐことによって,1つのモーターで同時に2輪を駆動できます.それによって,左右の偏りなく移動できると考えました.また,モーターと車軸の間にギアをかませることによって移動スピードを落とし,細かい動きもできるようにしました.
左右に動く部分は主にギアとラック(ギザギザのパーツ)によって構成されています.主な仕組みは,ギアが回転することによって下のラックが直線的に動きます.これによって,回転運動であるモーターから直線運動を取り出すことができます.これにより,ペンを取り付けたラックアームが左右に動きます.
ポイントとしては,ラックの幅の倍のブロックを用いてラックアームを作ることによって安定性を高めました.また,ラックアームの両側を支えるブロックに軸を通しラックアームが滑らかに動きかつ,安定するようにしました.
上下に動く部分は左右に動くラックアームの上に載っています.モーターの回転によって,ペンアーム(ペンのついた黄色のアーム)が上下に動きます.モーターとペンアームの重さはラックアームにつけるには重すぎるものになってしまいました.そのため,モーターとペンアームを左右別々に配置してやじろべえのような形にしました.また,単純に中心から同じ距離に配置してもバランスが悪かったのでモーター側のラックアームを短くしてよりバランスがとれるようにしました.ペンアームの駆動部分は,ギアを多くかみ合わせることによりゆっくりと可動するようにしました.
プログラムは大きく分けて3つの部分に分けられます.
まず,変数tを定義します.変数を用いることで同じ動作で時間が異なるときにも簡単に変更できます.
int t;
次にサブルーチンを定義します.サブルーチンは,関数と違ってコンパイル時に展開されないので,プログラムのサイズが関数に比べ小さくなるので今回はサブルーチンを用います.
まず,前に進むサブルーチン
sub go_ahead() {OnRev(OUT_A);Wait(t);Off(OUT_A);Wait(50);}
次に,後ろに進むサブルーチン
sub go_back() {OnFwd(OUT_A);Wait(t);Off(OUT_A);Wait(50);}
左から,右に進むサブルーチン
sub draw_LtoR() {OnRev(OUT_B);Wait(t);Off(OUT_B);Wait(50);}
右から,左に進むサブルーチン
sub draw_RtoL() {OnFwd(OUT_B);Wait(t);Off(OUT_B);Wait(50);}
ペンを上げるサブルーチン
sub pen_up() {OnRev(OUT_C);Wait(30);Off(OUT_C);Wait(50);}
ペンを下げるサブルーチン
sub pen_down() {OnFwd(OUT_C);Wait(30);Off(OUT_C);Wait(50);}
ここから,「高」を書くプログラムです.書き順は下の画像の通りです.
pen_downとpen_upの間はペンが下がっており,紙に書いています.ポイントとしては,3画目と4画目を同じ図形にして同じプログラムを使い,簡略化をしました.また,5画目の最後には跳ねを付けました.
task main() { pen_down();t=80;draw_LtoR();pen_up(); t=40;draw_RtoL();t=8;go_ahead(); pen_down();t=5;go_back();pen_up(); t=8;go_back();t=20;draw_RtoL(); pen_down();t=40;draw_LtoR();t=10;go_back();t=40;draw_RtoL();t=13;go_ahead();pen_up(); t=20;go_back(); pen_down();t=40;draw_LtoR();t=10;go_back();t=40;draw_RtoL();t=13;go_ahead();pen_up(); t=20;draw_RtoL();t=20;go_back(); pen_down();t=25;go_ahead();t=80;draw_LtoR();t=25;go_back();t=10;draw_RtoL();pen_up(); t=40;draw_RtoL();t=10;go_back();
次は,「山」を書くプログラムです.書き順は下の画像の通りです.
pen_down();t=30;go_back();pen_up(); t=40;draw_RtoL();t=10;go_ahead(); pen_down();t=7;go_back();t=90;draw_LtoR();t=13;go_ahead();pen_up(); }
完成した作品は,以下の画像です.
※山の右側の線は,プログラムを実行して書いたものではありません.
全体のバランスは、良くできたと思います.横画は、きれいな直線を描けました.しかし,ところどころ隙間があったり,縦画の線が曲がってしまったりしてしまいました.また,ペンが上下するときに,余計な縦線が入ってしまいました.
ペンが紙に対して回転するように上下していました.しかし,それを垂直に上下するようにできれば書きはじめと書き終わりのはねを無くせたと思います.
縦画の直線がキレイになるように2輪をひとつのモーターで回転させましたが実際には曲がってしまいました.(特に,「高」の四角の部分)その部分を改善できるとより良かったと思います.