[[2013a/Member]]
*ロボ紹介 [#i6275a86]
本体は最初に作った機体をベースに、ボールを蹴る機構を意識して作り、全く同じ機体を二台作った。
出来る限り車体は低く作りたかったが、黒コードをまとめる場所や、蹴りだし機構の潤滑な動きを考慮した結果、少し高めになってしまった。
赤外線センサは、車輪に必要なモーター二つの間に挟み込み、完全に車体に埋め込み、わずかながらではあるが機体のコンパクト化を図った。
私の班のもっとも工夫した点といえる、蹴りだし機構は、車体に長めの棒状パーツを地面と平行に取り付け、そこにモーターを取り付け、モーターの可動部に直接鍵爪状のパーツを取り付けた。
また、そのパーツの先端の両端に小さく、薄い車輪のパーツを取り付け、安定したドリブルができるように工夫した。
しかし、それだけでは機体の速度の変化や方向転換でどうしてもボールがどっかに行ってしまうので、機体に直接、ボールの直径より少し大きめで、長いレールのような二本で一組の補助パーツを取り付けた。
また、機体がパスを受け取りやすいように、その補助パーツの先をY字のようにして少し広くした。
後で説明をするが、ストッパーの為にその二本のレールパーツに直角に交わるように棒状のパーツ一つを取り付け、更にそこに出っ張りが出来るよう、パーツを取り付けた。
**蹴りだし及びドリブル機構 [#gc12b99f]
まず、基本的な動きとしては、モーターを一回転させて、取り付けてあるアームをボールをに当てて蹴りだす仕組み。
これをベースにより安定したドリブルができるよう工夫した。
まず、パスを受け取る時はアームを振り上げた状態にしておき、ストッパーまでボールが来たら、アームをアームを降り下げる。
これによりアームとストッパーでボールを挟み込み、安定化を図る。
因みに、ストッパーに付けた出っ張りはこの時の安定力を更にあげる為の物である。
次に、パスを出す時は最初に述べたように、モーターを一回転させる。
パス受け取り時の安定力が良いせいか、パスの精度は中々のものである。
*プログラム [#laf72158]
#define BLACK_01 27
#define BLACK_02 35
#define WHITE_01 50
#define WHITE_02 58
#define SPEED 38
#define SPEED_H 50
#define SPEED_L 30
#define OnRL(speedR,speedL) OnFwd(OUT_A,speedR);OnFwd(OUT_C,speedL);
#define go_forward OnRL(SPEED,SPEED);
#define turn_right OnRev(OUT_C,SPEED);OnFwd(OUT_A,SPEED);
#define turn_left OnFwd(OUT_C,SPEED);OnRev(OUT_A,SPEED);
#define right Off(OUT_C);OnFwd(OUT_A,SPEED);
#define left OnFwd(OUT_C,SPEED);Off(OUT_A);
#define STEP 1
#define MOVE_TIME 8000
#define shoot OnRev(OUT_B,95);Wait(700);
#define go_b OnFwd(OUT_A,-50);OnFwd(OUT_C,-50);
#define go_F OnFwd(OUT_AC,SPEED_H);
#define turn_R Off(OUT_A); OnFwd(OUT_C,SPEED_L);
#define turn_L Off(OUT_C); OnFwd(OUT_A,SPEED_L);
#define turn_SL OnRev(OUT_C,SPEED_L); OnFwd(OUT_A,SPEED_L);
#define turn_SR OnRev(OUT_A,SPEED_L); OnFwd(OUT_C,SPEED_L);
#define catch OnFwd(OUT_B,33);Wait(600);Off(OUT_B);
#define nMAX 200
#define CENTER 45
#define short_break Off(OUT_AC);Wait(400);
#define cross OnFwd(OUT_C,SPEED_L);OnFwd(OUT_A,SPEED_L);Wait(CROSS_TIME+200);short_break;
#define CROSS_TIME 400
#define white1 39
#define white2 45
#define black1 55
#define black2 63
#define turn_left1 OnFwd(OUT_C,40);Off(OUT_A)
#define turn_left2 OnFwd(OUT_C,40);OnRev(OUT_A,30)
#define turn_right1 OnFwd(OUT_A,40);Off(OUT_C)
#define turn_right2 OnFwd(OUT_A,40);OnRev(OUT_C,20)
#define CCC 14000
#define cross_line OnFwd(OUT_A,SPEED_L);OnFwd(OUT_C,SPEED_L);Wait(CROSS_TIME);short_break;
#define go_R OnFwd(OUT_A,SPEED_H);OnFwd(OUT_C,SPEED_L+10);
#define mMAX 5
sub trace_L()
{
int n;
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_forward;}
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 trace_L_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 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 trace_L_m()
{
if (SENSOR_1 < white1) {turn_left2;}
else if (SENSOR_1 < white2) {turn_left1;}
else if (SENSOR_1 < black1) {go_forward;}
else if (SENSOR_1 < black2) {turn_right1;}
else {turn_right2;}
Wait(STEP);
}
sub trace_L_a()
{
int n;
if(SENSOR_1 < BLACK_01){turn_left;n++;}
else {
if(SENSOR_1 < BLACK_02) {left;n++;}
else if(SENSOR_1 < WHITE_01) {go_forward;}
else if(SENSOR_1 < WHITE_02) {right;}
else {turn_right;}
n=0;
}
Wait(STEP);
}
sub trace_R_n()
{
int n;
if (SENSOR_1<BLACK_01) {turn_right;n++;}
else {
if (SENSOR_1<BLACK_02) {right;n++;}
else if (SENSOR_1<WHITE_01) {go_forward;}
else if (SENSOR_1<WHITE_02) {left;}
else {turn_left;}
n=0;
}
Wait(STEP);
}
task main()
{
SetSensorLight(S1);
long timess = 0;
int nOnline=0;
int n=0;
Wait(40000);
long t3 = CurrentTick();
while(CurrentTick()-t3 < 2000) {trace_R_n();}
Off(OUT_ABC);
Wait(1000);
RotateMotor(OUT_C,70,430);
Off(OUT_AC);
Wait(10000);
OnFwd(OUT_B,33);
Wait(600);
Off(OUT_B);
Wait(2000);
RotateMotor(OUT_A,-70,430);Off(OUT_ABC);Wait(500);
go_R;Wait(800);
Off(OUT_ABC);Wait(500);
PlaySound(SOUND_CLICK);
long t2 = CurrentTick();
while(CurrentTick()-t2 <= 1700){right_n();}
PlaySound(SOUND_CLICK);
Off(OUT_ABC);
Wait(1000);
RotateMotor(OUT_A,70,430);Off(OUT_ABC);Wait(1000);
shoot;
PlaySound(SOUND_CLICK);
Off(OUT_ABC);
long t1 = CurrentTick();
RotateMotor(OUT_A,-70,430);Off(OUT_ABC);Wait(500);
while (CurrentTick()-t1 <= 4800) {trace_L_n();}
PlaySound(SOUND_CLICK);
Off(OUT_ABC);Wait(1000);
RotateMotor(OUT_A,70,430);Off(OUT_ABC);Wait(10000);
OnFwd(OUT_B,33);Wait(700);Off(OUT_ABC);Wait(1000);
RotateMotor(OUT_A,-70,430);
PlaySound(SOUND_CLICK);
Off(OUT_ABC);
Wait(1000);
long t0 = CurrentTick();
while (CurrentTick()-t0 <= MOVE_TIME) {trace_L_n();}
PlaySound(SOUND_CLICK);
Off(OUT_ABC);
Wait(1000);
shoot;
Off(OUT_ABC);
Wait(1000);
PlaySound(SOUND_CLICK);
trace_L();
Off(OUT_ABC);
Wait(1000);
go_b;
Wait(950);
turn_SL;
Wait(600);
PlaySound(SOUND_CLICK);
go_F;
Wait(1600);
catch;
Off(OUT_ABC);
Wait(1500);
turn_left;
Wait(1200);
PlaySound(SOUND_CLICK);
Off(OUT_ABC);
Wait(1000);
trace_L();
Off(OUT_ABC);
}
*感想 [#jde02515]
前回の課題1もだいぶ難しかったが、今回の課題2は1を超越いていた。私の班が5人で本当に良かった。
ただ、班員には早退やてテスト勉強など、沢山の迷惑をかけてしまった。自分はロボット制作の殆どを手がけたので、それがせめてもの罪滅ぼしだと思っている。
また、プログラミングは皆で分担して行ったが、その殆どを鰐川君が自身のテスト勉強やレポートなどの大事な時間を削って手がけてくれた。
本当に申し訳なく思ったし、本当に感謝している。
他には、電池の減りが異常に速く、一日動かしたら次の日は既に減っている状態だった。
殆ど、或は全てのプログラムが時間で制御されている為、この電池の減りは大敵だった。
殆ど、或は全てのプログラムが時間で制御されている為、この電池の減りは大敵だった。買いに行った日の中には生協が閉店間近だったり、開いていない日もあり、電池のせいで時間も金も想像以上に取られた。
遅かれ早かれ自分はプログラミングをする学科に所属している。
このゼミでプログラミングの基礎を学び、興味も持ったので、この夏休みを利用してプログラミングをある程度とこまで学ぼうと思う。