本体には3つのモータを使用。
その内2つは左右のタイヤに接続されており、NXTの移動を担当している。
残る1つは、後述するアームの上下を担当している。
上の画像のものが、アームである。
画像のように、モータが動くことでペンが上下する仕組みとなっている
我々の班は漢字を縦と横と左右斜め45度の、4種類の直線で表せると考えた。
そう考えることで、単純なマクロを複数用意することでプログラミングが容易になると考え、その方針で今回の課題に取り組んだ。
理想的なマクロをつくり、NXTが理想的に動けば、上の画像の通りのものが完成するはずである。
#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;//完成// }
実際は理想のものとは程遠く、微調整をしたうえでもこのように歪なものになった。
しかしそれだと、腕の重さで重心の位置が右上のところになってしまい、まっすぐ進まず不安定だったので、急遽今回のロボットを組み立てた。
それまで組み立てたプログラムが無駄になってしまったが、ロボットは安定した動きをするようになった。
この点は、RotateMotorExを用いて、モータの元々の出力の違いとともに解消することができた。
新しいロボットを作るという案もあったが時間的にも精神的にも厳しかったので、
結局それまでの路線のまま進め、最後はNXTに実際に文字を書かせてその都度微調整をするという形に落ち着いた。
文字を書くという課題に我々の動き回るロボットは向かない、と早めに気づいていれば、
他のロボットを作りもっといいものができたはずだ。
班員に救われた部分が大きく、チームワークが大事だと感じた。
木村君はロボット製作を、田中君は課題解決の方針の考察やマクロの微調整、問題点の解決法の考察を一緒にやってくれた。
今回の結果や反省点を踏まえて、今後の課題に取り組んでいきたい。