[[2018a/Member]]
#contents
書道ロボット 
*課題  [#qe74a3c2]
出身地などの漢字を二文字書く!

出身は栃木県なので、『栃木』の二文字を書く。初見時は「同じ『木』が二回出てくるし簡単じゃないか…」なんて思っていたが、そんなことはなかった。
出身は栃木県なので、『栃木』の二文字を書く。初見時は「同じ『木』が二回出てくるし簡単じゃないか…」なんて思っていたが、そんなことはなかった。難しいと実感してから、『佐野』に変えるという手もあったが、難易度も対して変わらなそうだったので栃木一本となった。
*ロボットについて [#g9f3f21e]
ロボットについてはいたってシンプル。ローバーにペンの上げ下げ機能を付けただけだ。
-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;
 }
何とか、栃木と読める…? レベルの出来だった。

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

があげられる。このことを踏まえ二つ目のプログラムを作り始める。

製作時間 7時間
**二つ目 [#m0d5a74a]
 task main()
電池の交換により、一つ目のプログラムを変えなければいけなくなった。そこで思いついたのは、回転数で制御することによって、電池やモーターの回転の速さを無視してきれいに書くことのできる、と考えた。紙を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度旋回、平行移動を定義し、それを組み合わせるだけという定義以外は簡単なプログラミングだ。

 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が一周してるかのような錯覚に至っていた。

学んだことは
-正確なロボを作ること
-誤差がでないプログラミングにすること

が重要ということだ。

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


トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS