#contents
*今回の課題 [#nf9c1ce8]
#ref(2015a-mission2.png,,70%)
上図のようなコースを作り、制作したロボットをA地点からB地点までコースに沿って動かす。その際、ロボットにP,Q地点ともに直進させる。また、P,Q地点の間のどこかにピンポン玉を置いてロボットの移動中に回収させ、B地点に設置したゴールにシュートさせる。
*ロボットの説明 [#ga88d64c]
&ref(./1436582731685.jpg,,30%);
&ref(./1436582754035.jpg,,30%);
(ロボット全体の写真)
今回制作したロボットは三つの車輪を使い、そのうち二つがモーターを使って動き、残りの一つがキャスターという形で動かすことにした。最初は冊子に載っている基本形のロボットを使おうとしていたが、後述のようにいくつか不都合があったためにこのような構造になった。このロボットは大きく分けて車体本体部分とアーム部分に分かれるので、その二つの部分の構造について説明していく。
**本体部分 [#zd728b9e]
&ref(./1436582747313.jpg,,30%);
&ref(./1436582796368.jpg,,30%);
&ref(./1436582800557.jpg,,30%);
&ref(./1436582779665.jpg,,30%);
基本形のロボットだと、旋回半径が大きい上に、旋回の中心とセンサーの位置が離れていたのでうまくライントレースできなかった。そこで、これらの点を克服するために制作したのが今回のロボットである。このロボットの本体部分のポイントは以下の点である。
+前輪2つを動かすためのモーターの向かい合わせに密着させて組むことで、旋回半径を最小限にしたこと。
+基本形だとセンサーを設置する周りの機構がかなり大きく、旋回の中心にセンサーを設置するのはかなり無理があったので、L字型のブロックだけでセンサーを設置したこと。
+キャスターを後方部に取り付けて旋回性能を上げたこと。
特に3のキャスターを採用したことによって、コース上のコーナーは全て余裕を持って曲がり切れるようになった。
**アーム部分 [#l84212bc]
&ref(./1436582761335.jpg,,30%);
&ref(./1436582772106.jpg,,30%);
最初、アームはボールを挟み込む構造にしようとしたが、挟む際の力加減やシュートの際に車体を回転させなければならない、移動中にボールを落としてしまう、等の難所があったので、写真のようなボールを囲い込む構造を採用した。アーム部分のポイントは以下の点である。
+回転の向きを変える歯車を使って車体本体と同じ幅に収まるようにしたこと。
+回転軸に足を取り付けたこと。その際、囲いと90°ずらして取り付ける。
2の足を付けたことによって囲いを上げた時にボールを蹴れるようになっている。また、ボールを囲うので移動中の取りこぼしもなくなった。
*プログラムの説明 [#z5869422]
#define BLACK 42 //以下は黒
#define WHITE 50 //以上は白
#define go_forward OnFwd(OUT_AC); //真っ直ぐ
#define go_back OnRev(OUT_AC); //後ろへ
#define turn_right OnRev(OUT_C); OnFwd(OUT_A); //右旋回
#define turn_left OnFwd(OUT_C); OnRev(OUT_A); //左旋回
#define STEP 1 // 一回の判定で進む時間
#define short_break Off(OUT_AC); Wait(200); // 小休止
#define CROSS_TIME 30 // 交差点通過にかかる時間
#define cross_line go_forward;Wait(CROSS_TIME);short_break; //交差点を渡る
#define FIX_TIME 25
#define nMAX 8
#define clip_on OnFwd(OUT_B);Wait(10);Off(OUT_B);
#define clip_off OnRev(OUT_B);Wait(10);Off(OUT_B);
#define shoot go_back;Wait(50);go_forward;Wait(30);clip_off; //シュート
task main()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
int nOnline=0; // 続けて黒になった回数 (カウンタ)
while (nOnline <nMAX) {
if (SENSOR_2 < BLACK){ // 線上なら
turn_left; // 左へ
nOnline++; //カウンタ増やす
} else {
if (SENSOR_2 < WHITE){ // 境界付近なら
go_forward; // 直進
} else { //線から外れれば
turn_right; //右へ
}
nOnline=0; //カウンタをリセット
}
Wait(STEP);
}
short_break; //小休憩
turn_left;Wait(FIX_TIME); //方向左修正
short_break; //小休憩
clip_on; //捕球
turn_right;Wait(45); //方向右修正
go_forward;Wait(CROSS_TIME); //前進
nOnline=0; //カウンタをリセット
while (nOnline <nMAX) {
if (SENSOR_2 < BLACK){ // 線上なら
turn_left; // 左へ
nOnline++; //カウンタ増やす
} else {
if (SENSOR_2 < WHITE){ // 境界付近なら
go_forward; // 直進
} else { //線から外れれば
turn_right; //右へ
}
nOnline=0; //カウンタをリセット
}
Wait(STEP);
}
short_break; //小休憩
turn_right;Wait(FIX_TIME); //方向修正
cross_line; //交差点を渡る
nOnline=0; //カウンタをリセット
while (nOnline <nMAX) {
if (SENSOR_2 < BLACK){ // 線上なら
turn_left; // 左へ
nOnline++; //カウンタ増やす
} else {
if (SENSOR_2 < WHITE){ // 境界付近なら
go_forward; // 直進
} else { //線から外れれば
turn_right; //右へ
}
nOnline=0; //カウンタをリセット
}
Wait(STEP);
}
short_break; //小休憩
turn_right;Wait(FIX_TIME); //方向修正
shoot; //シュート
Off(OUT_AC); //停止
nOnline=0; //カウンタをリセット
}
**定義した関数 [#qfd02688]
#define BLACK 42 //以下は黒 ��
#define WHITE 50 //以上は白 ��
#define go_forward OnFwd(OUT_AC); //真っ直ぐ ��
#define go_back OnRev(OUT_AC); //後ろへ ��
#define turn_right OnRev(OUT_C); OnFwd(OUT_A); //右旋回 ��
#define turn_left OnFwd(OUT_C); OnRev(OUT_A); //左旋回 ��
#define STEP 1 // 一回の判定で進む時間 ��
#define short_break Off(OUT_AC); Wait(200); // 小休止 ��
#define CROSS_TIME 30 // 交差点通過にかかる時間 ��
#define cross_line go_forward;Wait(CROSS_TIME);short_break; //交差点を渡る ��
#define FIX_TIME 25 ��
#define nMAX 8 ��
#define clip_on OnFwd(OUT_B);Wait(10);Off(OUT_B); ��
#define clip_off OnRev(OUT_B);Wait(10);Off(OUT_B); ��
#define shoot go_back;Wait(50);go_forward;Wait(30);clip_off; //シュート ��
[解説]
�々�色と判断する値の設定
��白色と判断する値の設定
�A或�
�じ綢�
�セ�計回りに旋回
�θ浸�計回りに旋回
�Д札鵐機爾糧獣任�1/100秒に設定
�┯鮑硬世犯獣任靴浸�の2秒間停止
��交差点通過にかかる時間の設定
��交差点を渡る動作
��交差点と判断した時の方向修正の時間の設定
��交差点と判断するための連続回数の上限設定
��囲いを上げる動作
��囲いを下げる動作
��後ろへ下がり、前進して勢いをつけてから囲いを上げることによりシュート
**A地点→P地点 [#hfc7ba8f]
task main()
{
SetSensor(SENSOR_2, SENSOR_LIGHT); ��
int nOnline=0; // 続けて黒になった回数 (カウンタ) ��
while (nOnline <nMAX) { ��
if (SENSOR_2 < BLACK){ // 線上なら ��
turn_left; // 左へ
nOnline++; //カウンタ増やす
} else {
if (SENSOR_2 < WHITE){ // 境界付近なら ��
go_forward; // 直進
} else { //線から外れれば
turn_right; //右へ ��
}
nOnline=0; //カウンタをリセット
}
Wait(STEP); ��
}
[解説]
�.札鵐機�2番にライトセンサーを接続し、使用可能状態に。
��続けて黒と判断した時にその連続回数をカウントさせる。
�O�続で黒であるとnMAX回判断しない限り�ぁ銑Г瞭虻遒鯊海韻気擦襦�
�す�であると判断したなら左へ旋回し、カウンタを1増やす。
�ザ�界線上であれば直進させ、カウンタをリセットさせる。
�η鬚任△襪犯獣任靴燭覆蕷Δ慇�回し、カウンタをリセットさせる。
�Лぁ銑Δ虜邏箸�STEP/100秒ごとに行う。
**P地点→Q地点 [#t1cbd6e4]
short_break; //小休憩
turn_left;Wait(FIX_TIME); //方向左修正 ��
short_break; //小休憩
clip_on; //捕球
turn_right;Wait(45); //方向右修正 ��
go_forward;Wait(CROSS_TIME); //前進
nOnline=0; //カウンタをリセット
while (nOnline <nMAX) { ��
if (SENSOR_2 < BLACK){ // 線上なら ��
turn_left; // 左へ
nOnline++; //カウンタ増やす
} else {
if (SENSOR_2 < WHITE){ // 境界付近なら ��
go_forward; // 直進
} else { //線から外れれば
turn_right; //右へ ��
}
nOnline=0; //カウンタをリセット
}
Wait(STEP); ��
}
[解説]
�(甬紊任�る角度に調整
�▲薀ぅ鵐肇譟璽垢鮑導�するために角度を修正
��〜��
A地点→P地点の��〜�Г汎韻�
**Q地点→B地点 [#rf7b7491]
short_break; //小休憩
turn_right;Wait(FIX_TIME); //方向修正 ��
cross_line; //交差点を渡る ��
turn_right;Wait(FIX_TIME); //方向修正 ��
cross_line; //交差点を渡る ��
nOnline=0; //カウンタをリセット
while (nOnline <nMAX) { ��
if (SENSOR_2 < BLACK){ // 線上なら ��
while (nOnline <nMAX) { ��
if (SENSOR_2 < BLACK){ // 線上なら ��
turn_left; // 左へ
nOnline++; //カウンタ増やす
} else {
if (SENSOR_2 < WHITE){ // 境界付近なら ��
if (SENSOR_2 < WHITE){ // 境界付近なら ��
go_forward; // 直進
} else { //線から外れれば
turn_right; //右へ ��
turn_right; //右へ ��
}
nOnline=0; //カウンタをリセット
}
Wait(STEP); ��
Wait(STEP); ��
}
short_break; //小休憩
turn_right;Wait(FIX_TIME); //方向修正 ��
turn_right;Wait(FIX_TIME); //方向修正 ��
shoot; //シュート
Off(OUT_AC); //停止
nOnline=0; //カウンタをリセット
}
[解説]
�仝鮑硬世犯獣任靴浸�には8/100秒分反時計回りをしているので元の方向へ修正。
��交差点を通過し、元のライントレースへ戻す。
��〜��
A地点→P地点の��〜�Г汎韻�
�┘粥璽襪諒�向へ角度を調整
*実際にロボットを動かしている動画 [#c432960a]
https://www.youtube.com/watch?v=MteH8fCbr5g
*反省,感想 [#i5496406]
前の課題の時もそうだったが、ロボットの構造を決定するのに意外と時間がかかった。そのため、制作時間はかなり長くなってしまったと思う。だがその分、みんなが見てる前で課題を成功させるなど、かなり完成度も高くできたと思う。ただ、プログラミングについて、まだ使いこなせない式もあるので、それらを使いこなせるようになったらもっとプログラムが簡単になっていたかもしれない。なので、それらの式を次の課題までに使いこなせるようになっておきたい。