A3の紙に相棒の似顔絵を書くロボットを作成する。
ひとりにつき一つ以上のプログラムを作成する。
#define TURN_TIME 105 //右に曲がる時間 #define turn_right OnFwd(OUT_A);OnRev(OUT_C);Wait(TURN_TIME);Off(OUT_A+OUT_C) //右に曲がる #define turn_left(t) OnFwd(OUT_C);OnRev(OUT_A);Wait(t);Off(OUT_A+OUT_C) //左に曲がる #define go_straight(t) OnRev(OUT_A+OUT_C);Wait(t);Off(OUT_A+OUT_C); //直進 #define UP OnRev(OUT_B);Wait(15);Off(OUT_B); //ペンを上げる #define DOWN OnFwd(OUT_B);Wait(15);Off(OUT_B); //ペンを下げる task main() { OnFwd(OUT_A); //輪郭を描く OnRev(OUT_C); Wait(420); Off(OUT_A+OUT_C); go_straight(230); //前髪の線を描く UP; turn_right; go_straight(5); turn_right; go_straight(230); DOWN; repeat(2){ //目の線を描く UP; go_straight(35); DOWN; go_straight(35) } UP; turn_left(113); go_straight(25) turn_left(65); go_straight(190) DOWN; go_straight(35) //口を描く }
(作成者:三澤)
#define UPANDDOWN_TIME 20 // 鉛筆を上げるし下げる時間 #define TURN_90 110 // 90度曲がる時間 #define TURN_360 415 // 360度曲がる時間 #define ZIG_TIME 5 // ジグザグする時間 #define WRITE 1 // 描くか決める変数 #define NO_WRITE 0 // 描くか決める変数 int iFlag = 0; // 鉛筆が上がっているか確認する変数 // 鉛筆を上げる関数 sub up () { if ( iFlag == 1 ) // 鉛筆が上がっているか確認した後で進む { OnRev ( OUT_B ); // B モータを作動して鉛筆を上げる Wait ( UPANDDOWN_TIME ); Off ( OUT_B ); iFlag = 0; // 鉛筆が上がっていることをチェックする } } // 鉛筆を下げる関数 sub down() { if ( iFlag == 0 ) // 鉛筆が下がっているか確認した後で進む { OnFwd ( OUT_B ); // B モータを作動して鉛筆を下げる Wait ( UPANDDOWN_TIME ); Off ( OUT_B ); iFlag = 1; // 鉛筆が下がっていることをチェックする } } // ロボットを前進させる関数 // iTime : 動く時間 // iWriteFlag : 描くか決める変数 void go ( int iTime, int iWriteFlag ) { if ( iWriteFlag == 1 ) // iWriteFlag=1のとき鉛筆を下げる { down (); } else { up (); } OnFwd ( OUT_A + OUT_C ); // A モータとCモータを作動する Wait ( iTime ); Off ( OUT_A + OUT_C ); } // ロボットを後進させる関数 // iTime : 動く時間 // iWriteFlag : 描くか決める変数 void back ( int iTime, int iWriteFlag ) { if ( iWriteFlag == 1 ) // iWriteFlag=1のとき鉛筆を下げる { down (); } else { up (); } OnRev ( OUT_A + OUT_C ); // A モータとCモータを作動する Wait ( iTime ); Off ( OUT_A + OUT_C ); } // ロボットを左に曲がらせる関数 // iTime : 動く時間 // iWriteFlag : 描くか決める変数 void turn_left ( int iTime, int iWriteFlag ) { if ( iWriteFlag == 1 ) // iWriteFlag=1のとき鉛筆を下げる { down (); } else { up (); } OnRev ( OUT_A ); // Aモータを作動する OnFwd ( OUT_C ); // Cモータを作動する Wait ( iTime ); Off ( OUT_A + OUT_C ); } // ロボットを右に曲がらせる関数 // iTime : 動く時間 // iWriteFlag : 描くか決める変数 void turn_right ( int iTime, int iWriteFlag ) { if ( iWriteFlag == 1 ) // iWriteFlag=1のとき鉛筆を下げる { down (); } else { up (); } OnFwd ( OUT_A ); // Aモータを作動する OnRev ( OUT_C ); // Cモータを作動する Wait ( iTime ); Off ( OUT_A + OUT_C ); } // ロボットをジグザグに線を描かせる関数 // iTime : 動く時間 // iStron : ジグザグする強さ void write_zig ( int iTime, int iStrong ) { int iCount = 0; int iLoop; iCount = iTime / ZIG_TIME; down (); for ( iLoop = 0 ; iLoop < iCount ; iLoop++ ) // ジグザグするために繰り返す部分 { OnFwd ( OUT_A ); // 右に少し動く Wait ( iStrong ); Off ( OUT_A ); OnFwd ( OUT_A + OUT_C ); // 前に少し動く Wait ( ZIG_TIME / 2 ); Off ( OUT_A + OUT_C ); OnFwd ( OUT_C ); // 左に少し動く Wait ( iStrong ); Off ( OUT_C ); OnFwd ( OUT_A + OUT_C ); // 前に少し動く Wait ( ZIG_TIME / 2 ); Off ( OUT_A + OUT_C ); } up (); } task main ( ) { // 顔の輪郭を描く部分 turn_right ( TURN_360, WRITE ); // 髪を描く部分 go ( 50, NO_WRITE ); turn_right ( TURN_90, NO_WRITE ); back ( 190, NO_WRITE ); go ( 190, WRITE ); // 目を描く部分 turn_right ( TURN_90, NO_WRITE ); go ( 70, NO_WRITE ); turn_right ( TURN_90, NO_WRITE ); back ( 200, NO_WRITE ); go ( 40, NO_WRITE ); write_zig ( 40, 2 ); go ( 40, NO_WRITE ); write_zig ( 40, 2 ); // 鼻を描く部分 back ( 15, NO_WRITE ); turn_left ( TURN_90, NO_WRITE ); back ( 70, NO_WRITE ); go ( 30, WRITE ); // 口を描く部分 go ( 130, NO_WRITE ); turn_left ( TURN_90, NO_WRITE ); go ( 110, NO_WRITE ); turn_right ( TURN_90 * 2, NO_WRITE ); write_zig ( 25, 10 ); }
(作成者:朴)
・ペンを上げ下げする部分のパーツを作るのがとても大変だった。
なんとかペンを上下に上げ下げ出来るパーツを作りたかったので、自分たちで作った。今現在ゴムだったところは、実は前はギアで出来ていて、上げ下げするスピードが速すぎたので、ゴムに替えました。ゴムにしてから、速さがちょうど良くなり、プログラムも楽になりました。しかしこのパーツはペンを挟みこんでいるのではなく、最終的にゴムで固定しているので、ペンを下ろしたときに若干ずれてしまったりするので、そこは課題が残りました。
・毎回機械の動き方が微妙に違うので、距離の計算をするのが大変だった。
同じプログラムでも、1回やる度に目や口の位置がずれてしまった。でも少しずれても違和感のないようにプログラムを組んで、なんとか顔になるようにした。
書くべきことは書けており、プログラムを工夫しています。気になる点が残るので、授業中に確認します。