2019a/Member 目次
コースをトレースし、ボールを運び、ゴールまで持っていく.
A地点から出発 → M → K(直進) → L(ピンポン玉をつかむ) → K(右折) → J(一時停止の後、左折) → I(直進) → H(直進) → G(左折) → F → E → D(一時停止の後、直進) → C(直進) → B(一時停止) → シュート→ A地点に入る(ゴール)
本体の構造は説明書に記載してあるものをつかった.
アームは前にボールにかぶさるような形の構造にした. また,ボールを運ぶ際引きずる形で持っていくのでボールが左右に動かないように支えを付けた.
黒い線を追従するライントレースのプログラミングを作るということで,「完全に真っ白」,「白と境目の間」,「境目」,「黒と境目の間」,「完全に黒」の5つの部分に色を分けて測った。 それぞれの値は,「完全な白」=65,「白と境界」=55,「境目」=47,「黒と境界」=42,「完全な黒」=32 それらの明るさによって曲がる方向が変わるようにする.
5段階に分けて考えると,それらは左に旋回,左に移動,直進,右に移動,右に旋回 実際にその動作を定義すると
#define SPEED 20 #define turn_left OnFwd(OUT_B,SPEED);Off(OUT_C) #define turn_right Off(OUT_B);OnFwd(OUT_C,SPEED); #define light_senkai OnRev(OUT_B,SPEED);OnFwd(OUT_C,SPEED); #define left_senkai OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED); #define go_straight OnFwd(OUT_BC,SPEED);
これは左側をトレースするためのプログラムだが右側をトレースするためのプログラムも必要になる.それが下のプログラムだ.
#define bturn_left OnRev(OUT_B,SPEED);Off(OUT_C); #define bturn_right Off(OUT_B);OnRev(OUT_C,SPEED); #define blight_senkai OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED); #define bleft_senkai OnRev(OUT_B,SPEED);OnFwd(OUT_C,SPEED); #define go_back OnRev(OUT_BC,SPEED);
交差点の判断は,連続して黒が一定の時間続いたらで止まるようにする.黒が何秒続くかは光センサーを使う。今回は現在の時間(CurrentTick)から時間を測りはじめ、光の明るさが一定の時間続いたら交差点と判断する.
SetSensorLight(S3); long t0=CurrentTick(); while(CurrentTick()-t0<stop_time)
これがそのプログラムだ.stop_timeは後ほど説明する.
黒が何秒続くかで交差点と判断するが交差点とY字カーブの判断が難しい.そこで,intを使うことにした.また,intの中身の名前をstop_timeにした.
intには2つの利点がある.
一つ目は,先ほども記述したように交差点とY字カーブを判断できることだ.黒の時間の長さを調節できるので簡単に交差点とY字カーブを判断できる.
二つ目は,機体の傾きによっては同じカーブでも時間に差が出る問題にも対応できることだ.
このように同じカーブでも機体の向きが違うだけで黒にいる時間が変わり交差手と判断してくれなくなる.intを使うことによってそれぞれのカーブでそれぞれに合った値にできる.
今回は,直角の交差点はintの中身を140にし,最初のY字カーブは進みたいので120と大きめな数字に,2つ目,3つ目のY字カーブは交差点として判断したいので70と小さめな数字にした.
主にトレースする時に使うサブルーチンを設定する.
sub follow_lineB1(int stop_time) { SetSensorLight(S3); long t0=CurrentTick(); while(CurrentTick()-t0<stop_time){ if(SENSOR_3>=65){ light_senkai; t0=CurrentTick(); }else if(SENSOR_3>=55){ turn_right; t0=CurrentTick(); }else if(SENSOR_3>=47){ OnFwd(OUT_BC,SPEED); t0=CurrentTick(); }else if(SENSOR_3>=42){ turn_left; t0=CurrentTick(); }else if(SENSOR_3>=35){ left_senkai; } } Off(OUT_BC); }
sub follow_lineB2() { SetSensorLight(S3); long t0=CurrentTick(); while(CurrentTick()-t0<140){ if(SENSOR_3>=65){ left_senkai; t0=CurrentTick(); }else if(SENSOR_3>=55){ turn_left; t0=CurrentTick(); }else if(SENSOR_3>=45){ OnFwd(OUT_BC,SPEED); t0=CurrentTick(); }else if(SENSOR_3>=42){ turn_right; t0=CurrentTick(); }else if(SENSOR_3>=35){ light_senkai; } }Off(OUT_BC); }
sub cross_line() { OnFwd(OUT_BC,SPEED); Wait(300); Off(OUT_BC); OnFwd(OUT_C,SPEED);OnRev(OUT_B,SPEED); Wait(400); Off(OUT_BC); }
交差点の横断は交差点で止まるとき少し本体が傾くのでそのまままっすぐ進み右に曲がるという方法で交差点を横断した.
まずボールを取る前にアームを上にあげる
OnRev(OUT_A,SPEED); Wait(500); Off(OUT_A);
前進しボールに近づく
OnFwd(OUT_BC,SPEED); Wait(500); Off(OUT_BC);
アームを下げる
OnFwd(OUT_A,SPEED); Wait(800); Off(OUT_A);
ボールをゴールにれる方法は機械本体が前進するタイミングでアームを上げボールを押し出してゴールに入れるという方法だ.
まず本体のライントレースが終わったら,バックする
OnRev(OUT_BC,SPEED); Wait(800); Off(OUT_BC);
次に本体が直進すると同時にアームを上げる
OnFwd(OUT_BC,SPEED);OnRev(OUT_A,SPEED); Wait(800); Off(OUT_ABC);
task main() { follow_lineB1(140); OnFwd(OUT_BC,SPEED); Wait(600); Off(OUT_BC); OnRev(OUT_B,SPEED);OnFwd(OUT_C,SPEED); Wait(400); Off(OUT_BC); OnFwd(OUT_BC,SPEED); Wait(2000); Off(OUT_BC); OnRev(OUT_A,SPEED); Wait(500); Off(OUT_A); OnFwd(OUT_BC,SPEED); Wait(500); Off(OUT_BC); OnFwd(OUT_A,SPEED); Wait(800); Off(OUT_A); OnRev(OUT_BC,SPEED); Wait(3000); Off(OUT_BC); OnRev(OUT_C,SPEED);OnFwd(OUT_B,SPEED); Wait(300); Off(OUT_BC); follow_lineB1(120); cross_line(); follow_lineB1(70); cross_line(); follow_lineB1(70); OnFwd(OUT_BC,SPEED); Wait(300); Off(OUT_BC); follow_lineB2(); OnFwd(OUT_BC,SPEED); Wait(300); Off(OUT_BC); OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED); Wait(400); Off(OUT_BC); follow_lineB2(); OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED); Wait(100); Off(OUT_BC); OnRev(OUT_BC,SPEED); Wait(800); Off(OUT_BC); OnFwd(OUT_BC,SPEED);OnRev(OUT_A,SPEED); Wait(800); Off(OUT_ABC); }
機械の方は時間をかけずに制作できたので良かった. また,コースを書くときにペンで書いたので場所によって濃さが違いプログラムを作成するのに時間がかかってしまった.コースをテープで作るなどの工夫をすればよかったと思った. プログラムはもっとうまくできたと思った.余計なプログラムも多いしサブルーチンをうまく使えばもっと短く簡潔になったと思う.3回目の課題ではミスをなくしより良いプログラムにしたい.