- 履歴一覧
- ソース を表示
- 2015a/Member/Y.H/Mission2 は削除されています。
- 追加された行はこの色です。
- 削除された行はこの色です。
*目次 [#pdbe1a7d]
#contents
*課題について [#s030a29a]
課題2は光センサーを使ったライン・トレース・ロボットの製作。
コースは以下の通り(課題2のページより)
#ref(./コース.png,50%)
-A地点からB地点へ (P三叉路およびQ交差点はともに直進)
-B地点からA地点へ (Q交差点では直進、P三叉路では直進)
-C地点からA地点へ (Q交差点では直進、P三叉路では右折)
また、これらの経路の途中(PQ間)においたボールをゴールまで運ぶこと。三叉路および交差点では二秒間停止すること。
今回は、B地点からA地点のコースとする。
*ロボット本体について [#j1672ef1]
タッチセンサをつけると邪魔になりそうだったので、つけないことにした。
アームはモーターAで動かす。BCは移動用に使った。
アームは上からボールにかぶせる形にした。
*プログラムについて [#z4ee3701]
**ライントレース [#hb0a73c2]
一番初めに組んだもの。五段階に光を分けた。
#define hikari 50
#define SPEED1 55
#define SPEED 25
#define turn_left OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED);
#define TURN_LEFT OnFwd(OUT_B,SPEED);
#define go_forward OnFwd(OUT_BC,SPEED1);
#define TURN_RIGHT OnFwd(OUT_C,SPEED);
#define turn_right OnFwd(OUT_C,SPEED);OnRev(OUT_B,SPEED);
#define STEP 1
task main(){
SetSensorLight(S3);
while(true){
if(SENSOR_3<hikari -7){
turn_left;
}else if(SENSOR_3<hikari -3){
TURN_LEFT;
}else if(SENSOR_3<hikari +3){
go_forward;
}else if(SENSOR_3<hikari +10){
TURN_RIGHT;
}else{
turn_right;
}
}
}
この時、ロボットは線の左端をなぞった。
このプログラムは、ただただライントレースのみを速く調整したいときに使えると思い、単純だが載せておこうと思った。
**交差点・三叉路 [#k3c8fb05]
交差点や三叉路の判定にはカウンターを使うことにした。
また、上のプログラムではコースをうまくなぞらなかったので、線の右端をなぞるようにした。(回転方向を反転させた)
追加の定義
#define nMAX 175
#define sofa Off(OUT_BC);Wait(200);
#define CROSS_TIME 200
#define cross_line OnFwd(OUT_BC,SPEED);Wait(CROSS_TIME);sofa;
交差点を渡るようにしたプログラム
task main()
{
SetSensorLight(S3);
int nOnline=0;
while(true){
while(nOnline<nMAX){
if(SENSOR_3<hikari -7){
turn_right;
nOnline++;
}else{
if(SENSOR_3<hikari -3){
TURN_RIGHT;
}else if(SENSOR_3<hikari +3){
go_forward;
}else if(SENSOR_3<hikari +10){
TURN_LEFT;
}else{
turn_left;
}
nOnline=0;
}
Wait(STEP);
}
sofa;
turn_left;Wait(nMAX*STEP);
cross_line;
nOnline=0;
}
}
**ボールを運ぶ [#qf87d8a7]
一度上のように分けて考えたので、なるべくその形を生かせるようにプログラムを組もうと思った。
プログラムは、交差点と判断した回数を数えてそれにより変化させた。一回目でボールをつかみ、三回目でシュートさせることにした。そのため、ボールを交差点を通過してすぐのところに置くこととし、少し楽をした。
上の続きであるが、最初の塊は重複している。
sofa;
turn_left;Wait(nMAX*STEP);
cross_line;
nOnline=0;
task SONOTA()
{
SetSensorLight(S3);
int nOnline2=0;
int nKousa=0;
nKousa++;
if(nKousa=1){
catch;
}else if(nKousa>=3){
shoot;
Off(OUT_ABC);
}
while(true){
while(nOnline2<nMAX){
if(SENSOR_3<hikari -5){
nOnline2++;
}
Wait(STEP);
}
nOnline2=0;
nKousa++;
while(true){
if(nKousa=1){
Acquire(moveMutex);
catch;
Release(moveMutex);
}
}
while(true){
if(nKousa=3){
Acquire(moveMutex);
shoot;
Off(OUT_ABC);
}
}
}
}
mutex moveMutex;
#define catch sofa;OnFwd(OUT_A,SPEED);Wait(300);sofa;
#define shoot sofa;OnRev(OUT_BC,SPEED);Wait(300);OnRev(OUT_A,SPEED);\
Wait(300);OnFwd(OUT_BC,SPEED+10);Wait(300);
結局、task mainをtask LINEにしてしまって、並列させることにした。
task main()
{
Precedes(LINE,SONOTA);
}
*感想 [#bfb90857]
どちらかのタイヤと、光センサーを近づければ、回転半径が左右で異なるので、また違うのではないかと思った。
もっと速く動かせるように改良したい。
プログラムがきれいではないのでもっとうまく組めるようになりたい。