[[2017a/Member]]
5月31日 14:40 プログラムの字下げをしました
目次
#contents
*Mission1 [#aad87d9a]
大学生活を表す漢字一文字を書かせるとのことでアパートと大学が近いことから、「近」を描くことに決めた。
*本体について [#zce957cf]
本体は小回りを利かせるために標準形の横幅を少し短くした。
本体と赤外線塔セットで30㎤の箱に収まるサイズなにで紙とこのロボットさえあればどこでも「近」が描ける。(分解する必要がなかったので持ち運びが楽。)
*書く機構について [#y4349824]
書く機構は写真のように車体の中心にボールペンを設置した。車体の中心に書く機構を置くことで旋回時の誤差を約半径1cmに抑えることができた。中心に穴の開いた板ブロックを上下2枚設置してペンを通して固定。さらにその上に穴の開いていな板ブロックを被せ、輪ゴムで押し付けることで、ペンと紙面が接する状態にする。一番上の板ブロックの上げ下げの機構には板状のギアを使用した。
書く機構は写真のように車体の中心にボールペンを設置した。車体の中心に書く機構を置くことで旋回時の誤差を約半径1cmに抑えることができた。中心に穴の開いた板ブロックを上下2枚設置してペンを通して固定。さらにその上に穴の開いていな板ブロックを被せ、輪ゴムで押し付けることで、ペンと紙面が接する状態にする。ペンを上げたいときだけ、モータを使えばよいので電圧による誤差は小さくできたと思う。また一番上の板ブロックの上げ下げの機構には板状のギアを使用した。
実際の動作は3枚目の画像のように動く。(ペンを固定している板ブロックは省略している。)

&ref(2017a/Member/tsukuzin/Mission1/s_kikou3.png,50%,);
&ref(2017a/Member/tsukuzin/Mission1/s_kikou2.png,50%,);
&ref(2017a/Member/tsukuzin/Mission1/penkikou.gif,100%,);
***書く機構の失敗作について [#c0d7e677]
最初は画像のような機構を考えていたが、旋回時の誤差が考えていたよりも大きくプログラミングでの調整が難しくなったので変更をした。
&ref(2017a/Member/tsukuzin/Mission1/s_shippaisaku.png,50%,);
*プログラムについて [#q368940a]
***使用した関数 [#g14a2a06]
 #define mae_susumu(f) OnFwd(OUT_AC);  Wait(f); Off(OUT_AC); //fの値だけ進む
 #define mae_susumu_up(f) OnFwd(OUT_AC); OnRev(OUT_B); Wait(f); Off(OUT_ABC); //ペンを上げてfの値だけ進む
 #define ushiro_sagaru(y) OnRev(OUT_AC); Wait(y); Off(OUT_AC); //yの値だけ後ろに進む
 #define ushiro_sagaru_up(y) OnRev(OUT_ABC); Wait(y); Off(OUT_ABC); //ペンを上げてyの値だけ後ろに進む 
 #define senkai_migi_up(g) OnFwd(OUT_A); OnRev(OUT_BC); Wait(g); Off(OUT_ABC); //ペンを上げてgの値だけ右旋回する
 #define senkai_hidari_up(h) OnFwd(OUT_C); OnRev(OUT_AB); Wait(h); Off(OUT_ABC); //ペンを上げてhの値だけ左旋回する
 #define senkai_migi(g) OnFwd(OUT_A); OnRev(OUT_C); Wait(g); Off(OUT_AC); //gの値だけ右旋回する
 #define senkai_hidari(h) OnFwd(OUT_C); OnRev(OUT_A); Wait(h); Off(OUT_AC); //hの値だけ左旋回する
関数名は誰が見てもわかりやすいように名前を付けた。Bモーターを作動させていない状態だと、常にペンが紙にあたってしまうので、ペンを上げて進む関数とペンを下げて進む関数2パターンを用意した。関数名も「_up」を末尾につけるだけでいいので簡単にプログラムができる。

***プログラム本体について [#o241eadf]
 task main ()
 { 
   Wait(200); // 準備時間
   ichikaku_me();
   nikaku_me();
   sankaku_me();
   Wait(40); //車体のバランスが崩れるので間を入れる
   yonkaku_me();
   gokaku_me_idou();
   gokaku_and_rokukaku_me();
   nanakaku_me();
 }
上のように、「task main」はサブルーチンを使用しているので簡潔になっている。
「車体のバランスが崩れるので間を入れる」についての反省点は[[こちら>#a12345]]で説明している。
**各サブルーチンについて [#w245c2da]
*1画目 [#kaee0267]
 sub ichikaku_me()
 {
     mae_susumu(16);
 }
一画目は点を打つだけ
*2画目 [#hc14847c]
 sub nikaku_me()
 {
    senkai_migi_up(100);
    mae_susumu_up(30);
    senkai_hidari_up(140);
    mae_susumu(21); //本来はこのまま続けてるが、ロボットのうごきが複雑なのでここで2画目とする
 } 
最初の3行までのプログラムは旋回時の誤差を修正するための動作である。この動作の理由については[[こちら>#a1123]]で説明している。またコメント分にあるように動きが複雑で調整が難しくなりそうだったのでここで2画目とした。
*3、4画目 [#u9df7910]
 sub sankaku_me() //
 {
    mae_susumu_up(13);
    senkai_migi_up(200);
    Wait(30); //反動で車体が浮くので間を入れる
    mae_susumu(31);
    senkai_hidari_up(200);
    ushiro_sagaru(15);
    Wait(30); //反動で車体が浮くので間を入れる
    mae_susumu(20);
    senkai_hidari_up(36);
    Wait(30); //反動で車体が浮くので間を入れる
    ushiro_sagaru(40);
 }
 sub yonkaku_me()
 {
    mae_susumu_up(10);
    Wait(30); //反動で車体が浮くので間を入れる
    senkai_migi_up(70);
    mae_susumu(86); //しんにょう終わり
 }
3画目はカクカク細かく動くので、間隔を入れないと倒れてしまう。この点の反省については[[こちら>#a12345]]
*5、6、7画目 [#hdee8e52]
 sub gokaku_me_idou()
 {
    senkai_hidari_up(130);
    mae_susumu_up(55);//5画目の開始地点移動へ
    senkai_hidari_up(100);
    mae_susumu_up(25);
    senkai_migi_up(100);
 }
 sub gokaku_and_rokukaku_me()
 {
    senkai_migi_up(70);
    ushiro_sagaru(23);
    Wait(30); //反動で車体が浮くので間を入れる
    mae_susumu_up(9);
    Wait(30); //反動で車体が浮くので間を入れる
    senkai_hidari_up(60);//ここから6画目
    ushiro_sagaru(25);
    Wait(30); //反動で車体が浮くので間を入れる
    mae_susumu(18);
 }
 sub nanakaku_me()
 {
    senkai_hidari_up(110);
    ushiro_sagaru_up(9);
    Wait(30); //反動で車体が浮くので間を入れる
    ushiro_sagaru(23);
    Wait(30); //反動で車体が浮くので間を入れる
    mae_susumu_up(13)
    Wait(30); //反動で車体が浮くので間を入れる
    senkai_hidari_up(110);
    ushiro_sagaru(10);
    Wait(30); //反動で車体が浮くので間を入れる
    mae_susumu(30);
 }
「gokaku_me_idou」の調整でつくりが斜めになったり、変な位置に書かれてしまったりと大変だった。
5、6、7画目も誤差の修正などの細かな動作が多い。
*完成した文字 [#le68214d]

&ref(2017a/Member/tsukuzin/Mission1/近333.png,50%,画像の説明);
&ref(2017a/Member/tsukuzin/Mission1/近444.png,50%,);

左の「近」はもっともきれいな形で書いてくれた時の写真。ただ、ボールペンの調子があまりよくなくて、かすれてしまっている。(撮影時に影になってしまったので見やすくなるように加工をしている)
右は発表会当日調整前に書いた時の写真。つくりが傾いてしまったことが残念だった。
*旋回時の誤差について [#a1123]
まずこのロボットの旋回時の誤差は約半径1僂納,硫菫のようになる。

&ref(2017a/Member/tsukuzin/Mission1/誤差説明.gif,100%,);



赤い線を引きたいとき、誤差を考えずにプログラムを作ると次のようになる。


&ref(2017a/Member/tsukuzin/Mission1/誤差説明1.gif,100%,);

青い線が実際書かれるもので、変な形になってしまう。


次に誤差を考えて少しだけロボットを余分に進ませてから旋回させると次のようになる。


&ref(2017a/Member/tsukuzin/Mission1/誤差説明2.gif,100%,);

画像のように綺麗にかけるようにするためには細かい調整が必要だったが、誤差を小さく収められたので、そこまで大変ではなかった。
***間隔を入れた理由について [#a12345]
書く機構を車体の中心に設置したことで誤差を小さくすることが出来たが、機構の上にリモコンを乗せなければならないため、写真のように
でっかちになってしまった。そのため素早い前後の動作をするとずっこけてしまう。横にリモコンを付ける考えも浮かんだが、モーターとリモコンをつなぐコードの長さが足らなくなってしまったり、左右で重さが変わりうまく前進、後進ができなくなる。パランスについて今後も問題が発生したら今回の経験を生かして、解決していきたい。
&ref(2017a/Member/tsukuzin/Mission1/s_kikou1.png,50%,);
***感想 [#f3f8b038]
初めてプログラミングをやってみて、サブルーチンや関数を使うと動作が簡単に処理できることを知った。人が難なくしている動作をロボットにさせるのは想像していたよりも難しくて大変だった。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS