- 追加された行はこの色です。
- 削除された行はこの色です。
[[2018b/Member]]
目次
#contents
*課題3 [#r2136047]
*ロボット本体の工夫 [#j1881746]
**車体、各センサー(マスター担当) [#hf0b6f0c]
タイヤを動かすためのモーター二つでアーム用のモーターを挟んで固定した。
また、前方に光センサーを取り付けたが、説明書よりもタイヤ間の幅が広かったため光センサーを二個付けた。超音波センサーはアーム側を固定するパーツからアームを邪魔しないギリギリのところまで伸ばした。NXT本体は邪魔にならない程度に取り付けた。工夫として余ったパーツでコードを束ねられるようにした。
**アーム(スレーブ担当) [#e65c1e1f]
ボールをつかむアーム(手)と手を持ち上げるアーム(腕)で構成した。
ボールをつかむ仕組みは
**全体的なバランス [#f6cd0236]
*プログラムについて [#ze9a629c]
**マスター側のプログラム [#e8b186b0]
#define CONN 1
#define SIGNALA 11
#define SIGNALB 12
#define SIGNALC 13
#define SIGNALD 14
#define SIGNALE 15
#define SIGNALF 16
#define SIGNALG 17
#define THRESHOLD 57
#define SPEED 50
#define speed 40
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OUT_C,speedL);
#define leftleft OnRL(speed,0);
#define left OnRL(speed,0);
#define straight OnRL(SPEED,SPEED);
#define right OnRL(0,speed+5);
#define rightright OnRL(-speed,speed+5);
#define MOVE_TIME_1 3000
#define MOVE_TIME_2 22500
#define MOVE_TIME_3 2000
#define zenshin OnFwd(OUT_B,speed);OnFwd(OUT_C,speed+6);
#define koutai OnRev(OUT_B,speed-10);OnRev(OUT_C,speed-4);
#define teishi Off(OUT_BC);
#define kaiten_R1 OnFwd(OUT_B,SPEED);OnRev(OUT_C,SPEED);
#define kaiten_R2 OnFwd(OUT_B,speed);OnRev(OUT_C,speed);
#define kaiten_L1 OnRev(OUT_B,SPEED);OnFwd(OUT_C,SPEED);
#define kaiten_L2 OnRev(OUT_B,SPEED);OnFwd(OUT_C,SPEED);
#define kaiten_time_R1 2500
#define kaiten_time_L1 1500
#define KAITEN RotateMotorEx(OUT_BC,50,400,100,true,false);
#define go_forward OnRL(SPEED,SPEED);
#define STEP 1
#define yasumi Off(OUT_BC);Wait(500);
sub serch_R1()
{
SetSensorLowspeed(S4);
long t10,t11;
int L=1000;
t10=CurrentTick();
while(CurrentTick()-t10<=kaiten_time_R1){
kaiten_R1;
if(SensorUS(S4)<L)
{
L=SensorUS(S4);
t11=CurrentTick()-t10;
}
}
kaiten_L1;
Wait(kaiten_time_R1-t11+100);
Off(OUT_BC);
Wait(500);
}
inline sub serch_R2(int l)
{
SetSensorLowspeed(S4);
kaiten_R1
until(SensorUS(S4)<=l);
Off(OUT_BC);
}
sub serch_L()
{
SetSensorLowspeed(S4);
long t12,t13;
int L=1000;
t12=CurrentTick();
while(CurrentTick()-t12<=kaiten_time_L1){
kaiten_L1;
if(SensorUS(S4)<L)
{
L=SensorUS(S4);
t13=CurrentTick()-t12;
}
}
kaiten_R1;
Wait(kaiten_time_L1-t13+80);
Off(OUT_BC);
Wait(500);
}
inline void sekkin(int d)
{
SetSensorLowspeed(S4);
while(SensorUS(S4)>=d){
koutai;
}
teishi;
}
sub LT_R()
{
SetSensorLight(S3);
long t0=CurrentTick();
while(CurrentTick()-t0<=MOVE_TIME_2){
if(SENSOR_3<THRESHOLD-10){
rightright;
}else if(SENSOR_3<THRESHOLD-7){
right;
}else if(SENSOR_3<THRESHOLD+2){
straight;
}else if(SENSOR_3<THRESHOLD+3){
left;
}else{
leftleft;
}
Wait(STEP);
}
}
task main()
{
SetSensorLight(S2);
SetSensorLight(S3);
SetSensorLowspeed(S4);
OnRev(OUT_BC,30);
Wait(500);
teishi;
int msg;
SendRemoteNumber(CONN,MAILBOX1,SIGNALA);
while(true){
ReceiveRemoteNumber(MAILBOX1,true,msg);
if(msg==SIGNALE){
koutai;
Wait(MOVE_TIME_1);
KAITEN;
teishi;
yasumi;
LT_R();
teishi;
serch_R1();
teishi;
sekkin(15);
koutai;
Wait(1000);
teishi;
SendRemoteNumber(CONN,MAILBOX1,SIGNALB);
}
if(msg==SIGNALF){
zenshin;
Wait(MOVE_TIME_3);
kaiten_R1;
Wait(100);
yasumi;
serch_R2(25);
yasumi;
zenshin;
Wait(500);
sekkin(10);
yasumi;
SendRemoteNumber(CONN,MAILBOX1,SIGNALC);
}
if(msg==SIGNALG){
koutai;
Wait(3000);
kaiten_R1;
Wait(500);
serch_L();
teishi;
sekkin(15);
teishi;
koutai;
Wait(1000);
SendRemoteNumber(CONN,MAILBOX1,SIGNALD);
teishi;
}
}
}
**スレーブ側のプログラム [#ycdd4674]
#define POWER 50
#define Power 25
#define power 15
#define time 300
#define Time 600
#define TIME 1000
#define hand_catch OnRev(OUT_B,POWER);Wait(Time);Off(OUT_B);
#define arm_Up OnFwd(OUT_C,POWER);Wait(TIME);Off(OUT_C);
#define hand_release OnFwd(OUT_B,power);Wait(TIME);Off(OUT_B);
#define arm_Down OnRev(OUT_C,POWER);Wait(Time+200);Off(OUT_C);
#define arm_up OnFwd(OUT_C,POWER);Wait(Time);Off(OUT_C);
#define arm_down OnRev(OUT_C,Power);Wait(Time);Off(OUT_C);
#define yasumi Off(OUT_BC);Wait(500);
#define SIGNALA 11
#define SIGNALB 12
#define SIGNALC 13
#define SIGNALD 14
#define SIGNALE 15
#define SIGNALF 16
#define SIGNALG 17
sub ball_catch()
{
Wait(Time);
arm_Down;
hand_catch;
arm_Up;
Off(OUT_BC);
}
sub ball_release()
{
Wait(Time);
arm_down;
yasumi;
hand_release;
arm_up;
Off(OUT_BC);
}
task main()
{
int msg;
while(true){
ReceiveRemoteNumber(MAILBOX1,true,msg);
if(msg==SIGNALA){
ball_catch();
Off(OUT_BC);
SendResponseNumber(MAILBOX1,SIGNALE);
}
if(msg==SIGNALB){
yasumi;
ball_release();
yasumi;
SendResponseNumber(MAILBOX1,SIGNALF);
}
if(msg==SIGNALC){
ball_catch();
Off(OUT_BC);
SendResponseNumber(MAILBOX1,SIGNALG);
}
if(msg==SIGNALD){
yasumi;
ball_release();
yasumi;
}
}
}
**全体の流れ [#w87a75f4]
*本体、プログラムの改善点 [#wf6af1b1]
*感想、反省 [#y1e223df]