- 追加された行はこの色です。
- 削除された行はこの色です。
*目次 [#y1e85ce0]
#contents
*課題 [#fa34c355]
**ライントレースロボット [#cee1db93]
**黒い線に沿って動くロボット [#cee1db93]
各チームで作成したコースに沿って動くロボットを作成せよ。ただし、
速さと正確さを追求すること~
交差点で優先側を走っていない場合には、一時停止すること~
前方にあるもう一台のロボットに接触した場合には停止して相手のロボットが行き過ぎる、あるいは距離が離れるのを待つこと~
コースを3周したら自動的に止まること~
**課題を行うにあたって [#dfa4d531]
以下の動作をするロボットを製作する~
・光センサーを用い、進行状況に応じて方向を変える~
・タッチセンサーによって他のロボットとの接触を感知する~
・交差点の数を認識し、3周すると自動で停止する
~
*コース [#h02bc282]
#ref(TS3H0076.JPG)
*ロボットの説明 [#c3b6a5e6]
**全体 [#bdb24acc]
#ref(TS3H0073002.JPG)
今回の課題は小刻みの方向転換を繰り返すことを想定してタイヤを用いた。~
「三輪」という案もでたが他のセンサーのスペースを考慮し、~
「四輪」が最も安定すると判断した。~
**前から見た状態 [#ledd42a1]
#ref(TS3H0074001.JPG)
ラインを挟むように光センサーを取り付けた。~
これによってロボットがラインから外れるのを防止しスムーズにカーブを曲がることができる。~
マジックによる光の反射を考慮して光センサーを限界まで本体に近づけ光が入ってこないようにした。~
**下から見た状態 [#ve0c6b31]
#ref(TS3H0073001.JPG)
写真より、光センサーの幅は約4.0センチ。~
ラインの幅にあわせ、若干の余裕をもたせた絶妙な距離である。~
今回の課題のなかでは光センサーの幅の調節が特に難しかった。~
広すぎると隣のコースのラインを読み取ってしまう。~
逆に狭すぎると2つともラインを読み取ってしまった。~
~
**光センサー [#aae6ab10]
#ref(TS3H0073.JPG)
写真の赤丸で囲ったのが光センサーである。~
製作する過程で何度も光センサーの高さ・幅を変更しなければならず~
その度、光センサーを組み替えるのは手間がかかった。~
そのため「光センサーの高さ・幅を自由に変えられる設計にすればよかった」と後悔している。
**タッチセンサー [#dd13f4c9]
#ref(TS3H0074.JPG)
今回のロボットは前方に光、タッチセンサーを取り付けなければならなかった。~
そのため二つのセンサーうまい具合に取り付けることができず、タッチセンサーの小型化に努めた。~
またプログラムの性質上、曲がるときなどに機体が激しく揺れてしまうので、アーム部分も必要最低限まで軽量化を図ったが、結局、誤作動するときはするのでてっとり早く、バネ的な役割をするゴムを強くした。~
~
*プログラム [#m328d11c]
**プログラムの概略 [#t0382f98]
#ref(図1修正.png)
**ラインに沿って進むプログラム [#j8bf0167]
task main ()
{
SetSensor(SENSOR_1, SENSOR_LIGHT); //センサー1に光センサーをセット
SetSensor(SENSOR_2, SENSOR_TOUCH); //センサー2にタッチセンサーをセット
SetSensor(SENSOR_3, SENSOR_LIGHT); //センサー3に光センサーをセット
while(true)
{
while (SENSOR_2==0)
{
if((SENSOR_1 > THRESHOLD) && (SENSOR_3 > THRESHOLD)) //左右の光センサーがどちらもラインを感知しない場合
{ OnFwd(OUT_A+OUT_C); //前進
}
if(SENSOR_3 < THRESHOLD) //右側の光センサーがラインを感知した場合
{ OnFwd(OUT_A); //右に進路変更
OnRev(OUT_C);
}
if(SENSOR_1 < THRESHOLD) //左側の光センサーがラインを感知した場合
{ OnFwd(OUT_C); //左に進路変更
OnRev(OUT_A);
}
if((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD)) //左右の光センサーがラインを感知した場合(交差点)
{ Off(OUT_A+OUT_C) ; //一時停止
Wait(50);
OnFwd(OUT_A+OUT_C) ; //前進&交差点を渡る
Wait(70);
}
}
**他のロボットと接触した時のプログラム [#k42a2f2d]
while(SENSOR_2==1) //タッチセンサーが押される(他のロボットと接触)
{
Rev(OUT_A+OUT_C); //後進
Wait(30);
Off(OUT_A+OUT_C); //相手が過ぎ去るのを待つ
Wait(255);
OnFwd(OUT_C+OUT_A); //移動再開
}
**3周すると停止するプログラム [#s3ac052e]
task main()
{
int count; //変数として「count」を定義
count=0; //「count」の初期値を0とする
int count_max=X; //[X]には任意の値を代入(3周するなかでの交差点の総数)
while (count<count_max); //X以下のときの動作
{ if((SENSOR_1 < THRESHOLD) && (SENSOR_3 < THRESHOLD))
{ Off(OUT_A+OUT_C) ;
Wait(50);
OnFwd(OUT_A+OUT_C) ;
Wait(70);
count=count+1; //交差点を通過するたびに「count」の値が1ずつ増加
}
}
Off(OUT_A+OUT_C); //「count」の値がXに達すると停止
}
*改善点 [#ia0d08bd]
課題中に浮かんだが実際には使われなかったアイデアを紹介する
**光センサーを可動式に [#z530c177]
#ref(改善点.jpg)
光センサーをシャフトに取り付けラインの幅に応じて移動させる。~
これにより光センサーの幅を変えやすくなり、~
短時間で自分たちの作ったコース以外にも対応させることができる。~
つまり汎用性が格段に上がる
**タッチセンサーを2つ使う [#r905ca8d]
#ref(コードの有効活用.jpg)
今回は光センサーを2個使うためセンサーを3つまでしか使えないこのロボットでは1つのタッチセンサーしか使えない。~
そのためダブルセンサーを使うことができずにいた。~
だが、上の図を方法を使うことで2つのタッチセンサーを使うことに成功した。~
同様の方法で光センサーも一本のコードで接続できる。~
~
欠点は1本のコードにつないだ2つのセンサーはそれぞれを異なるプログラムで動かせないことだ
*コメント [#q56f6b17]
コメントをお願いします
#comment