2017a/Member

目次

課題

今回の課題は書道ロボットの作成である。主な条件は"七角以上の漢字選ぶこと,A4サイズの用紙の15センチ四方に収まるように描くこと"である。

私は、松本は空が非常に綺麗であり空港もあることから「空」という漢字を書くことにした。

ロボットに書かせるので可能な限り素早く、正確に書けるようにすることを目標に制作した。

ロボット本体について

機体全般について

私達のロボットは小回りをきかせるために機体を縦にし、タイヤを2つにすることにより回転などの動作をスピーディーにしようと考えた。

タイヤを2つにしたことによりそのままではバランスをとることができないので、支点を作り重心を後ろにすることで機体のバランスが取れるようにしてある。機体の後ろにキャスターをつけることも試してはみたが車体の動作が速いうえに、前方のタイヤとの距離が近いためキャスターが車体の動きについていかなかったのでうまく動作しなかった。支点のままでは大きい段差があると引っかかってしまうことがあり、できるだけ段差が少なく摩擦の小さい面で書かなければならないという問題も生じたが、支点にすることでペンと紙の高さを確保できるという利点(詳しくはこちらを参照)があったのでこれを採用した。

前方からの写真 後方からの写真

前方(上左)と後方(上右)の写真

ロボットは以下の3つのパーツに分けて制作してある。これにより持ち運び、改良がしやすくなり電池交換も容易だった。

本体 支点 アーム

車体

車体はタイヤを2つつけ、それぞれにモータを備えている。タイヤを2つにし、機体を縦にすることで右折や左折、回転がスピーディーにできるようになっている。また、それにより本体の軽量化にも成功した。

最初は機動力を高めるためにモーターとタイヤをそのまま組み合わせて作ってみたがそのままでは速度が速すぎてプログラムで制御するのが難しく、また、動いた時の反動で機体のバランスが取れずに倒れてしまうことがあった。それを改善するためにギア比を下げ、機体の速度を落とす方法を用いた。それにより安定感が得られ動作も急発進、急停車がなくなったのでスムーズに書くことができるようになった。

640×342,車体の画像

ペンのアーム

ペンのアームの部分にモーターを組み合わせてペンが上げ下げできるようにした。ペンは短い軸とゴムを使って固定している。そのままでは必要以上に速く動きすぎるのでギア比を下げて、上げ下げを少し遅くしてある。また、それにより反動を少なくすることにもつながった。

ペンを地面につけたときはペンの重力により常に紙と接触するようになったのでペンを紙に押さえつける仕組みを作る必要はなかった。しかし、当然のことだがペンを上げた時も重力で下がってしまい意図しないうちに紙と接触してしまうことがあった。それは機体の重心を後ろにしたことによって機体が地面と垂直ではなく、少し角度ができたのアームの先のペンと紙との高さが大きくなったのでペンを上げる高さをある程度確保できたことにより改善された。このこともあり本体につけた支点の構造は欠かせないものとなっている。

ペンのアーム

書き順について

書き順

書き順は正しいものではなくできるだけ効率よく、正確に書くことができる順番にした。前進しながら書いた時と、後退しながら書いた時では線の強さに違いが出てしまうことが分かった。(こちらを参照)前進しながら書くほうがはっきりした線が書くことができることが分かったので、すべての線を前進しながら書くようにした。

プログラムについて

主に用いる前進や回転の動作をマクロにした。最初にプログラムを書くときにウ冠の部分とその他の部分に分けて記述し、それぞれについて調整してからそれらのプログラムをつなげて字を作るという方法を用いたのだが、分けたプログラムをサブルーチンにしてしまえばもっとプログラム本体を簡潔にすることができたのではないかと今更ながら思った。

#define PEN 15    //ペンを上げ下げする時間を定義
#define pen_down OnRev(OUT_B);Wait(PEN);Off(OUT_B);    //ペンを下げる
#define pen_up OnFwd(OUT_B);Wait(PEN);Off(OUT_B);    //ペンを上げる

ペンの動作に関する定義。 ペンの上げ下げの時間を15/100秒に固定した。これは、様々な時間を試した結果、この時間によりペンは確実に紙につけることができ、また、持ち上げた時も紙との距離を保つことができることが分かったからである。 ペンの動作はマクロを使用した。

#define go_forward(t) OnFwd(OUT_AC);Wait(t);Off(OUT_AC);     //前進_時間変更可能
#define go_back(s) OnRev(OUT_AC);Wait(s);Off(OUT_AC);     //後退_時間変更可能

前進と後退のマクロ。時間の変更を可能にし、各辺の長さと全体のバランスを考えながらそれぞれの動作する時間を決められるようにした。しかし、一つ一つの動作に時間を決める必要があったので修正するとき変更する部分が多くなり大変だった。

#define turn_right OnFwd(OUT_C);OnRev(OUT_A);Wait(95);Off(OUT_AC);          //その場で右折
#define turn_left OnFwd(OUT_A);OnRev(OUT_C);Wait(92);Off(OUT_AC);          //その場で左折

90度の右折と左折のマクロ。片方のタイヤを固定するのではなく、それぞれのタイヤを逆向きに動かすことにより小回りがきくようになっている。

#define turn_left1(l) OnFwd(OUT_A);OnRev(OUT_C);Wait(l);Off(OUT_AC);        //左折_時間変更可能
#define turn_right1(u)OnFwd(OUT_C);OnRev(OUT_A);Wait(u);Off(OUT_AC);        //右折_時間変更可能

