課題について

これまで住んだことのある都道府県名、市町村名、地区名などの中から2文字以上、かつ10画以上のものを選び、それをA4の紙を書くロボットを制作せよ。

書く文字について

取り組んだ2人とも愛媛に住んでいたため、地域名から「四国」を書く文字にした。

ロボットについて

文字を書くにあたり、モーターが3つあることや、プログラミングを簡単なものにするため、前後、左右、ペンの上下の3つに大きく分けた。組み立てる際、ロボットの重心、安定性に注意した。

なお初めはロボットを固定し、アームの微調整のみで字を書くロボットを模索していた。しかし、うまく作ることができなかったため断念した。

  • 全体像
robot
  • 左右に動く部分
    ロボット

モーターを回すと左右にアームが移動するように工夫をした。最初は移動とともにペンの角度も変わってしまっていた。だが、上部を支えていたものが1マスのパーツであったため不安定になっていたことが分かり、4マスのパーツにすることで改善された。

  • ペンを上下する部分
    ロボット
    ペンだけを上下に動かすことはアームとの兼ね合いで難しかったので、アームごと持ち上げるようなイメージで制作をした。モーターがまわるとギアが連動してアームが持ち上がる。

プログラミングについて

まずは初めに、どちらの漢字にも四角形があるので、上下左右に動くプログラムを#defineというサブルーチンを使ってそれぞれ定義した。

#define st OnFwd(OUT_A,50);Wait(700);Off(OUT_A);Wait(1000);
#define ba OnRev(OUT_A,50);Wait(700);Off(OUT_A);Wait(1000);
#define ri OnFwd(OUT_B,25);Wait(700);Off(OUT_B);Wait(1000);
#define le OnRev(OUT_B,25);Wait(700);Off(OUT_B);Wait(1000);

stは前進、baは後進、riはアームを手前に動かす、leはアームを奥に動かすプログラムである。

ペンを上下させるプログラムも頻繁に使うため定義をした。

#define dw OnFwd(OUT_C,23);Wait(450);Off(OUT_C);Wait(1000);
#define up OnRev(OUT_C,20);Wait(450);Off(OUT_C);Wait(1000);

dwはペンを下げる、upはペンを上げるプログラムである。

