[[2018a/Member]]
#contents
*課題  [#qe74a3c2]
書道ロボット

出身地などの、自分にゆかりのある漢字を二文字書く!

出身は栃木県なので、『栃木』の二文字を書く。初見時は「同じ『木』が二回出てくるし簡単じゃないか…」なんて思っていたが、そんなことはなかった。難しいと実感してから、『佐野』に変えるという手もあったが、難易度も対して変わらなそうだったので栃木となった。
*ロボットについて [#g9f3f21e]
ロボットについてはいたってシンプル。ローバーにペンの上げ下げ機能を付けただけだ。
#ref(robo1 a.jpg)
#ref(robo3 u.jpg)
#ref(robo 1.jpg)
#ref(robo 2.jpg)
-OUT_Aは左車輪
-OUT_Bはペンの上げ下げ用のモーター
-OUT_Cは右車輪

…実はペンをつけてあるモーターの向きが逆なのだが、定義して使っていたのであまり関係なかった。

製作時間一時間
*プログラム [#n5fd455d]
プログラムは二個作ったので、両方とも記載する。

見やすさ重視のため一画ごとにスペースを開けている。また、定義部分も分けて記載している。

最初と最後のペンの上げ下げがあるが、先は設置時の角度に依存しないようにしてある。最後のは書き終わった万歳的なものだ。
**一つ目 [#ccb699bf]
初見で作ったもの。ペンの上げ下げ以外は、全てプログラムしてある。
 #define PEN_TIME 400
 #define penup OnRev(OUT_B,10);Wait(PEN_TIME);Off(OUT_B);Wait(PEN_TIME);
 #define pendown OnFwd(OUT_B,10);Wait(PEN_TIME);Off(OUT_B);Wait(PEN_TIME);

 task main()
 {
    penup;
 
    pendown;
    OnFwd(OUT_AC,50);Wait(400);Off(OUT_AC);//棒
    penup;
    OnRev(OUT_AC,50);Wait(200);Off(OUT_AC);
    pendown;
    OnRev(OUT_C,50);Wait(400);Off(OUT_AC);//左払い
    penup;
    OnFwd(OUT_C,50);Wait(400);Off(OUT_AC);
    pendown;
    OnFwd(OUT_A,100);OnFwd(OUT_C,20);Wait(200);Off(OUT_AC);//右払い
    penup;
 
 
    OnRev(OUT_C,80);Wait(1000);Off(OUT_AC);Wait(100);     
    OnRev(OUT_A,60);Wait(1000);Off(OUT_AC);
    OnFwd(OUT_A,50);OnFwd(OUT_C,40);Wait(700);Off(OUT_AC);Wait(200);
    OnFwd(OUT_A,90);OnFwd(OUT_C,50);Wait(700);Off(OUT_AC);
    OnRev(OUT_AC,50);Wait(1000);Off(OUT_AC);
    pendown;
    OnFwd(OUT_AC,100);Wait(300);Off(OUT_AC);//棒
    penup;
 
      //木へん
 
    OnFwd(OUT_A,30);OnFwd(OUT_C,70);Wait(400);Off(OUT_AC);
    OnFwd(OUT_C,100);OnRev(OUT_A,60);Wait(500);Off(OUT_C);
    OnRev(OUT_AC,50);Wait(1000);Off(OUT_AC);
    pendown;
    OnFwd(OUT_AC,100);Wait(300);Off(OUT_AC);
    OnFwd(OUT_A,100);OnFwd(OUT_C,30);Wait(100);Off(OUT_AC);
    penup;//たれ
   
    OnRev(OUT_C,70);Wait(500);Off(OUT_AC);
    OnRev(OUT_AC,50);Wait(800);Off(OUT_AC);
    OnFwd(OUT_C,50);Wait(1000);Off(OUT_C);
    OnFwd(OUT_A,50);Wait(1000);Off(OUT_A);
    OnRev(OUT_AC,50);Wait(170);Off(OUT_AC);
    pendown;
    OnFwd(OUT_AC,50);Wait(300);Off(OUT_AC);
    penup;//横棒
  
    OnRev(OUT_A,70);Wait(300);Off(OUT_AC);
    OnRev(OUT_C,70);Wait(300);Off(OUT_AC);
    OnFwd(OUT_AC,30);Wait(400);Off(OUT_AC);
    pendown;
    OnFwd(OUT_AC,50);Wait(100);Off(OUT_AC);
    OnFwd(OUT_A,100);OnRev(OUT_C,50);Wait(100);Off(OUT_A);
    penup;//か
   
    OnRev(OUT_C,100);Wait(500);Off(OUT_C);
    OnRev(OUT_A,100);Wait(500);Off(OUT_A);
    OnFwd(OUT_AC,100);Wait(300);Off(OUT_AC);
    pendown;
    OnFwd(OUT_A,70);OnFwd(OUT_C,50);Wait(300);Off(OUT_AC);
    penup;
 
       //栃
  
    OnFwd(OUT_A,100);Wait(500);Off(OUT_A);
    OnFwd(OUT_C,100);Wait(500);Off(OUT_C);
    OnRev(OUT_AC,70);Wait(500);Off(OUT_AC);
    pendown;
    OnFwd(OUT_AC,70);Wait(400);Off(OUT_AC);
    penup;//棒
 
    OnRev(OUT_AC,50);Wait(500);Off(OUT_AC);
    pendown;
    OnFwd(OUT_A,50);OnFwd(OUT_C,10);Wait(500);Off(OUT_AC);
    penup;//左払
 
    OnRev(OUT_A,50);OnRev(OUT_C,10);Wait(500);Off(OUT_AC);
    pendown;
    OnFwd(OUT_A,10);OnFwd(OUT_C,50);Wait(500);Off(OUT_AC);
    penup;//右払
  
    OnRev(OUT_A,70);OnRev(OUT_C,30);Wait(1000);Off(OUT_AC);
    OnRev(OUT_A,70);Wait(500);Off(OUT_A);
    OnRev(OUT_C,70);Wait(700);Off(OUT_C);
    pendown;
    OnFwd(OUT_AC,50);Wait(500);Off(OUT_AC);
    penup;
 
      //木
 
    pendown;penup;pendown;penup;
 }

書けた物
#ref(totigi.jpg)
何とか、栃木と読める…? レベルの出来だった。

難しい点は
-線の始点を合わせる
-曲線

があげられる。

製作時間 7時間
**二つ目 [#m0d5a74a]
電池の交換により、一つ目のプログラムを変えなければいけなくなった。そこで思いついたのは、回転数で制御することによって、電池やモーターの回転の速さを無視してきれいに書くことのできる、と考えた。
#ref(totigi.PNG)
紙をxy平面のよう捉え、フォントを変えるという力業で挑み始めた。図のようにカクカクだが、計画も立てた。ぬかりはない。はずだった。

 #define PEN_TIME 400  //ペンの稼働時間を定義
 #define penup OnRev(OUT_B,10);Wait(PEN_TIME);Off(OUT_B);Wait(PEN_TIME);  //ペンの上げを定義
 #define pendown OnFwd(OUT_B,10);Wait(PEN_TIME);Off(OUT_B);Wait(PEN_TIME);  //ペンの下げを定義
 #define RC ResetTachoCount(OUT_AC);  
 #define usetu OnFwd(OUT_AC,30);Wait(1050);Off(OUT_AC);OnFwd(OUT_A,30);Wait(1000);Off(OUT_A);OnRev(OUT_C,30);Wait(1110);Off(OUT_C);OnRev(OUT_AC,30);Wait(420);Off(OUT_AC);Wait(200);  //右90度旋回を定義
 #define sasetu OnFwd(OUT_AC,30);Wait(520);Off(OUT_AC);OnFwd(OUT_C,30);Wait(1400);Off(OUT_C);OnRev(OUT_A,30);Wait(420);Off(OUT_A);OnRev(OUT_AC,30);Wait(1000);Off(OUT_AC);Wait(200);  //左90度旋回を定義
 #define bi RC;RotateMotorEx(OUT_AC,20,20,0,true,true);Wait(200);  //微を定義
 #define tann RC;RotateMotorEx(OUT_AC,20,40,0,true,true);Wait(200);  //短を定義
 #define tyuu RC;RotateMotorEx(OUT_AC,20,80,0,true,true);Wait(200);  //中を定義
 #define tyou RC;RotateMotorEx(OUT_AC,20,120,0,true,true);Wait(200);  //長を定義
 #define toku RC;RotateMotorEx(OUT_AC,20,160,0,true,true);Wait(200);  //特を定義
 #define Re_bi RC;RotateMotorEx(OUT_AC,20,-20,0,true,true);Wait(200);  //逆微を定義
 #define Re_tann RC;RotateMotorEx(OUT_AC,20,-40,0,true,true);Wait(200);  //逆短を定義
 #define Re_tyuu RC;RotateMotorEx(OUT_AC,20,-80,0,true,true);Wait(200);  //逆中を定義
 #define Re_tyou RC;RotateMotorEx(OUT_AC,20,-120,0,true,true);Wait(200);  //逆長を定義
 #define Re_toku RC;RotateMotorEx(OUT_AC,20,-160,0,true,true);Wait(200);  //逆特を定義
 #define migi ResetTachoCount(OUT_AC);RotateMotor(OUT_A,50,130);RotateMotor(OUT_C,50,130);RotateMotor(OUT_AC,50,-120);Wait(200);  //短の距離分右に平行移動を定義
 #define hidari ResetTachoCount(OUT_AC);RotateMotor(OUT_C,50,130);RotateMotor(OUT_A,50,130);RotateMotor(OUT_AC,50,-120);Wait(200);  //短の距離分左に平行移動を定義

短を基準として、半分の微、二倍の中、三倍の長、四倍の特とその逆回転を定義した。また、短の距離分平行移動する、右、左を定義。またペンの場所を変えないように、90度分、右折と左折を定義した。

基本動作の最後に必ず Wait(200); がある理由としては、慣性法則が働き誤差が出ないためまでの待機時間となっている。

 task main()
 {
    penup;
 
    pendown;tyou;penup;
   
    Re_tyou;migi;bi;
    pendown;tyuu;penup;
 
    migi;migi;Re_tyuu;Re_bi;
    pendown;bi;penup;tyuu;pendown;bi;penup;
 
    hidari;tyuu;bi;
    pendown;tann;bi;penup;
 
    hidari;hidari;
    pendown;Re_tyou;penup;
 
    hidari;
    pendown;tyou;penup;
 
    usetu;
 
    tyou;
    pendown;tyuu;bi;penup;
 
    usetu;tann;bi;usetu;
    pendown;toku;bi;penup;
 
    sasetu;tann;bi;usetu;tann;
    pendown;Re_toku;Re_tann;Re_bi;penup;
 
    sasetu;tann;bi;usetu;tann;bi;
    pendown;tyuu;penup;
 
    hidari;hidari;
    pendown;Re_tyuu;penup;
 
    migi;toku;
    pendown;Re_toku;Re_tann;Re_bi;penup;
 
        //栃
 
    migi;migi;Re_tann;
    pendown;Re_toku;Re_tann;penup;
 
    usetu;hidari;tann;bi;
    pendown;tann;penup;
 
    Re_toku;Re_tann;
    pendown;tann;penup;
 
    sasetu;
    pendown;tyuu;penup;
 
    usetu;
    pendown;tyou;penup;
 
    usetu;
    pendown;tyuu;penup;
 
    hidari;Re_tyou;usetu;
    pendown;toku;bi;penup;
 
    pendown;penup;pendown;penup; 
 
       //木
 }
最初に前後進、90度旋回、平行移動を定義し、それを組み合わせるだけという定義以外は簡単なプログラミングだ。わかりやすく言うと、いわゆるテトリスで栃木の字を作るだけだ。書き順など無視していて、説明のしようがないので、書き順は示さない。

結論からして、一つ目よりもひどい出来となった。

問題点としては
-旋回がきれいに90度回っていない⇒なぜか回転数でプログラミングすると、エラーが出たので仕方なく時間にしていた。
-ペンがしっかり固定されていないため⇒本体が軽いため、ペンを力強く振り下ろすとペンがずれる

があげられる。

製作時間 8時間
*振り返り [#z3889019]
今回では初めて本格的なプログラミングというものをした。紅茶をきめて脳を殺しながら、ご飯も抜き、ひたすら画面とロボと向かい合っていた。はっきり言って苦行だった。10時間近くあった作業用BGMが一周してるかのような錯覚に至っていた。そんな小並な感想は置いといて、真面目に移行する。

今回の課題から学んだことは
-正確なロボを作ること
-誤差がでないプログラミングにすること

が重要ということだ。今回のようなxy座標として作る、コピー機のようなほうが簡単というが、それは本当だろう。理由としては90度を正確にプログラミングしなくてもいいというところだろう。

今回は惨敗してしまったが、次このようなことがある時にはうまく成し遂げたい。軽くトラウマなのでそもそも、そんな状況にしないかもしれないが…

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