黒い線に沿って走るロボットを作成した。A4Rの班と、一つのコースで二つのロボットが走るコースを作った。
タッチセンサーの下に光センサーを取り付けたロボット。
僕たちのグループでは、初めに光センサーが一つのロボットを作成してみた(上の写真のロボット)。なぜなら、ほとんどのグループが光センサーを二つ使っていたので、なんとか一つでやってみたかったからである。
できあがった光センサーが一つのロボットをコースで走らせた時、重大なミスに気づいた。それは左カーブか右カーブのどちらか一つしか動くことができないということだ。僕たちのグループでは光センサーが黒い線から外れると右のタイヤが動くようにプログラミングをしたので、右カーブを曲がることができなっかた。しかし、光センサーが一つのロボットは急カーブも簡単に曲がることができるというメッリトがあったので、センサーが一つのままで改良をしてみた。
光センサーが一つのロボットではどうやっても左右のカーブに対応してくれなかった。そこで、タイマーを使ってみた。右カーブに入る直前までの時間を計り、そこから右に曲がれるプログラムを取り入れてみた。初めは良いと思ったこの改良だったが、ロボット同士の衝突や交差点での一時停止などを考慮すると、右カーブ直前までの時間が少しずつ変わってしまい、うまく曲がることはできなっかた。僕たちは改めてロボットを作り直すことにした。
光センサーが二つあるどんなカーブにも対応できるロボット↓
土台は前ロボットのままで、前方に光センサーを二つ取り付けた。↓
光センサーが一つの時と違い、左右どちらのカーブにも対応することが可能である。
交差点を判断することができるので、一時停止などのプログラムにも対応できる。
急なカーブを曲がることができない。
光センサーが二つの方が、作ったコースをうまく走ることができるし、どんなプログラムにもしっかり対応できるロボットになった。
タッチセンサーと光センサーを同じ場所に取り付けるのに苦労した。光センサーが地面に近すぎると、うまく明るさを認識できずに走らなかったり、遠すぎるとずっと走り続けたりした。最終的にはちょうど良い位置(地面から5センチくらい)を見つけることができた。
光センサー一つのロボットの時while のループの中に until (SENSOR_3==1); というプログラムを作ってしまいロボットが動かなかった。間違いを指摘していただき、先生に感謝しています。ありがとうございます。今度は自分たちで気づけるようにしたい。
#define THRESHOLD 40 #define Do 523 #define Re 587 #define Mi 659 #define Fa 698 #define Sol 784
task play_music() // 走行時に鳴る音楽のプログラム { while(true) { PlayTone(Mi,25); Wait(15); //ミ PlayTone(Re, 5); Wait(5); //レ PlayTone(Do,15); Wait(10); //ド PlayTone(Re,15); Wait(10); //レ
PlayTone(Mi,15); Wait(10); //ミ PlayTone(Mi,15); Wait(10); //ミ PlayTone(Mi,35); Wait(20); //ミ
PlayTone(Re,15); Wait(10); //レ PlayTone(Re,15); Wait(10); //レ PlayTone(Re,35); Wait(20); //レ
PlayTone(Mi,15); Wait(10); //ミ PlayTone(Sol,15); Wait(10); //ソ PlayTone(Sol,35); Wait(20); //ソ
PlayTone(Mi,25); Wait(15); //ミ PlayTone(Re, 5); Wait(5); //レ PlayTone(Do,15); Wait(10); //ド PlayTone(Re,15); Wait(10); //レ
PlayTone(Mi,15); Wait(10); //ミ PlayTone(Mi,15); Wait(10); //ミ PlayTone(Mi,35); Wait(20); //ミ
PlayTone(Re,15); Wait(10); //レ PlayTone(Re,15); Wait(10); //レ PlayTone(Mi,25); Wait(15); //ミ PlayTone(Re, 5); Wait(5); //レ
PlayTone(Do,55); Wait(30); //ド } }
task main () {
SetSensor(SENSOR_1,SENSOR_LIGHT); SetSensor(SENSOR_2,SENSOR_LIGHT); SetSensor(SENSOR_3,SENSOR_TOUCH);
while(true) { start play_music; //音楽スタート while (SENSOR_3==0){ //センサー3が働いていない時、以下を実行 if(SENSOR_1<THRESHOLD) { //センサー1が黒線上にある時 OnFwd(OUT_A); //モーターAを正回転 Off(OUT_C); //モーターCを停止 } if(SENSOR_2<THRESHOLD) //センサー2が黒線上にある時 { Off(OUT_A); //モーターAを停止 OnFwd(OUT_C); //モーターCを正回転 }else{ //それ以外 OnFwd(OUT_A+OUT_C);} //モーターAとCを停止 } while (SENSOR_3==1){ //センサー3が働いた時、以下を実行 stop play_music; //音楽停止 Off(OUT_A+OUT_C); //AとCのモーター停止 OnRev(OUT_A+OUT_C);Wait(130);} //AとCのモーターを逆回転させる } }
黒い線が光に反射してしまい、練習ではうまくセンサーが線を認識できずに大変だった。
音楽の鳴らすタイミングのプログラムがなかなか上手くできなくて少し苦労した。
光センサーが一つのロボットをコースでうまく走らせることができなくて残念だった。