2016a/Member/ta/Mission2
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2016a/Member]]
#contents
*はじめに [#he0260dc]
今回の課題は、決められたコースを線に沿って走るロボットを作ることだ。
これがコースの全体像だ。
#ref(2016a/Member/ta/Mission2/2016a-mission2.png,75%,コース全体)
私が選んだルートは
C地点からA地点へ
『C地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点』
です。
*ロボットの説明 [#e4ebc16a]
今回のロボットは小回りがきくように左右のタイヤの幅をできるだけ小さくした。
#ref(2016a/Member/ta/Mission2/image1(2).JPG,120%,ロボット本体)
また、光センサーの位置をタイヤと近くし、センサーの左右への振り幅を小さくした。
#ref(2016a/Member/ta/Mission2/image3.JPG,120%,光センサーの位置)
*プログラムの説明 [#n1a2408b]
今回は『task main』をシンプルにするためにサブルーチンを用いた。
まずは細かい定義を
#define THRESHOLD 45
#define BLACK 42 // これ以下は黒
#define WHITE 50 // これ以上は白
#define Go OnFwd(OUT_AC);
#define L Off(OUT_A); OnFwd(OUT_C);
#define R OnFwd(OUT_A); Off(OUT_C);
#define L_senkai OnFwd(OUT_A); OnRev(OUT_C);
#define R_senkai OnFwd(OUT_C); OnRev(OUT_A);
#define STEP 1
#define NOTINTERSECTION FastTimer(0) <= 22 || FastTimer(1) <= 300
これが線の左側に沿ってライントレースするサブルーチンである。
sub Trace()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
while (true) {
if (SENSOR_2 < THRESHOLD){
L;
} else {
R;
}
Wait(STEP);
}
}
これが曲線を走るサブルーチンである。
sub Curve()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
while(true) {
if (SENSOR_2 < BLACK){
R_senkai;
}else if(SENSOR_2 > THRESHOLD){
L_senkai;
}else if (SENSOR_2 < THRESHOLD){
L;
}else{
R;
}
Wait(STEP);
}
}
こせが交差点で停止するサブルーチンである。
sub IntersectionFreeze()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
ClearTimer(0);
while (true) {
while (FastTimer(0) <= 30) {
if (SENSOR_2 < BLACK) {
R;
} else if (SENSOR_2 < WHITE) {
Go;
ClearTimer(0);
} else {
R;
ClearTimer(0);
}
Wait(STEP);
}
Off(OUT_AC);
}}
これが交差点を左折するサブルーチンである。
sub IntersectionL()
{
ClearTimer(0);
}
これが交差点を右折するサブルーチンである。
sub IntersectionR()
{
ClearTimer(0);
while(NOTINTERSECTION){
if(FastTimer(1) >= 300){
ClearTimer(0);
ClearTimer(1);
break;
}
if(SENSOR_2 >= WHITE){
L;
}else if(SENSOR_2 >= BLACK){
R;
}
}
L;
Wait(10);
Off(OUT_AC);
ClearTimer(0);
ClearTimer(1);
}
これが交差点を直進するサブルーチンである。
sub IntersectionGo()
{
Go;
Wait(20);
Off(OUT_AC);
}
そして、『task main』がこれだ。
task main()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
ClearTimer(0);
Trace();
IntersectionL(); // Sを左折
Trace();
IntersectionL(); // Pを左折
Trace();
IntersectionGo(); // Qを直進
Trace();
IntersectionGo(); // Qを直進
Trace();
Curve(); // r=5のカーブ上を
Trace();
IntersectionR(); // Rを右折
Trace();
Curve();
Trace();
IntersectionL(); // Pを左折
Trace();
Curve();
Trace();
IntersectionFreeze();
IntersectionGo();
}
*まとめ [#b12030da]
ロボットを前回の似顔絵ロボットから大幅に形を変えたことによって小回りがきき、ライントレースに適した形にできてよかった。
ただ、プログラムを書くのに時間をかけすぎて、コース上を全て通しでスタートからゴールまで走らせることはできなかった。
終了行:
[[2016a/Member]]
#contents
*はじめに [#he0260dc]
今回の課題は、決められたコースを線に沿って走るロボットを作ることだ。
これがコースの全体像だ。
#ref(2016a/Member/ta/Mission2/2016a-mission2.png,75%,コース全体)
私が選んだルートは
C地点からA地点へ
『C地点 → S左折 → P左折 → Q直進 → Q直進 → R右折 → P左折 → A地点』
です。
*ロボットの説明 [#e4ebc16a]
今回のロボットは小回りがきくように左右のタイヤの幅をできるだけ小さくした。
#ref(2016a/Member/ta/Mission2/image1(2).JPG,120%,ロボット本体)
また、光センサーの位置をタイヤと近くし、センサーの左右への振り幅を小さくした。
#ref(2016a/Member/ta/Mission2/image3.JPG,120%,光センサーの位置)
*プログラムの説明 [#n1a2408b]
今回は『task main』をシンプルにするためにサブルーチンを用いた。
まずは細かい定義を
#define THRESHOLD 45
#define BLACK 42 // これ以下は黒
#define WHITE 50 // これ以上は白
#define Go OnFwd(OUT_AC);
#define L Off(OUT_A); OnFwd(OUT_C);
#define R OnFwd(OUT_A); Off(OUT_C);
#define L_senkai OnFwd(OUT_A); OnRev(OUT_C);
#define R_senkai OnFwd(OUT_C); OnRev(OUT_A);
#define STEP 1
#define NOTINTERSECTION FastTimer(0) <= 22 || FastTimer(1) <= 300
これが線の左側に沿ってライントレースするサブルーチンである。
sub Trace()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
while (true) {
if (SENSOR_2 < THRESHOLD){
L;
} else {
R;
}
Wait(STEP);
}
}
これが曲線を走るサブルーチンである。
sub Curve()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
while(true) {
if (SENSOR_2 < BLACK){
R_senkai;
}else if(SENSOR_2 > THRESHOLD){
L_senkai;
}else if (SENSOR_2 < THRESHOLD){
L;
}else{
R;
}
Wait(STEP);
}
}
こせが交差点で停止するサブルーチンである。
sub IntersectionFreeze()
{
SetSensor(SENSOR_2, SENSOR_LIGHT);
ClearTimer(0);
while (true) {
while (FastTimer(0) <= 30) {
if (SENSOR_2 < BLACK) {
R;
} else if (SENSOR_2 < WHITE) {
Go;
ClearTimer(0);
} else {
R;
ClearTimer(0);
}
Wait(STEP);
}
Off(OUT_AC);
}}
これが交差点を左折するサブルーチンである。
sub IntersectionL()
{
ClearTimer(0);
}
これが交差点を右折するサブルーチンである。
sub IntersectionR()
{
ClearTimer(0);
while(NOTINTERSECTION){
if(FastTimer(1) >= 300){
ClearTimer(0);
ClearTimer(1);
break;
}
if(SENSOR_2 >= WHITE){
L;
}else if(SENSOR_2 >= BLACK){
R;
}
}
L;
Wait(10);
Off(OUT_AC);
ClearTimer(0);
ClearTimer(1);
}
これが交差点を直進するサブルーチンである。
sub IntersectionGo()
{
Go;
Wait(20);
Off(OUT_AC);
}
そして、『task main』がこれだ。
task main()
{
SetSensor(SENSOR_2,SENSOR_LIGHT);
ClearTimer(0);
Trace();
IntersectionL(); // Sを左折
Trace();
IntersectionL(); // Pを左折
Trace();
IntersectionGo(); // Qを直進
Trace();
IntersectionGo(); // Qを直進
Trace();
Curve(); // r=5のカーブ上を
Trace();
IntersectionR(); // Rを右折
Trace();
Curve();
Trace();
IntersectionL(); // Pを左折
Trace();
Curve();
Trace();
IntersectionFreeze();
IntersectionGo();
}
*まとめ [#b12030da]
ロボットを前回の似顔絵ロボットから大幅に形を変えたことによって小回りがきき、ライントレースに適した形にできてよかった。
ただ、プログラムを書くのに時間をかけすぎて、コース上を全て通しでスタートからゴールまで走らせることはできなかった。
ページ名: