- 追加された行はこの色です。
- 削除された行はこの色です。
[[2007b/A1]]
-----
CENTER:COLOR(darkgreen):&size(22){課題2:黒い線に沿って動くロボット};
CENTER:COLOR(darkgreen):&size(22){課題2:ライントレース};
-----
RIGHT:counter &counter(all);
目次
#contents
*目標 [#u61be3dc]
できる限り、''早く''・''正確''にライントレースをするロボットを作る。
***ライントレース(line Trace)とは [#z4643462]
ロボットが黒線(line)のある位置を認識し、その黒線を追跡(trace)すること。
*ルール [#j0683bfb]
-2箇所以上交差点のある周回コース(黒い線)をA0版の画用紙上描き、その自作のコースを3周するロボットを作成
-交差点で優先側を走っていない場合には一時停止し、もう一台のロボットが優先道路上にある場合には行き過ぎるのを待つ
-前方を進むもう一台のロボットに追いついて接触した時以下の動作をする
++3秒間停止して待つ
++その場で1回だけ360度旋回する
++180度旋回して5秒間コースを逆走し、再び180度旋回してもとの向きに走る
*コース [#bec4fe11]
*目的 [#u61be3dc]
斎木、坂本ペアで課題2に取り組みライントレースロボットを作成。
**ライントレースとは [#z4643462]
ライントレースとは、床面に描いたラインをロボットがセンサを利用して読み取り、ラインに沿って走行することです。
ライントレースをする際には光センサーを利用します。光センサーは光の明暗を区別することができます。そして設定値をかえることで黒い部分(暗)と白い部分(明)を区別することが可能なのです。
**特徴 [#sfb210d4]
交差点3つ。
今回はそれを利用し、A1左と共同で大きな画用紙に黒ペンでラインを描きロボットを動かします。
*コース [#bec4fe11]
#ref(20071206192948.jpg)
**特徴 [#sfb210d4]
わかりやすいコースにし,ロボ同士を競争させるのに適したコースにしました。ただコースの間隔が狭くなってしまった部分もできました。
*ロボット [#ae09f3d7]
-
-
-
-
-
**特徴 [#h4927445]
+全体の構造としては三輪で、駆動輪には大径タイヤを用い比較的速く走れるようにし、
後部に可動式のタイヤをつける事によって緩やかに曲がれるようにした。
+タッチセンサーは押した時に最前部に設置してある光センサーと同位置になるようにし、
一時停止を厳密に守るようになっている。
+光センサーは2つのセンサーで挟み込む形にして、センサーの幅の上限を無くし、スムーズに
進めるようにした。
*ソースプログラム [#z2a7617e]
#define THRESHOLD 40 //set Threshold
#define RUN_TIME 3000
#define SERCH_TIME 120
#define DEFAULT_POWER 7
#ref(20071206183838.jpg)
これが光センサー。明暗を感知します。
この2つの光センサーがともに黒を感知するように設定しています。なので2つの光センサーは非常に近くに設置されています。
#ref(20071206183929.jpg)
-上から見たロボ。実はNQCを逆さまに取り付けています。
これでプログラムの読み取りもスムーズになりました。
また、タッチセンサーも工夫しました。フロント部分のほとんどの障害物に反応するだけでなく自らが落下しそうになると反応します。これによってロボットが落下して壊れることはなくなりました。しかし、そのあまりの感度のよさにかえって問題が生じるなど今回はその機能があまり生かしきれていませんでした。
-
-
-
*プログラム [#l4578e2d]
fine THRESHOLD 40 //
sub turn_right(){
OnRev(OUT_A); OnFwd(OUT_C);
Wait(240);
Off(OUT_A+OUT_C);
}
#define so 1568
#define ra 1760
#define si 1976
sub search(){
ClearTimer(1);
if(Timer(1)>SERCH_TIME){
OnRev(OUT_A+OUT_C);
Wait(Timer(1));
}
task play_music() // âπäyÇââëtÇ∑ÇÈÉ^É XÉN
{
while (true)
{
PlayTone (so,15);Wait(15); //チャルメラのメロディ
PlayTone (ra,15);Wait(15);
PlayTone (si,45);Wait(45);
PlayTone (ra,15);Wait(15);
PlayTone (so,15);Wait(40);
PlayTone (so,15);Wait(15);
PlayTone (ra,15);Wait(15);
PlayTone (si,15);Wait(15);
PlayTone (ra,15);Wait(15);
PlayTone (so,15);Wait(15);
PlayTone (ra,45);Wait(70);
}
}
sub one_stop_black(){
until(SENSOR_1>THRESHOLD && SENSOR_3>THRESHOLD){
OnFwd(OUT_A+OUT_C);
//search();
}
}
sub one_stop_white(){
until(SENSOR_1<=THRESHOLD && SENSOR_3<=THRESHOLD){
OnFwd(OUT_A+OUT_C);
//search();
}
}
task main()
task main ()
{
int i,j,k;
int a,b;
SetSensor(SENSOR_1,SENSOR_LIGHT); // 光センサー1
SetSensor(SENSOR_3,SENSOR_LIGHT); // 光センサー2
i=0;
j=0;
k=0;
a=0;
b=0;
SetSensor(SENSOR_1,SENSOR_LIGHT); //センサ−1(右)を光センサーにセット
SetSensor(SENSOR_3,SENSOR_LIGHT); //センサ−3(左)を光センサーにセット
SetSensor(SENSOR_2,SENSOR_TOUCH); //センサ−2をタッチセンサーにセット
while(true){
if(SENSOR_2==1){
turn_right();
}
if(SENSOR_1>THRESHOLD && SENSOR_3>THRESHOLD){ //両方白ならまっすぐ進む
if(a==1){ //左に曲がった!
a=0;
k=0;
j++;
SetPower(OUT_C,DEFAULT_POWER); //右のモーターの強さをデフォルトに戻す
SetPower(OUT_A,DEFAULT_POWER-j); //連続して曲がった回数だけより曲率の小さい左カーブを描く
}
if(b==1){ //右に曲がった!
b=0;
j=0;
k++;
SetPower(OUT_A,DEFAULT_POWER); //左のモーターの強さをデフォルトに戻す
SetPower(OUT_C,DEFAULT_POWER-k); //連続して曲がった回数だけより曲率の小さい右カーブを描く
}
OnFwd(OUT_A+OUT_C);
}
if(SENSOR_1>THRESHOLD && SENSOR_3<=THRESHOLD){ // センサ−3が黒なら左に曲がる
a=1;
Off(OUT_A);
OnFwd(OUT_C);
}
if(SENSOR_1<=THRESHOLD && SENSOR_3>THRESHOLD){ // センサ−1が黒なら右に曲がる
b=1;
OnFwd(OUT_A);
Off(OUT_C);
}
if(SENSOR_1<=THRESHOLD && SENSOR_3<=THRESHOLD){ //両方黒なら一時停止
SetPower(OUT_A+OUT_C,DEFAULT_POWER);
Off(OUT_A+OUT_C);
Wait(50);
one_stop_black();
search();
one_stop_white();
search();
one_stop_black();
search();
one_stop_white();
search();
one_stop_black();
search();
SetSensor(SENSOR_2,SENSOR_TOUCH); // タッチセンサー
while(true){ //
if(SENSOR_2==1){ //もしタッチセンサーが反応するとメロディを流しながら0.40秒後退します。
start play_music ; //その後回転して音楽を止めます。
OnRev(OUT_A+OUT_C);
Wait(40);
OnFwd(OUT_A);
Wait(440); //
stop play_music ;
}else{
if(SENSOR_1<THRESHOLD){ //光センサ−1が黒を感知し
if(SENSOR_3<THRESHOLD){ //a,光センサー3も黒を感知したときに前進します
OnFwd(OUT_A); //
OnFwd(OUT_C);
}else{ //b,光センサー3が白のとき
OnRev(OUT_A); //右に曲がります
OnFwd(OUT_C);
}
}else{
if(SENSOR_3<THRESHOLD){ //光センサー1が白を感知しa,光センサー3は黒を感知したとき
OnFwd(OUT_A); //左に曲がります。
OnRev(OUT_C);
}else{
Off(OUT_A); //b,光センサー3も白を感知したとき
Off(OUT_C); //0.50秒間一時停止した後0.30秒前進します。
Wait(50);
OnFwd(OUT_A); //
OnFwd(OUT_C); //
Wait(30); //
}
}
}
}
}
}
}
*結果 [#q2b95d97]
右チームのロボットは左チームのものに比べて遅く、また接触した際に戻る時間が短すぎたために、回転したとき左チームのロボットを巻き込んでしまうなどしました。さらにタッチセンサーの構造を落下しそうになると感知できるようにしたのですが、感度が鋭くコース内にある小さな段差などにも過敏に反応してしまい意味もなく回転してしまう、ロボットが交差点で一時停止してから再び発進するとコースを右方向に外れていってしまう、などの様々な問題が発生しました。結果としてコース完走することができなかったのが残念でした。
*課題2を終えて [#x6df88c8]
変数とタイマー機能が使いこなせませんでした。
プログラムの問題が発見できません。
今回のライントレースの光センサーは黒い線を探し感知することで進むシステムにしてしまったので黒い線からはみ出してしまったときの修正が難しかったです。
*コメント [#qa917600]
よろしければコメントお願いします。
よろしければコメントをお願いします。
#comment