[[2016a/Member]]
*目次 [#offd988a]
#contents
*機体の説明 [#b380836f]
前回より少し機体を小さくし、交差点や円で曲がりやすいように設計した。
具体的にはギアボックス自体を回収、タイヤ間の距離を変え、できる限りスムーズな動きをできるようにした。
&ref(./機体01.jpg,45%,機体画像1);
タイヤは先生からのアドバイスで摩擦の小さいものを使用。
(それまでは厚いタイヤで回転が下手な機体だった。)
&ref(./機体02.jpg,45%,機体画像2);
また画像を見ればわかるように今回はタイヤ、センサからなる3つの点は平べったい三角形をしている。
これはセンサで読み取った値が反映させるまでに起こるラグを考慮した結果で、逆にこの二つに距離が遠すぎると
センサの値が変わるとタイヤが大幅に動いてしまうようになるため、バランスのとれた位置になっている。
&ref(./機体03.jpg,45%,機体画像3);
*プログラムの仕組みについて [#k4ffe550]
今回のプログラムは前回に比べて複雑なため、別に説明のページを作った。
**レース用プログラム [#b1a6cb71]
黒い線を走るプログラムは&br;
•白 → 大きく右回転&br;
•白っぽい → 右回転&br;
•中間 → 直進&br;
•黒っぽい → 左回転&br;
•黒 → 大きく左回転&br;
という形になっている。
sub go()
{
ClearTimer(0);//タイマ1の初期化
while(FastTimer(0) < TMAX){
if(SENSOR_2 >Tyukan+4)//白
{ //大きく右旋回
OnFwd(OUT_A);
OnRev(OUT_C);
ClearTimer(0);
}
else if(SENSOR_2 > Tyukan+2)//しろっぽい
{ //右旋回
Off(OUT_A);
OnFwd(OUT_A);
ClearTimer(0);
}
else if(SENSOR_2 > Tyukan)//中間点
{ //直進
OnFwd(OUT_AC);
ClearTimer(0);
}
else if(SENSOR_2 > Tyukan-2)//黒っぽい
{ //左旋回
Off(OUT_C);
OnFwd(OUT_C);
}
else
{ //大きく左旋回
OnFwd(OUT_C);
OnRev(OUT_A);
}
}
Off(OUT_AC);//交差点のため停止
PlaySound(SOUND_CLICK);//確認音
Wait(100);//1秒停止
}
これによって普通の直線などでは線にそって走ることができる。
** 交差点の判別 [#k78aa1eb]
交差点の判別は先ほど上で示したプログラムの中の一部で判別を行っている。
それは
while(FastTimer(0) < TMAX)
と白、中間に存在する。
ClearTimer(0);
で行っている。
これによって一定数黒が連続するとFastTimer(0) の値が増えていき、
これによって一定数黒が連続するとタイマーが増加し
交差点のような、黒が連続で判定される場所だと、ループを抜け、交差点だという判別ができるようになっている。
** 判別後の処理 [#k78aa1eb]
交差点の判別後の処理は3つ存在し、それは以下の画像の通りである。
&ref(./判別1.png,60%,交差点処理1);
�‘眤Δ鮨覆燹�&br;
これは一番簡単な処理で、判別が終了している時には、機体は若干、赤の線のように左に傾いているので、
自分はこのように書いてセンサが黒にある状態から、左回転を行って、白色になるまでそれを行っている。
sub turn1()//内側の交差点移動処理
{
while(SENSOR_2 < Tyukan+5)//センサ値が中間より小さい間
{
OnFwd(OUT_C);
}
Off(OUT_AC);
}
&ref(./判別2.png,60%,交差点処理2);
�△修里泙淇覆燹�&br;
まっすぐ進むには、普通は直線で進むが、先ほど説明したように、
この機体は交差点を判別した際、若干左に機体が曲がる。
それを利用して、右回転を白になるまで繰り返し、直進という動作にしている。
sub move()
{
while(SENSOR_2 < Tyukan+5)//センサ値が中間より小さい間
OnFwd(OUT_A);
Off(OUT_AC);
}
&ref(./判別3.png,60%,交差点処理3);
�3安Δ鮨覆�&br;
外側を進むには他のプログラムと違い処理が複雑になる。
考えられるつくり方としては黒→白→黒→白と繰り返すまで回転を続けるという方法もあるが、
工程が増えるとミスする確立が高くなるので今回は下に書いたように時間で少し動かし、
その後、move()をもう一度使用し回転している。
sub turn2()//内側の交差点移動処理
{
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(20);
Off(OUT_AC);
move();
}
*プログラムの全体像 [#j62118fe]
#define TMAX 27 //何秒間黒ならループを抜けるか30だとだめだった
#define Tyukan 44 //中間のしきい値+-2で黒白 +-4で大きく白黒
/*
交差点の説明
D側 4 C側
|
|
3--------------------------------1
|
|
A側 2 B側
*/
task main()
{
//目標
setting();
//*汚くなりそうなためあえてrepeat()を使っていない
go();//一度目の交差点(S)1から2へ
turn1();
go();//2度目の交差点(P)4から1へ
turn1();
go();//3度目の交差点(Q1) 2から4へ
move();
go();//4度目の交差点(Q2) 3から1へ
move();
go();//5度目の交差点(R) 4から3へ
turn2();
go();//5度目の交差点(P) 2から3へ
turn1();
go();//end
}
sub setting()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
SetPower(OUT_AC,5);
}
sub go()
{
ClearTimer(0);//タイマ1の初期化
while(FastTimer(0) < TMAX){
if(SENSOR_2 >Tyukan+4)//白
{ //大きく右旋回
OnFwd(OUT_A);
OnRev(OUT_C);
ClearTimer(0);
}
else if(SENSOR_2 > Tyukan+2)//しろっぽい
{ //右旋回
Off(OUT_A);
OnFwd(OUT_A);
ClearTimer(0);
}
else if(SENSOR_2 > Tyukan)//中間点
{ //直進
OnFwd(OUT_AC);
ClearTimer(0);
}
else if(SENSOR_2 > Tyukan-2)//黒っぽい
{ //左旋回
Off(OUT_C);
OnFwd(OUT_C);
}
else
{ //大きく左旋回
OnFwd(OUT_C);
OnRev(OUT_A);
}
}
Off(OUT_AC);//交差点のため停止
PlaySound(SOUND_CLICK);//確認音
Wait(100);//1秒停止
}
sub move()
{
while(SENSOR_2 < Tyukan+5)//センサ値が中間より小さい間
OnFwd(OUT_A);
Off(OUT_AC);
}
sub turn1()//内側の交差点移動処理
{
while(SENSOR_2 < Tyukan+5)//センサ値が中間より小さい間
{
OnFwd(OUT_C);
}
Off(OUT_AC);
}
sub turn2()//内側の交差点移動処理
{
OnFwd(OUT_A);
OnRev(OUT_C);
Wait(20);
Off(OUT_AC);
move();
}
*課題の感想 [#bbb8c6fd]
今回は前回と違い、センサーも含めた構造になり処理も複雑化したが、その分できる幅も広がり
ロボの構造、プログラムの中身もよりいっそう面白い中身になったと思う。
ただ、自分はプログラムだけで問題を解決しようとしてしまうクセがあり、それのせいで今回の課題は
時間がかかってしまった。場合によっては機体のほうを改善したほうが圧倒的に速く問題解決できる
ときもあることを忘れてはいけない。
また今回は中間試験や家のアクシデントも重なり、時間に余裕がなくて大変だった。
だがいつも忙しかった訳ではない。課題が近くなってから急に始めたからここまで忙しくなってしまったのだろう。
暇なときに少しでも作業をする癖をつけて最後のロボコンに望みたい。