これからプログラムを紹介するが、注意してもらいたいのは移動する度にペンの上下を行っていることだ。これはペンが紙に押さえつけられて、きちんと動作しないことがあったため、それを改善するために行っている。また、すべての動作のあとにWait(1000);というう一秒待つ指示を書いている。こうすることで安定化を図った。

  • 四を書くプログラム
    dw;//四の外周を書く
    st;//左の縦線
    up;
    dw;
    le;//下の横線
    up;
    dw;
    ba;//右の縦線
    up;
    dw;
    ri;//上の横線
    up;//外周終了
    OnRev(OUT_B,30);Wait(100);Off(OUT_B);Wait(1000);//四の中の部分を書き始める,
    OnFwd(OUT_C,30);Wait(350);Off(OUT_C);Wait(1000);//ペンをつける
    OnFwd(OUT_A,50);Wait(400);Off(OUT_A);Wait(1000);//四の中にある左の縦線
    up;
    OnRev(OUT_A,50);Wait(300);Off(OUT_A);Wait(1000);
    OnRev(OUT_B,30);Wait(100);Off(OUT_B);Wait(1000);
    dw;
    OnFwd(OUT_A,50);Wait(370);Off(OUT_A);Wait(1000);///四の中にあるL字の縦部分
    OnRev(OUT_B,20);Wait(250);Off(OUT_B);Wait(1000);//横部分
  • 国を書くプログラム
    dw;//初めの外周は四のときと同じ
    st;
    up;
    dw;
    ri;
    up;
    dw;
    ba;
    up;
    dw;
    le;
    up;//外周終了
    OnFwd(OUT_A,50);Wait(250);Off(OUT_A);Wait(1000);//国の中の玉の部分を書く
    OnFwd(OUT_B,20);Wait(200);Off(OUT_B);Wait(1000);
    OnFwd(OUT_C,20);Wait(550);Off(OUT_C);Wait(1000);
    OnFwd(OUT_B,30);Wait(250);Off(OUT_B);Wait(1000);//横線1本目
    up;
    OnFwd(OUT_A,50);Wait(250);Off(OUT_A);Wait(1000);
    dw;
    OnRev(OUT_B,30);Wait(250);Off(OUT_B);Wait(1000);//横線2本目
    up;
    OnFwd(OUT_A,50);Wait(250);Off(OUT_A);Wait(1000);
    dw;
    OnFwd(OUT_B,30);Wait(250);Off(OUT_B);Wait(1000);//横線3本目
    up;
    OnRev(OUT_B,25);Wait(250);Off(OUT_B);Wait(1000);
    dw;
    OnRev(OUT_A,50);Wait(100);Off(OUT_A);Wait(1000);//玉の点部分
    up;
    OnFwd(OUT_A,50);Wait(100);Off(OUT_A);Wait(1000);
    OnFwd(OUT_B,18);Wait(300);Off(OUT_B);Wait(1000);
    dw;
    OnRev(OUT_A,50);Wait(400);Off(OUT_A);Wait(1000);//玉の縦線
    up;
  • 全体のプログラミング
    #define st OnFwd(OUT_A,50);Wait(700);Off(OUT_A);Wait(1000);
    #define ri OnFwd(OUT_B,25);Wait(700);Off(OUT_B);Wait(1000);
    #define up OnFwd(OUT_C,23);Wait(450);Off(OUT_C);Wait(1000);
    #define dw OnRev(OUT_C,20);Wait(450);Off(OUT_C);Wait(1000);
    #define le OnRev(OUT_B,25);Wait(700);Off(OUT_B);Wait(1000);
    #define ba OnRev(OUT_A,50);Wait(700);Off(OUT_A);Wait(1000);
     
    task main()
    {
        up;
        st;
        dw;
        up;
        le;
        dw;
        up;
        ba;
        dw;
        up;
        ri;
        dw;
        OnRev(OUT_B,30);Wait(100);Off(OUT_B);Wait(1000);
        OnFwd(OUT_C,30);Wait(350);Off(OUT_C);Wait(1000);
        OnFwd(OUT_A,50);Wait(400);Off(OUT_A);Wait(1000);
        dw;
        OnRev(OUT_A,50);Wait(300);Off(OUT_A);Wait(1000);
        OnRev(OUT_B,30);Wait(100);Off(OUT_B);Wait(1000);
        up;
        OnFwd(OUT_A,50);Wait(370);Off(OUT_A);Wait(1000);
        OnRev(OUT_B,20);Wait(250);Off(OUT_B);Wait(1000);
        dw;                                              //四終了
        OnFwd(OUT_A,50);Wait(1000);Off(OUT_A);Wait(1000);//国を書くため移動
        up;
        st;
        dw;
        up;
        ri;
        dw;
        up;
        ba;
        dw;
        up;
        le;
        dw;
        OnFwd(OUT_A,50);Wait(250);Off(OUT_A);Wait(1000);
        OnFwd(OUT_B,20);Wait(200);Off(OUT_B);Wait(1000);
        OnFwd(OUT_C,20);Wait(550);Off(OUT_C);Wait(1000);
        OnFwd(OUT_B,30);Wait(250);Off(OUT_B);Wait(1000);
        dw;
        OnFwd(OUT_A,50);Wait(250);Off(OUT_A);Wait(1000);
        up;
        OnRev(OUT_B,30);Wait(250);Off(OUT_B);Wait(1000);
        dw;
        OnFwd(OUT_A,50);Wait(250);Off(OUT_A);Wait(1000);
        up;
        OnFwd(OUT_B,30);Wait(250);Off(OUT_B);Wait(1000);
        dw;
        OnRev(OUT_B,25);Wait(250);Off(OUT_B);Wait(1000);
        up;
        OnRev(OUT_A,50);Wait(100);Off(OUT_A);Wait(1000);
        dw;
        OnFwd(OUT_A,50);Wait(100);Off(OUT_A);Wait(1000);
        OnFwd(OUT_B,18);Wait(300);Off(OUT_B);Wait(1000);
        up;
        OnRev(OUT_A,50);Wait(400);Off(OUT_A);Wait(1000);
        dw;                                              //国終了
    }

実際に書いてみる

robot

簡単のため筆ペンを用いた。筆圧でアームが動かしにくいこともあったが、ペンの初期位置を調整してなんとか書くことが出来た。

感想

ロボット制作は先がなかなか見えず苦戦することも多かったが、試行錯誤の繰り返しで次第にパーツの使い方を学び、なんとか完成させることができた。また、反省する点も多かった。ロボットの安定性を目指したものの、時間の都合上、結果的に不安定な形状になってしまった。 プログラミングは、ロボットの不安定な形状のため、思ったとおりに字が書けず、モーターや時間の数値を微調整することにかなり時間をかけてしまった。 今回の初めての実践を今後の活動にも活かしていきたい。


添付ファイル: fileIMG_1600.JPG 5件 [詳細] filejouge.png 5件 [詳細] filesayuu.png 3件 [詳細] filejouge.jpg 3件 [詳細] filesayuu.jpg 4件 [詳細] filezentai.jpg 5件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-07-08 (月) 21:40:40 (48d)