[[2005/C2]] #contents *五角形に動くキャタピラロボット [#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); } -難しかったこと --何秒回転させるかを決めるのが大変だった。約何秒で90度まわるかを見つけ、頑張ってみた。 -工夫したこと --repeat使って簡単に見やすく作ってみました☆ -感想 --初めて自分で作ったプログラムにしてはちゃんと動いてくれたと思う。 *課題1 「左」を書くロボット [#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〜5画目の書きはじめにペンを持っていくところが難しかった。 -工夫したこと --2画目をバックで書くことにより、無駄な動きをなくした。 -感想 --予想以上に思いどおりに動いてくれなくて苦労した。 -ロボット --アルトのプログラムの写真を参照してください。ペンはゴムを二重にして固定したので、グラグラはしないが、衝動はやわらげられてたと思う。 -コメントがあったので… --サブルーチンを使って書き換えると下のようになった。少しは見やすくなったと思う。 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}; -関数についても挑戦してみてください -- [[かとりーぬ(TA)]] &new{2006-02-07 (火) 12:31:56}; #comment *課題2 センサを使って机の周りを動くキャタピラロボット [#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) コメントをお願いします -難しかったところをどのように解決したのかも書くと良いです。 -- [[かとりーぬ(TA)]] &new{2006-02-07 (火) 12:56:39}; #comment *課題3-1 黒い線上を動くロボット(モータ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); } } } --何種類か考えたが、やはりうまくいかない。 早くもプログラミングの壁にぶつかってしまったみたい。早く壁を乗り越えたい…。 *課題3-2 黒い線上を動くロボット(モータ1個、センサ1個) [#pdae8853] task main () { SetSensor(SENSOR_1,SENSOR_LIGHT); while (true) { if (SENSOR_1<40) { //線上にいるとき OnRev(OUT_A); Wait(25); OnFwd(OUT_A); Wait(20); } else { //線からはずれたとき OnRev(OUT_A); Wait(50); OnFwd(OUT_A); until(SENSOR_1<40); } } } -感想 --ロボット作りが難しく、後進するロボット(キャスタが前にあるロボット)になってしまった。 --でもなんとか一周まわることができた。 -ロボット --左右のタイヤの間隔は狭くしてみたが、キャスタが遠いロボットになった。 コメントをお願いします -左右のタイヤの間隔が広ければ、カーブの回転半径は大きくなります。急なカーブをさくっと曲がるには、プログラムとロボットの両方を改良する必要がありますね。ぜひいろいろとやってみてください。 -- [[松本(教員)]] &new{2005-12-09 (金) 23:01:52}; -私は実物を見ていないので、何とも言えませんが・・・実際の動きを見ていない人にもわかるように、ページ上の表現を工夫して見ましょう。 -- [[かとりーぬ(TA)]] &new{2006-02-07 (火) 13:00:37}; #comment *課題4 懐中電灯の光を追うロボット [#kadai4] task main () { SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ1は光センサ SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ3は光センサ while(true){ if((SENSOR_1>45)&&(SENSOR_3>45)){ //センサ1とセンサ3の値が45以上のとき OnFwd(OUT_C+OUT_A); //前進 } if(SENSOR_1>65){ //センサ1の値が65以上の時 OnFwd(OUT_C); //左に回る Off(OUT_A); } if(SENSOR_3>65){ //センサの値が65以上の時 OnFwd(OUT_A); //右に回る Off(OUT_C); } } } -ロボット --キャタピラロボットの左右に光センサを付けた簡単なロボット -工夫したこと --最初に光の強さを調べて、左右に曲がるときの値を決めた。 -感想 --光の値を調べてプログラミングをしたので簡単にできた☆ --最初は、Offを入力するのを忘れていたので、思っていたのと違う行動をとられて戸惑った。 コメントをお願いします -二つの条件式を組み合わせるとき(論理積や論理和をとる場合)には、それぞれの条件式を()で括っておきましょう。 -- [[松本(教員)]] &new{2006-01-07 (土) 00:05:41}; -直してみました。 -- [[あんず]] &new{2006-01-16 (月) 15:39:44}; -『Offを入力するのを忘れて言うことを聞かなくて戸惑った』…実際にはロボットはちゃんと言うこと聞いているんですけどね…(笑) でも、気持はとてもよくわかります。-- [[松本(教員)]] &new{2006-01-16 (月) 16:41:09}; -言い方変えてみました。 -- [[あんず]] &new{2006-01-21 (土) 22:16:55}; -よくまとめられているページです。文字以外の要素もあった方が見やすいかな? -- [[かとりーぬ(TA)]] &new{2006-02-07 (火) 12:48:54}; #comment *課題5 演奏ロボットと演奏にあわせて踊るロボット [#kadai5] ロボ1 指揮をしながら曲を奏でるロボット //曲目:エーデルワイス #define Do 523 #define Re 587 #define Mi 330 #define Fa 349 #define So 392 #define La 440 #define Si 494 task play_music() // 音楽を演奏するタスク { while (true) { PlayTone(Mi,190); Wait(200); // エー PlayTone(So, 90); Wait(100); // デル PlayTone(Re,290); Wait(300); // ワイス PlayTone(Do,190); Wait(200); // エー PlayTone(So, 90); Wait(100); // デル PlayTone(Fa,290); Wait(300); // ワイス PlayTone(Mi,190); Wait(200); // か PlayTone(Mi, 90); Wait(100); // わ PlayTone(Mi, 90); Wait(100); // い PlayTone(Fa, 90); Wait(100); // い PlayTone(So, 90); Wait(100); // は PlayTone(La,290); Wait(300); // な PlayTone(So,290); Wait(300); // よ PlayTone(Mi,190); Wait(200); // し PlayTone(So, 90); Wait(100); // ろ PlayTone(Re,290); Wait(300); // い PlayTone(Do,190); Wait(200); // つ PlayTone(So, 90); Wait(100); // ゆ PlayTone(Fa,290); Wait(300); // に PlayTone(Mi,190); Wait(200); // ぬ PlayTone(So, 90); Wait(100); // れ PlayTone(So, 90); Wait(100); // て PlayTone(LA, 90); Wait(100); // さ PlayTone(Si, 90); Wait(100); // く PlayTone(Do,290); Wait(300); // は PlayTone(Do,290); Wait(300); // な } } task main() { start play_music; // 演奏開始 ClearTimer(0); while ( Timer(0) <= 5 ) { SendMessage(1); } // 最初の0.5秒間 1 を送信する repeat(16){ // 3拍子×16回 OnFwd(OUT_B); // 棒下げ Wait(100); OnRev(OUT_C); // 回転 Wait(100); OnRev(OUT_B); // 棒上げ Wait(100); } Float(OUT_B+OUT_C); stop play_music; //演奏停止 } ロボ2 演奏にあわせて踊るロボット task main() { while (true) { ClearMessage(); // Message() を 0 に設定 until (Message() != 0); // Message() に 0 以外の値が入るまで待つ if ( Message() == 1 ) // 1 を受信したとき repeat(2){ OnFwd(OUT_A); Wait(300); //3秒左に回転 OnRev(OUT_A); Wait(300); //戻る Off(OUT_A); OnFwd(OUT_C); Wait(300); //3秒右に回転 OnRev(OUT_C); Wait(300); //戻る Off(OUT_C); OnRev(OUT_A+OUT_C); Wait(600); //6秒後退 OnFwd(OUT_A+OUT_C); Wait(600); //6秒前進 Off(OUT_A+OUT_C); } } } -考える過程 --必修のテストがある日午前2時、寝ようと思い布団に入るが、何の曲演奏させようか考えてしまう。かえるの歌もちゅうりっぷもありきたり。エーデルワイスなんていいんじゃない!?3拍子の指揮に挑戦しようじゃん!ロボットは上げ下げに加えてちょっと回転すればできるんじゃん?絶対音感なくなっちゃったから楽譜かけないよ。そんなこんな考えてたら眠れなくなっちゃったのね、結局寝たの3時過ぎ。ちなみにちゃんと動くかはまだ試していない。 コメントをお願いします。 -どうさかくにんをしたら -- [[かとりーぬ(TA)]] &new{2006-02-07 (火) 13:03:53}; -すいません。動作確認をしたら、また聞かせてください。 -- [[かとりーぬ(TA)]] &new{2006-02-07 (火) 13:04:50}; #comment