これは右折と左折の角度が変えられるようにしたマクロである。機体が動き回って字を書くので左右のタイヤのモーターの強さの違いによりどうしても曲がってしまうことがあったので、それを修正するために用いた。これにより角度の微調整がとても簡単にできるようになった。

task main()
{
    int count;//七画目で用いる変数を宣言
    pen_up;//書き始め準備
    Wait(10);
    pen_down;

    go_forward(20);//一画目
    pen_up;
  
    go_forward(190);//二画目に移動
    turn_right1(5);//前進によって曲がった角度を修正
    turn_right;
    go_back(41);
    turn_right;
  
    pen_down;  //二画目
    go_forward(25);
    pen_up;

    go_forward(37);//三角目に移動
    turn_right;
    go_back(130);


    pen_down;//三角目
    go_forward(80);
    pen_up;

    go_forward(40);//四画目に移動
    turn_right;
    go_back(123);

    pen_down;//四画目
    go_forward(25);
    pen_up;


    go_forward(45);//五角目に移動
    turn_right;
    go_back(120);

    pen_down;//五角目
    go_forward(20);
    pen_up;

    go_forward(44);//六角目に移動
    turn_right;
    go_back(125);

    pen_down; //六角目
    go_forward(20);
    pen_up;

    go_forward(172); //七角目に移動
    turn_left; 
    go_forward(115);
    turn_left;
    pen_down;  //七角目

    OnFwd(OUT_C);
    for(count=0;count<12;count++){
        OnFwd(OUT_A);
        Wait(1);
        Off(OUT_A);
        Wait(1);
    }
    Off(OUT_AC);
    pen_up;

七画目は左のタイヤをそのまま前進させ、右のタイヤはfor文を使用して1/100秒ごとにモーターのオンとオフを切り替える動作を繰り返すプログラムを組むことにより左のタイヤに比べて速度を落とした。これにより普通に右折するときよりも緩やなカーブを描くことに成功した。

    go_forward(130);//八画目に移動
    turn_left1(89);//角度を直角に合わせる
    go_back(40);

    pen_down; //八画目
    go_forward(65);
    pen_up;    

    go_forward(10);//九角目に移動
    turn_left1(90);//誤差を修正
    Wait(20);//少し間を開ける
    go_forward(124);
    turn_left1(90);//誤差を修正
    Wait(20);
    turn_left1(95);//誤差を修正するために少し角度を大きくした左折
    Wait(10);

    pen_down; //九角目
    go_forward(25);
    pen_up;

    go_forward(122); //十角目に移動
    turn_right;
    go_forward(75);
    turn_right1(100);//誤差を修正
    Wait(20);
    turn_right1(95);//誤差を修正
    pen_down; //十角目
    go_forward(65);
    pen_up;//完成!!!!!!!
    
}

先述の理由のより、すべての線を前進しながら書くことにしたので曲がる動作が非常に多くなってしまい、それに伴い回転による誤差が多くなってしまったので調整が非常に難しかった。 連続して曲がったりすると回転による誤差が生じることが多かったので、一部、動いた後に少し止まる動作を組み込んだりもしたが、誤差をなくすことはできなかった。

書き終わった位置にペン先を合わせるように角度を90度変えた状態で戻ってくるサブルーチンを作ればもっと修正が簡単にできたのではないかと思う。

まとめ

完成した文字

すべて前進しながら書いたもの 後退もしながら書いたもの

右の写真は三、六、九画目に後退しながら書くことを取り入れたもの。ほかの線と比べると線の違いが一目瞭然であるだろう。先述したように私は線の強さを統一したかったのですべての線を前進しながら書くことにした。

左はすべての線を前進しながら書いたものである。電圧降下による誤差の調整は大変であったが微調整を繰り返した甲斐があって綺麗な字を書くことができた。

問題点・課題

発表の直前に電池が切れてしまい電池を交換したことにより電圧が変わりモーターの出力が変わってしまったので当日はうまく字を書くことができなかった。

電池の電圧降下による出力の違いにより毎回ズレが生じるので調整が非常に難しかった。次回の課題からはこのことを考慮してロボットの制作をするとともに、可能であればこの問題を解決したい。

また、サブルーチンなどを使用すればプログラムの中身をもう少し工夫できたのではないかと思うので次回はプログラムをわかりやすく簡潔に記述することも目指したいと思う。

感想

前回は四輪のロボットを制作したので今回は機体を立ててみようということからこの形のロボットを制作することにした。ロボットが動き回って字を書くので調整が非常に難しく大変ではあったが、繰り返すうちに字になってくるのが楽しく、最終的に正確に字を書くことができたときは達成感があった。次回の課題では今回の課題などを踏まえて、ロボットの制作をしたい。


添付ファイル: fileIMG_10.jpg 64件 [詳細] fileIMG_09.jpg 66件 [詳細] fileIMG_06.jpg 63件 [詳細] fileIMG_07.jpg 72件 [詳細] fileIMG_04.jpg 71件 [詳細] fileIMG_08.jpg 77件 [詳細] fileIMG_03.jpg 68件 [詳細] fileIMG_02.jpg 72件 [詳細] fileIMG_01.jpg 82件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-08-10 (木) 23:04:52 (737d)