- 追加された行はこの色です。
- 削除された行はこの色です。
[[2013a/Member]]
*somegorou [#dfff7a45]
**wanikawa [#va6f8b2f]
***damedesita [#n104d113]
*目次 [#m7a0da66]
*今回の課題説明 [#l742d7cd]
課題2では課題1のコースを2つ組み合わせ新たなコースを造り、物を運ぶ動作に加え、物を受け渡す動作をが加わった。
前回と同じ部品点数で物を投げる・受け取ると言う動作を加えなければいけなかった。&br;
**コース解説 [#ke38d8a1]
**詳しいルールリンク [#f388ac68]
http://yakushi.shinshu-u.ac.jp/robotics/?2013a%2FMission2
*機体の説明 [#qc3fc9c3]
*プログラムの説明 [#bf51ade5]
#define BLACK_02 35
#define WHITE_01 50
#define WHITE_02 60
#define SPEED 30
#define go_forward OnFwd(OUT_AC,SPEED);
#define turn_right OnRev(OUT_A,SPEED);OnFwd(OUT_C,SPEED);
#define turn_left OnFwd(OUT_A,SPEED);OnRev(OUT_C,SPEED);
#define right Off(OUT_A);OnFwd(OUT_C,SPEED);
#define left OnFwd(OUT_A,SPEED);Off(OUT_C);
プルグラムは基本的に前回の課題で扱ったものを基準に作った。
なのでここでは新しく使いされたマクロと主なプログラムのアウトラインを紹介したい。&br;
まず今回の課題でつかされたプログラムは共同で作業を行っていた人から受け継いで使ったものである。
プログラムを参考にさしていただいたのはチームメンバーの"ryu"さんとです。
このプログラムのマクロの
**プログラム添付 [#o0674b68]
////////////////////////////ryu//////////////////////////////////////////////////////
#define BLACK_02 35 //
#define WHITE_01 50 //
#define WHITE_02 60 //
#define SPEED 30 //
#define go_forward OnFwd(OUT_AC,SPEED); //
#define turn_right OnRev(OUT_A,SPEED);OnFwd(OUT_C,SPEED); //
#define turn_left OnFwd(OUT_A,SPEED);OnRev(OUT_C,SPEED); //
#define right Off(OUT_A);OnFwd(OUT_C,SPEED); //
#define left OnFwd(OUT_A,SPEED);Off(OUT_C); //
/////////////////////////////////////////////////////////////////////////////////////
#define STEP 1
#define CENTER 45
#define CCC 14000
#define SPEED_H 45
#define SPEED_L 25
#define turn_R Off(OUT_A); OnFwd(OUT_C,SPEED_L);
#define turn_L Off(OUT_C); OnFwd(OUT_A,SPEED_L);
#define turn_SR OnRev(OUT_A,SPEED_L); OnFwd(OUT_C,SPEED_L);
#define turn_SL OnRev(OUT_C,SPEED_L); OnFwd(OUT_A,SPEED_L);
#define go_F OnFwd(OUT_AC,SPEED_H);
#define nMAX 250
#define short_break Off(OUT_AC);Wait(400);
#define CROSS_TIME 400
#define cross_line OnFwd(OUT_A,SPEED_L);OnFwd(OUT_C,SPEED_L);Wait(CROSS_TIME);short_break;
#define cross OnFwd(OUT_C,SPEED_L);OnFwd(OUT_A,SPEED_L);Wait(CROSS_TIME+200);short_break;
#define go_b OnFwd(OUT_A,-40);OnFwd(OUT_C,-40);
#define catch OnFwd(OUT_B,33);Wait(600);Off(OUT_B);
#define throw OnRev(OUT_B,80);Wait(1000);Off(OUT_B);
sub right_n()
{
if (SENSOR_1<BLACK_01) {turn_left;}
else if (SENSOR_1<BLACK_02) {left;}
else if (SENSOR_1<WHITE_01) {go_forward;}
else if (SENSOR_1<WHITE_02) {right;}
else {turn_right;}Wait(STEP);
}
////////////////////////////ryu//////////////////////////////////////////////////////
sub right_n() //
{ //
if (SENSOR_1<BLACK_01) {turn_left;} //
else if (SENSOR_1<BLACK_02) {left;} //
else if (SENSOR_1<WHITE_01) {go_forward;} //
else if (SENSOR_1<WHITE_02) {right;} //
else {turn_right;}Wait(STEP); //
} //
//
sub left_n() //
{ //
if (SENSOR_1<BLACK_01) { //
turn_right; //
} //
else if (SENSOR_1<BLACK_02) { //
right; //
} //
else if (SENSOR_1<WHITE_01) { //
go_forward; //
} //
else if (SENSOR_1<WHITE_02) { //
left; //
} //
else { //
turn_left; //
} //
Wait(STEP); //
} //
/////////////////////////////////////////////////////////////////////////////////////
sub trace_R()
{
int n;
while(true) {
while(n < nMAX) {
if(SENSOR_1 < CENTER-12) {
turn_SL;
n++;
} else {
if(SENSOR_1 < CENTER-6) {
turn_L;
} else if(SENSOR_1 < CENTER+6) {
go_F;
} else if(SENSOR_1 < CENTER+12) {
turn_SL turn_R;
} else {
turn_SR;
}
n=0;
}
Wait(STEP);
}
short_break;
turn_SR;Wait(nMAX*STEP*2);
cross;
n=0;
break;
}
}
sub trace_L()
{
int n = 0;
while(true) {
while(n < nMAX) {
if(SENSOR_1 < CENTER-12) {
turn_SR;
n++;
} else {
if(SENSOR_1 < CENTER-6) {
turn_R;
} else if(SENSOR_1 < CENTER+6) {
go_F;
} else if(SENSOR_1 < CENTER+12) {
turn_L;
} else {
turn_SL;
}
n=0;
}
Wait(STEP);
}
short_break;
turn_SL;Wait(nMAX*STEP);
cross;
n=0;
break;
}
}
sub left_n()
{
if (SENSOR_1<BLACK_01) {
turn_right;
}
else if (SENSOR_1<BLACK_02) {
right;
}
else if (SENSOR_1<WHITE_01) {
go_forward;
}
else if (SENSOR_1<WHITE_02) {
left;
}
else {
turn_left;
}
Wait(STEP);
}
task main()
{
SetSensorLight(S1);
SetSensorLight(S2);
long timess = 0;
/////////////////////////////start///////////////////////////////////
trace_L();
Wait(1000);
go_b;
Wait(950);
turn_SL;
Wait(800);
PlaySound(SOUND_CLICK);//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ブザー1
go_F;
Wait(550);
go_F;
catch;
while(SENSOR_1 > CENTER+8 )
{
Wait(STEP);
}
PlaySound(SOUND_CLICK);//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ブザー2
Off(OUT_AC);
/////////////////////////////ボールキャッチ後///////////////////////////////
go_F;
Wait(90);
turn_SR;
Wait(750);
PlaySound(SOUND_CLICK);//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ブザー3
/////////////////////////////////////////////////////////////////////////////////
//RotateMotor(OUT_C,70,1040);
//go_F;
//Wait(150);
Wait(1000);
//
//Wait(100);
trace_R();
turn_SR;
Wait(700);
trace_L();//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>左側トレース
Wait(1000);
PlaySound(SOUND_CLICK);
PlaySound(SOUND_CLICK);
//////////////////////////////二回目の交差点終了////////////////////////////////
//trace_L();
//////////////////////////////////三回目の交差点認識/////////////////////////
go_b;
Wait(800);
Off(OUT_AC);
Wait(100);
RotateMotor(OUT_A,-70,410);
throw;
RotateMotor(OUT_A,70,470);
go_F;
Wait(200);
///////////////////////////////////一回目の発射/////////////////////////////////(向き直っている)
//turn_SR;
//Wait(500);
timess = CurrentTick();
while(CurrentTick() - timess < 4000) {
left_n();
}
Off(OUT_AC);
Wait(2000);
RotateMotor(OUT_A,-70,440);
Off(OUT_AC);
Wait(10000);
catch;
catch;
RotateMotor(OUT_A,70,440);
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
//""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
go_F;
Wait(1700);
timess = CurrentTick();
Off(OUT_AC);
RotateMotor(OUT_A,-70,460);
Wait(2000);
throw;
//RotateMotor(OUT_C,70,410);
//通信動け
//もう片方の機種が動き出す
//相方機からポジションについた知らせが来る
//ボールを発射する
//2秒回転して90度向きを左に帰る
//相方機がボール発射状態になったこと受け取る
//受け取り状態になったことを伝える。
}
*工夫した点・苦労した点 [#ne959837]
自分が担当した初めのボールを取りにいく部分と初めの投げる角度を調整するところが最も苦労した。
今回のプログラミングでは、出来るだけ一定の動きだけで動けないかということを考えました。今まで使ってきたライントレースのプログラムに加え、ボールを打つ・取るという動作をルーチンとして加えました。このプログラムのまとまりを組み合わせることですべての動作を実現しようとしました。
自分が担当した初めのボールを取りにいく部分と初めの投げる角度を調整するところが最も苦労した。&br;
今回のプログラミングでは、出来るだけ一定の動きだけで動けないかということを考えました。今まで使ってきたライントレースのプログラムに加え、ボールを打つ・取るという動作をルーチンとして加えました。このプログラムのまとまりを組み合わせることですべての動作を実現しようとしました。&br;
最も苦労した部分は最初のボールを取る部分だった。
一度ラインから離れるためその後の動作をどうするかで苦労しました。
何度もライン際の動きを観察しながらもっとも良い動きを試行錯誤した。
最終的に本番ではうまくいって良かった。
最終的に本番ではうまくいって良かった。&br;
また、ボールを投げる動作への移り変わるがなかなか難しかった。
ボールを投げる動作は
機種の向きや投げる強さは何回か繰り替え調整することで出来た。
*反省・感想 [#zb05839e]
最終課題はなかなか難しかった。最終日に空き缶に当てるようにまで改良が出来たが本番では2本パスが通った状態で終了してしまた。
ロボコンでの自分の力を十分に発揮するためには成功する回数を十分にあげる
* [#ze5adc21]
* [#a7ec05e8]
* [#le286421]
* [#tdc3010f]
* [#c315cb3c]
* [#d1b98320]
* [#qfa51a1c]
* [#t1886dd0]
* [#ba3b2da2]
* [#wfb0aea5]
* [#be9d4dad]
* [#o103e358]
* [#hb0a7ce6]
* [#zf4996f4]
* [#q67b5dcd]
* [#y4ceb8f1]
* [#jc52e891]
* [#zad46a16]
* [#o17a377a]
* [#l5e90abb]
* [#g21c4990]
* [#u7b49419]
* [#o60346ba]
* [#z19a93c3]
* [#u23cbe6d]
* [#g98e65ad]
* [#y3786fcf]
ロボコンでの自分の力を十分に発揮するためには事前に成功する確立を十分に上げる必要があると感じた。&br;
今回のようなハード制御のプログラミングは珍しいので特別な経験になって良かった。&br;