- 追加された行はこの色です。
- 削除された行はこの色です。
目次
#contents
*課題について [#wcb9205d]
課題3については[[2019a/Mission3]]を参照
*ロボットについて [#k89410fd]
**ロボットの全体像 [#k707db65]
基本的に、モーター二つを使って走る。LとL'については前に取り付けたアームでつかみ、プラ容器を右側に取り付けたアームでつかむ。プラ容器を持ち上げたまま、トレースをしていく。ボールを入れるプラ容器に沿って、車体を横向きにつけ、最後に、一気にプラ容器を持ち上げることで、車体の上を転がっていき、ボールをゴール地点のプラ容器の中に入れることができる。練習段階で、トレースをする際に車輪の幅が広くなってしまい、カーブが曲がりきれないことが多かった。そのためできる限りセンサーと車体の間隔を狭めることで、急なカーブにも対応できるようにした。また、センサー同士の幅を狭めたことで交差点でのトレースを正確に行えるようにした。前に取り付けたアームは、横から挟み込むようにボールをつかむ。センサーに当たらないように車体の前の方で上げ下げを行うが、重心が前にいき過ぎないよう工夫した。
#ref(1565703255698.jpg);
#ref(1565703306459.jpg);
#ref(1565703262042.jpg);
*プログラムについて [#p7f35d50]
**マスター側のプログラム [#vafa3ddd]
***定義したプログラム [#jf5f2e46]
#define BLACKS 38
#define BLACK 45
#define THRESHOLD 53
#define WHITE 60
#define WHITES 68
#define left_s OnFwd(OUT_A,60);OnRev(OUT_B,60);
#define left OnFwd(OUT_A,60);Off(OUT_B);
#define right_s OnFwd(OUT_B,60);OnRev(OUT_A,90);
#define right OnFwd(OUT_B,60);Off(OUT_A);
#define forward OnFwd(OUT_AB,60);
#define back OnRev(OUT_AB,60);
#define CONN 1
#define SIGNALON1 10
#define SIGNALOFF1 11
#define SIGNALON2 20
#define SIGNALOFF2 21
#define SIGNALON3 30
#define SIGNALOFF3 31
#define HALF 1900
#define QUARTER 220
****#defineの中身 [#tfa7b14e]
left_s:両タイヤで左折
left:右タイヤで左折
right_s:両タイヤで右折
right:左タイヤで右折
forward:前進
back:後進
***サブルーチン[#yf007d05]
sub follow_line_left() //ラインの左側をトレースし、交差点で停止
{
SetSensorLight(S1);
SetSensorLight(S2);
long t0=0,t1=0,stop_time=1;
while(t1-t0<stop_time){
if((SENSOR_1<BLACKS)&&(SENSOR_2<BLACKS)){ //二個のセンサーが黒を感知
t0=CurrentTick();
forward;
until((SENSOR_1<THRESHOLD)&&(SENSOR_2<THRESHOLD)); //二個のセンサーが灰色を感知
t1=CurrentTick();
}else if(SENSOR_1<BLACKS){
left_s;
}else if(SENSOR_1<BLACK){
left;
}else if(SENSOR_1<THRESHOLD){
forward;
}else if(SENSOR_1<WHITE){
right;
}else if(SENSOR_1<WHITES){
right_s;
}
}
Off(OUT_AB);
Wait(1000);
}
sub follow_line_right() //ラインの右側をトレースし、交差点で停止
{
SetSensorLight(S1);
SetSensorLight(S2);
long t0=0,t1=0,stop_time=1;
while(t1-t0<stop_time){
if((SENSOR_1<BLACKS)&&(SENSOR_2<BLACKS)){
t0=CurrentTick();
forward;
until((SENSOR_1<THRESHOLD)&&(SENSOR_2<THRESHOLD));
t1=CurrentTick();
}else if(SENSOR_2<BLACKS){
right_s;
}else if(SENSOR_2<BLACK){
right;
}else if(SENSOR_2<THRESHOLD){
forward;
}else if(SENSOR_2<WHITE){
left;
}else if(SENSOR_2<WHITES){
left_s;
}
}
Off(OUT_AB);
Wait(1000);
}
sub follow_line_back() //ラインの右側をトレースし、交差点で停止
{
SetSensorLight(S1);
SetSensorLight(S2);
long t0=0,t1=0,stop_time=1;
while(t1-t0<stop_time){
if((SENSOR_1<BLACKS)&&(SENSOR_2<BLACKS)){
t0=CurrentTick();
back;
until((SENSOR_1<THRESHOLD)&&(SENSOR_2<THRESHOLD));
t1=CurrentTick();
}else if(SENSOR_2<BLACKS){
right_s;
}else if(SENSOR_2<BLACK){
right;
}else if(SENSOR_2<THRESHOLD){
back;
}else if(SENSOR_2<WHITE){
left;
}else if(SENSOR_2<WHITES){
left_s;
}
}
Off(OUT_AB);
Wait(1000);
}
sub start_right()//右旋回
{
right;
Wait(100);
}
sub start_left()//左旋回
{
left;
Wait(100);
}
sub across()//ライン上をまっすぐ進み、外れると停止
{
SetSensorLight(S1);
SetSensorLight(S2);
long t0=0,t1=0,stop_time=1;
while(t1-t0<stop_time){
if((SENSOR_1<BLACKS)&&(SENSOR_2<BLACKS)){
t0=CurrentTick();
forward;
until((SENSOR_1<THRESHOLD)&&(SENSOR_2<THRESHOLD));
t1=CurrentTick();
}else if(SENSOR_1<WHITES){
forward;
}
}
Off(OUT_AB);
Wait(1000);
}
sub send_msg1()//
{
int msg;
while(msg!=SIGNALOFF1){
SendRemoteNumber(CONN,MAILBOX1,SIGNALON1);
ReceiveRemoteNumber(MAILBOX1,true,msg);
}
}
sub send_msg2()
{
int msg;
while(msg!=SIGNALOFF2){
SendRemoteNumber(CONN,MAILBOX2,SIGNALON2);
ReceiveRemoteNumber(MAILBOX2,true,msg);
}
}
***走るプログラム [#c05d5a88]
task main()
{
follow_line_left();
right_s;
Wait(200);
forward;
Wait(900);
Off(OUT_AB);
send_msg1();
right_s;
Wait(HALF);
follow_line_right();
send_msg2();
}
**スレーブ側のプログラム [#b121a67d]
***定義したプログラム [#e79c51f6]
#define CONN 1
#define SIGNALON1 10
#define SIGNALOFF1 11
#define SIGNALON2 20
#define SIGNALOFF2 21
#define SIGNALON3 30
#define SIGNALOFF3 31
***サブルーチン [#wd060e25]
sub ball_catch1()//前のアームでボールをつかみ、持ち上げる
{
OnFwd(OUT_A,40);
Wait(200);
OnRev(OUT_B,50);
Wait(500);
OnRev(OUT_A,60);
Wait(700);
Off(OUT_AB);
}
sub ball_throw1()//ボールを持っていたアームを下げ、プラ容器の中に入れる
{
OnFwd(OUT_A,40);
Wait(100);
OnFwd(OUT_B,50);
Wait(500);
OnRev(OUT_A,60);
Wait(700);
Off(OUT_AB);
}
sub ball_catch2()//プラ容器をつかむ
{
OnRev(OUT_C,50);
Wait(150);
Off(OUT_C);
}
sub receive_msg1()
{
int msg;
while(msg!=SIGNALON1){
ReceiveRemoteNumber(MAILBOX1,true,msg); //msgが空の間,MAILBOX1にmsgを受信し続ける
}
ball_catch1();
PlaySound(SOUND_UP);
SendResponseNumber(MAILBOX1,SIGNALOFF1);//親機MAILBOX1にSIGNALOFF1を送る
}
sub receive_msg2()
{
int msg;
while(msg!=SIGNALON2){
ReceiveRemoteNumber(MAILBOX2,true,msg); //msgが空の間,MAILBOX1にmsgを受信し続ける
}
ball_throw1();
PlaySound(SOUND_UP);//通信が成功したときの確認用
SendResponseNumber(MAILBOX2,SIGNALOFF2);//親機MAILBOX1にSIGNALOFF1を送る
}
***走るプログラム [#r2f89303]
task main()
{
receive_msg1();
receive_msg2();
}
*まとめ [#bbf3a5c0]
ロボットに関しては、早い段階で方向性が決まったことで、すぐに作り上げることができた。しかしプログラムに関してはあまり上手くいかず、ロボットの大きさや重さに合わせることが非常に難しかった。それでも練習段階で成功することができたので、そこから成功率を上げるための工夫が足らなかったと思う。本番に向けた対策を怠らなければ、今までやってきたことを遺憾なく発揮できたと思う。