*目次 [#udb32381]
#contents

*課題の説明 [#rfbacc4b]
-NXTのみを使ってA4用紙に漢字1文字を書け。
-なお書く漢字は、自分の氏名に含まれる7画以上のものとする。

*ロボットの説明 [#h1d59244]
**本体 [#rc6a1c1f]
&ref(./image[1].jpeg,20%);

本体には3つのモータを使用。

その内2つは左右のタイヤに接続されており、NXTの移動を担当している。

残る1つは、後述するアームの上下を担当している。
**アーム [#g65934bd]
&ref(./image[2].jpeg,20%);

上の画像のものが、アームである。

&ref(./image[4].jpg,30%);

画像のように、モータが動くことでペンが上下する仕組みとなっている


*計画 [#ebed049c]
&ref(./tou.png,70%);

我々の班は漢字を縦と横と左右斜め45度の、4種類の直線で表せると考えた。

そう考えることで、単純なマクロを複数用意することでプログラミングが容易になると考え、その方針で今回の課題に取り組んだ。

理想的なマクロをつくり、NXTが理想的に動けば、上の画像の通りのものが完成するはずである。

*プログラム [#g65ef00a]
 #define onecm RotateMotorEx(OUT_BC,50,18,0,true,true);     //1cm前進//
 #define twocm RotateMotorEx(OUT_BC,50,37,0,true,true);     //2cm前進//
 #define threecm RotateMotorEx(OUT_BC,50,56,0,true,true);    //3cm前進//
 #define fourcm RotateMotorEx(OUT_BC,50,77,0,true,true);     //4cm前進//
 #define fivecm RotateMotorEx(OUT_BC,50,99,0,true,true);     //5cm前進//
 #define sevencm RotateMotorEx(OUT_BC,50,142,0,true,true);    //7cm前進//
 #define eightcm RotateMotorEx(OUT_BC,50,163,0,true,true);     //8cm前進//
 #define tencm RotateMotorEx(OUT_BC,50,204,0,true,true);       //10cm前進//
 #define fifteencm RotateMotorEx(OUT_BC,50,308,0,true,true);   //15cm前進//
 #define left45 RotateMotorEx(OUT_BC,50,201,0,true,true);Off(OUT_BC);Wait(300);RotateMotorEx(OUT_BC,50,88,-100,true,true);Off(OUT_BC);Wait(300);RotateMotorEx(OUT_BC,-50,203,0,true,true);//左に45度回転//
 #define left90 RotateMotorEx(OUT_BC,50,203,0,true,true);Off(OUT_BC);Wait(300);RotateMotorEx(OUT_BC,50,184,-100,true,true);Off(OUT_BC);Wait(300);RotateMotorEx(OUT_BC,-50,187,0,true,true);//左に90度回転//
 #define right45 RotateMotorEx(OUT_BC,50,190,0,true,true);Off(OUT_BC);Wait(300);RotateMotorEx(OUT_BC,50,93,100,true,true);Off(OUT_BC);Wait(300);RotateMotorEx(OUT_BC,-50,192,0,true,true);//右に45度回転//
 #define right90 RotateMotorEx(OUT_BC,50,183,0,true,true);Off(OUT_BC);Wait(300);RotateMotorEx(OUT_BC,50,185,100,true,true);Off(OUT_BC);Wait(300);RotateMotorEx(OUT_BC,-50,188,0,true,true);//右に90度回転//
 #define up RotateMotor(OUT_A,-40,90);Off(OUT_A);Wait(500);    //ペンを上げる//
 #define down RotateMotor(OUT_A,40,90);Off(OUT_A);Wait(500);   //ペンを下げる//
 #define b_onecm RotateMotorEx(OUT_BC,-50,18,0,true,true);     //1cm後退//
 #define b_twocm RotateMotorEx(OUT_BC,-50,37,0,true,true);     //2cm後退//
 #define b_threecm RotateMotorEx(OUT_BC,-50,56,0,true,true);   //3cm後退//
 #define b_fourcm RotateMotorEx(OUT_BC,-50,77,0,true,true);    //4cm後退//
 #define b_fivecm RotateMotorEx(OUT_BC,-50,99,0,true,true);    //5cm後退//
 #define b_sevencm RotateMotorEx(OUT_BC,-50,142,0,true,true);   //7cm後退//
 #define b_eightcm RotateMotorEx(OUT_BC,-50,163,0,true,true);   //8cm後退//
 #define b_tencm RotateMotorEx(OUT_BC,-50,204,0,true,true);     //10cm後退//
 #define b_fifteencm RotateMotorEx(OUT_BC,-50,308,0,true,true); //15cm後退//
 #define onecm RotateMotorEx(OUT_BC,50,18,0,true,true);     //1cm前進
 #define twocm RotateMotorEx(OUT_BC,50,37,0,true,true);     //2cm前進
 #define threecm RotateMotorEx(OUT_BC,50,56,0,true,true);    //3cm前進
 #define fourcm RotateMotorEx(OUT_BC,50,77,0,true,true);     //4cm前進
 #define fivecm RotateMotorEx(OUT_BC,50,99,0,true,true);     //5cm前進
 #define sevencm RotateMotorEx(OUT_BC,50,142,0,true,true);    //7cm前進
 #define eightcm RotateMotorEx(OUT_BC,50,163,0,true,true);     //8cm前進
 #define tencm RotateMotorEx(OUT_BC,50,204,0,true,true);       //10cm前進
 #define fifteencm RotateMotorEx(OUT_BC,50,308,0,true,true);   //15cm前進
 #define left45 RotateMotorEx(OUT_BC,50,201,0,true,true);Off(OUT_BC);Wait(300);RotateMotorEx(OUT_BC,50,88,-100,true,true);Off(OUT_BC);Wait(300);RotateMotorEx(OUT_BC,-50,203,0,true,true);//左に45度回転
 #define left90 RotateMotorEx(OUT_BC,50,203,0,true,true);Off(OUT_BC);Wait(300);RotateMotorEx(OUT_BC,50,184,-100,true,true);Off(OUT_BC);Wait(300);RotateMotorEx(OUT_BC,-50,187,0,true,true);//左に90度回転
 #define right45 RotateMotorEx(OUT_BC,50,190,0,true,true);Off(OUT_BC);Wait(300);RotateMotorEx(OUT_BC,50,93,100,true,true);Off(OUT_BC);Wait(300);RotateMotorEx(OUT_BC,-50,192,0,true,true);//右に45度回転
 #define right90 RotateMotorEx(OUT_BC,50,183,0,true,true);Off(OUT_BC);Wait(300);RotateMotorEx(OUT_BC,50,185,100,true,true);Off(OUT_BC);Wait(300);RotateMotorEx(OUT_BC,-50,188,0,true,true);//右に90度回転
 #define up RotateMotor(OUT_A,-40,90);Off(OUT_A);Wait(500);    //ペンを上げる
 #define down RotateMotor(OUT_A,40,90);Off(OUT_A);Wait(500);   //ペンを下げる
 #define b_onecm RotateMotorEx(OUT_BC,-50,18,0,true,true);     //1cm後退
 #define b_twocm RotateMotorEx(OUT_BC,-50,37,0,true,true);     //2cm後退
 #define b_threecm RotateMotorEx(OUT_BC,-50,56,0,true,true);   //3cm後退
 #define b_fourcm RotateMotorEx(OUT_BC,-50,77,0,true,true);    //4cm後退
 #define b_fivecm RotateMotorEx(OUT_BC,-50,99,0,true,true);    //5cm後退
 #define b_sevencm RotateMotorEx(OUT_BC,-50,142,0,true,true);   //7cm後退
 #define b_eightcm RotateMotorEx(OUT_BC,-50,163,0,true,true);   //8cm後退
 #define b_tencm RotateMotorEx(OUT_BC,-50,204,0,true,true);     //10cm後退
 #define b_fifteencm RotateMotorEx(OUT_BC,-50,308,0,true,true); //15cm後退
 
 task main()
 {
  down;//ここから草冠//
  fifteencm;up;b_fourcm;right90;b_twocm;down;fourcm;up;b_twocm;right90;sevencm;
  left90;b_twocm;down;fourcm;up;//ここまでが草冠// 
  
  twocm;//草冠から月へ移動//
  right90;fourcm;RotateMotorEx(OUT_BC,50,183,0,true,true);Off(OUT_BC);Wait(300);
  RotateMotorEx(OUT_BC,50,190,100,true,true);Off(OUT_BC);Wait(300);
  RotateMotorEx(OUT_BC,-50,188,0,true,true);b_fifteencm;
  
  down;//ここから月//
  fifteencm;up;right90;down;fourcm;up;onecm;right90;down;fifteencm;up;b_fivecm;right90;
  down;fourcm;up;onecm;right90;fivecm;onecm;right90;down;fourcm;up;//ここまで月// 
  
  onecm;//月から右上部分へ移動//
  threecm;threecm;right90;b_threecm;b_threecm;
  
  down;//ここから右上部分//
  threecm;up;left90;b_fourcm;down;eightcm;up;b_fourcm;right45;b_threecm;down;onecm;
  up;twocm;down;eightcm;up;b_sevencm;right90;b_threecm;down;onecm;up;twocm;down;eightcm;
  up;b_eightcm;left45;fourcm;right90;b_fivecm;b_onecm;down;tencm;up;//ここまで右上部分// 
 
  b_fivecm;//右上部分から右下部分へ移動//
  left90;twocm;
  
  down;//ここから右下部分//
  eightcm;up;b_fourcm;left45;b_fourcm;onecm;down;twocm;up;threecm;
  down;threecm;up;b_threecm;right90;b_fourcm;down;twocm;up;threecm;down;threecm;up;//完成//
 }

*結果 [#q09ea579]
&ref(./pentou.jpg,20%);

実際は理想のものとは程遠く、微調整をしたうえでもこのように歪なものになった。

*苦労や行き詰ったところ・反省点 [#bf949d4e]
**苦労・行き詰ったところ、その解決策 [#s500cd5c]
-実は最初に組み立てたロボットは上で紹介したものではなく、NXTについている説明書通りに組み立て、腕をつけたものだった。

しかしそれだと、腕の重さで重心の位置が右上のところになってしまい、まっすぐ進まず不安定だったので、急遽今回のロボットを組み立てた。

それまで組み立てたプログラムが無駄になってしまったが、ロボットは安定した動きをするようになった。

-ロボットを新調してマクロを組みなおしたのだが、OnFwdの形だと電池の残量でモータの回転が弱くなり、その結果すべてのマクロが無駄になった。

この点は、RotateMotorExを用いて、モータの元々の出力の違いとともに解消することができた。

-後輪のキャスターが不確定要素であり、今回の最大の課題であった。

新しいロボットを作るという案もあったが時間的にも精神的にも厳しかったので、

結局それまでの路線のまま進め、最後はNXTに実際に文字を書かせてその都度微調整をするという形に落ち着いた。

**反省点[#w978410e]
-最初の方針があまり良くなかったと感じた。

文字を書くという課題に我々の動き回るロボットは向かない、と早めに気づいていれば、

他のロボットを作りもっといいものができたはずだ。

-これは先生にも言われたが、NXTは様々な動きができるので、曲線を書かせたりしたほうがよかったかもしれない。

-電池残量の問題に早く気づいていれば、もっと色々なことができたはず。

*感想 [#x4dddb1f]
班員に救われた部分が大きく、チームワークが大事だと感じた。

木村君はロボット製作を、田中君は課題解決の方針の考察やマクロの微調整、問題点の解決法の考察を一緒にやってくれた。

今回の結果や反省点を踏まえて、今後の課題に取り組んでいきたい。

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