- 追加された行はこの色です。
- 削除された行はこの色です。
[[2019a/Member]]
#contents
*課題2 [#x90f493c]
下の図のようなコースを書くチームで作成し、「ミッション」を遂行するためのロボットを作成せよ。
黒い線にそって動くロボットを作成する。
交差点では1秒間停止し、丁字路では直角方向に進入する時のみ一時停止すること。
二つのコースがあり、私は
A地点から出発 → B → C(直進) → D(一時停止の後、直進) → E → F → G(一時停止の後、右折) → H → I → J(右折) → K(左折) → L(ピンポン玉をつかむ) → K(直進) → M(一時停止) → シュート→ A地点に入る(ゴール)
というコースを選んだ。
#ref(2019a/Member/www/Mission2/keiro.jpg,50%)
下の図で青→緑の矢印の順で動き、緑の矢印はピンポン玉を運んでいる。
#ref(2019a/Member/www/Mission2/keiro2.jpg,50%)
*ロボットの説明 [#g78a6f3b]
**全体像 [#v29e5613]
&ref(2019a/Member/www/Mission2/kawai.jpg);&ref(2019a/Member/www/Mission2/ura.jpg);
#ref(2019a/Member/www/Mission2/zentai_uekara.jpg)
タイヤを4つではなく、3つにすることで、旋回しやすく動きやすくした。摩擦を少なくするために、ゴムを外したホイールのみを取り付けた。車軸を固定しなことで、さらに摩擦を減らすことができた。
#ref(2019a/Member/www/Mission2/zentai'.jpg)
ピンポン玉をつかむ機構を取り付けたことで、RISの本体を後ろに下げることになったが、ロボットの重心が後ろにさがらないようにするために、RISを横向きに取り付けた。
**アーム部分 [#h40ada04]
ピンポン玉をつかむ機構を取り付けたことで、RISの本体を後ろに下げることになったが、RISを横向きに取り付けることでロボットのバランスをとった。
**光センサー [#na9121e3]
#ref(2019a/Member/www/Mission2/hikari'.jpg,30%)
光センサーはタイヤのすぐ前に設置した。センサーをタイヤに近づけることで、ロボットが、正確にライントレースするようにした。
**タイヤ [#h40ada04]
#ref(2019a/Member/www/Mission2/ura.jpg)
タイヤを4つではなく、3つにすることで、旋回しやすく動きやすくした。摩擦を少なくするために、ゴムを外したホイールのみを取り付けた。車軸を固定しなことで、さらに摩擦を減らすことができ、スムーズに動くようになった。
**アーム [#u102f2d2]
#ref(2019a/Member/www/Mission2/te_uekara.jpg)
アームはピンポン玉を挟むような形にした。
#ref(2019a/Member/www/Mission2/hasamu'.jpg)
異なる方向にアームが回転し、動くようにするために、ギアの配置を工夫した。
また、コンパクトに見えるように、ギアを上下に配置し、アームの位置の調整のため、二つ並んだギアの下にグレーのパーツをかませた。
#ref(2019a/Member/www/Mission2/te_yokokara.jpg)
また、前回同様、アームの開き具合の微調節のために、青いパーツを取り付けて、簡単に閉じたり開いたりできるようにした。
*プロブラムについて [#r8e9cc5d]
**ライントレースの仕組み [#zdbb814b]
コースの関係上右側のふちをライントレースするようにした。
光センサーの下の明るさを値として検知して、検出された値によって決められた動作を行わせることで、ライントレースをする。
私たちは、以下のように5段階に値を決めた。
#ref(2019a/Member/www/Mission2/michi.jpg,50%)
以下が、その値で行う動作である。
#ref(2019a/Member/www/Mission2/atai1.jpg,30%)
**プログラムの説明 [#p2fa6173]
***ライントレースのプログラム [#nb0dcaff]
上で説明した動作を行うために以下のマクロを定義した。
-グローバル変数
int t;
-光センサーの値
#define kuro 41 //真っ黒
#define kurohai 43 //黒
#define hai 46 //灰
#define shirohai 48 //白
-ライントレースの動作のための定義
#define go_ahead OnFwd(OUT_AC); //直進
#define turn_left SetPower(OUT_AC,3);Off(OUT_A);OnFwd(OUT_C); //左曲がり
#define turn_right SetPower(OUT_AC,3);Off(OUT_C);OnFwd(OUT_A); //右曲がり
#define Uturn_left SetPower(OUT_AC,3);OnRev(OUT_A);OnFwd(OUT_C); //左旋回
#define Uturn_right SetPower(OUT_AC,3);OnRev(OUT_C);OnFwd(OUT_A); //右旋回
-一時停止
#define kyukei Wait(100); //1秒停止
-一つの動作の継続時間
#define STEP 1
下にライントレースに使用したサブルーチンを示す。
sub follow_line1()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
ClearTimer(0); //タイマー0をリセット
while(FastTimer(0)<t) //タイマーの値がt未満の時に繰り返す
{
if(SENSOR_2<kuro)
{
Uturn_right; //真っ黒なら右旋回せよ
}
else if(SENSOR_2<kurohai)
{
turn_right;ClearTimer(0); //黒なら右に曲がれ
}
else if(SENSOR_2<hai)
{
go_ahead;ClearTimer(0); //灰なら直進せよ
}
else if(SENSOR_2<shirohai)
{
turn_left;ClearTimer(0); //白なら左に曲がれ
}
else
{
Uturn_left;ClearTimer(0); //真っ白なら左旋回せよ
}
Wait(STEP);
}
Off(OUT_AC); //止まれ
kyukei; //一秒停止
}
sub follow_line2()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
ClearTimer(0);
while(FastTimer(0)<t)
{
if(SENSOR_2<kuro)
{
Uturn_right;
}
else if(SENSOR_2<kurohai)
{
turn_right;
}
else if(SENSOR_2<hai)
{
go_ahead;
}
else if(SENSOR_2<shirohai)
{
turn_left;
}
else
{
Uturn_left;
}
Wait(STEP);
}
Off(OUT_AC);
}