[[2005/C2]] *五角形に動くキャタピラロボット [#z24f6e92] task main() { OnFwd(OUT_A); OnFwd(OUT_C); Wait(150); repeat(4){ OnRev(OUT_C); Wait(80); OnFwd(OUT_C); Wait(150); } Off(OUT_A+OUT_C); } -何秒回転させるかを決めるのが大変だった。 -repeat使って簡単に見やすく作ってみました☆ *「左」を書くロボット [#kadai1] task main() { OnFwd(OUT_A+OUT_C); //1画目 Wait(100); OnFwd(OUT_B); //ペン上げ Wait(50); Off(OUT_A+OUT_B+OUT_C); Wait(200); OnRev(OUT_A); Wait(130); OnRev(OUT_B); //ペン下げ OnRev(OUT_A+OUT_C); //2画目 Wait(150); OnFwd(OUT_B); //ぺン上げ Wait(50); Off(OUT_A+OUT_B+OUT_C); Wait(200); OnFwd(OUT_A+OUT_C); Wait(200); OnRev(OUT_A); Wait(108); OnRev(OUT_A+OUT_C); Wait(75); OnRev(OUT_B); //ペン下げ OnRev(OUT_A+OUT_C); //3画目 Wait(90); OnFwd(OUT_B); //ペン上げ Wait(50); Off(OUT_A+OUT_B+OUT_C); Wait(200); OnFwd(OUT_A+OUT_C); Wait(180); OnRev(OUT_A); Wait(85); OnRev(OUT_A+OUT_C); Wait(85); OnFwd(OUT_A+OUT_C); //4画目 OnRev(OUT_B); //ペン下げ Wait(55); OnFwd(OUT_B); //ペン上げ Wait(50); Off(OUT_A+OUT_B+OUT_C); Wait(200); OnFwd(OUT_A); OnRev(OUT_C); Wait(90); OnRev(OUT_A+OUT_C); Wait(15); OnRev(OUT_B); //ペン下げ OnRev(OUT_A+OUT_C); //5画目 Wait(120); Off(OUT_A+OUT_B+OUT_C); } -3画目からが難しかった。 -予想以上に思いどおりに動いてくれなくて苦労した。 -サブルーチンを使って書き換えると下のようになった。少しは見やすくなったと思う。 sub up_pen() //ペン上げ { OnFwd(OUT_B); Wait(50); Off(OUT_A+OUT_B+OUT_C); Wait(200); } task main() { OnFwd(OUT_A+OUT_C); //1画目 Wait(100); up_pen(); OnRev(OUT_A); Wait(130); OnRev(OUT_B); //ペン下げ OnRev(OUT_A+OUT_C); //2画目 Wait(150); up_pen(); OnFwd(OUT_A+OUT_C); Wait(200); OnRev(OUT_A); Wait(108); OnRev(OUT_A+OUT_C); Wait(75); OnRev(OUT_B); //ペン下げ OnRev(OUT_A+OUT_C); //3画目 Wait(90); up_pen(); OnFwd(OUT_A+OUT_C); Wait(180); OnRev(OUT_A); Wait(85); OnRev(OUT_A+OUT_C); Wait(85); OnFwd(OUT_A+OUT_C); //4画目 OnRev(OUT_B); //ペン下げ Wait(55); up_pen(); OnFwd(OUT_A); OnRev(OUT_C); Wait(90); OnRev(OUT_A+OUT_C); Wait(15); OnRev(OUT_B); //ペン下げ OnRev(OUT_A+OUT_C); //5画目 Wait(120); Off(OUT_A+OUT_B+OUT_C); } コメントをお願いします -サブルーチンや関数を使ってみましょう。 -- [[松本(教員)]] &new{2005-11-11 (金) 22:59:48}; #comment *センサを使って机の周りを動くキャタピラロボット [#kadai2] task main() { SetSensor(SENSOR_1,SENSOR_TOUCH); SetSensor(SENSOR_3,SENSOR_TOUCH); while(true) { if(SENSOR_3 == 1) //右のセンサが押されている { OnFwd(OUT_A+OUT_C); //直進 } else { //右のセンサが押されていない Off(OUT_C); //右に回る OnFwd(OUT_A); } if(SENSOR_1 == 1) //左のセンサが押されている { OnRev(OUT_A); //左に曲がる OnFwd(OUT_C); Wait(170); } } Off(OUT_A+OUT_C); } -机の足にタイヤがひっかからないように、センサがうまく働くように工夫してロボットを作った。 -センサがうまく働かず、右に回りすぎて困った。 #ref(img_0007_Medium.jpg) コメントをお願いします #comment *黒い線上を動くロボット(モータ2個、センサ1個) [#kadai3-1] task main () { SetSensor(SENSOR_1, SENSOR_LIGHT); while (true) { if (SENSOR_1 < 40) { // 線上にいるとき OnFwd(OUT_A); Off(OUT_C); } else { // 線から外れたとき Off(OUT_A); OnFwd(OUT_C); } } } -これはとりあえず一周はするが、ショ-トカットしてしまう。 task main () { SetSensor(SENSOR_1,SENSOR_LIGHT); while (true) { if (SENSOR_1<40) { // 線上にいるとき OnFwd(OUT_C+OUT_A); } else { // 線から外れたとき OnFwd(OUT_A); OnRev(OUT_C); Wait(50); OnFwd(OUT_C); OnRev(OUT_A); until(SENSOR_1<40); } } } -何種類か考えたが、やはりうまくいかない。 早くもプログラミングの壁にぶつかってしまったみたい。早く壁を乗り越えたい…。 コメントをお願いします -左右のタイヤの間隔が広ければ、カーブの回転半径は大きくなります。急なカーブをさくっと曲がるには、プログラムとロボットの両方を改良する必要がありますね。ぜひいろいろとやってみてください。 -- [[松本(教員)]] &new{2005-12-09 (金) 23:01:52}; #comment