2019a/Member/Yuta/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2019a/Member]]
目次
#contents
*課題について [#v7f72e33]
詳しくはリンクを参照[[2019a/Mission3]]
*ロボットについて [#s311aae2]
今回のロボットは,2つのNXTを通信させることでモーターを4...
#ref(./s_S__46137369.jpg)
#ref(./s_S__46137370.jpg)
↑機体を前方から撮影した図
#ref(./s_S__46137371.jpg)
↑機体を後方から撮影した図
#ref(./s_S__46137368.jpg)
↑アームを上下させる部分の図
**センサーの取付け位置 [#p951d4cb]
明るさを読み取るための光センサーをロボットに取り付ける際...
また,センサーの取り付け位置をタイヤの軸にできるだけ近づ...
**アームについて [#x6afe20f]
このロボットでは,ボールをきれいにつかめるように開閉する...
開閉するアームは,同じ大きさのギアをつなげ一つのモーター...
アームを上下させる機構は,ひし形の角の点を回転させること...
また,モーターを直に取り付けて上下させようとすると先端に...
*プログラミングについて [#k0cfaf75]
このロボットは,2つのNXT(マスター側とスレイブ側)で通信...
今回作ったプログラムではライントレースする際判定をより繊...
,センサーの値を5段階で判定した.
まずNXTのモニター機能でセンサーが完全に黒の線上にある時と...
次に,bkackから+5の値までを黒寄りの灰色,whiteから−5の...
**マスター側のプログラム [#z1c84b5d]
***定義 [#t1ad70b0]
まずdefineで次のように定義した.
#define black 30 ...
#define white 50 ...
#define speedH 60 ...
#define speedL 30 ...
#define speedM 20 ...
#define mae OnFwd(OUT_BC,speedH); ...
#define ushiro OnRev(OUT_BC,speedH); ...
#define turnRRR OnFwd(OUT_C,speedH);OnRev(OUT_B,speedM);...
#define turnLLL OnFwd(OUT_C,speedH);OnRev(OUT_C,speedM);...
#define turnRR OnFwd(OUT_C,speedH);Off(OUT_B); ...
#define turnLL OnFwd(OUT_B,speedH);Off(OUT_C); ...
#define turnR OnFwd(OUT_C,speedH);OnFwd(OUT_B,speedL); ...
#define turnL OnFwd(OUT_B,speedH);OnFwd(OUT_C,speedL); ...
#define step 1 ...
#define jikan 100 ...
#define teishi Off(OUT_BC);Wait(300); ...
#define CONN 1 ...
#define SIGNAL1 11 ...
#define SIGNAL2 12 ...
#define SIGNAL3 13 ...
#define SIGNAL4 14 ...
#define curveL OnFwd(OUT_B,20);OnRev(OUT_C,10); ...
***直線のライントレース(交差点に差し掛かるとループから抜...
このプログラムではラインの左側をトレースしている.
トレースをする際黒のライン上にいるときは左に曲がるように...
CurrentTickを使うこととによって完全に黒い線上にいる時間を...
ここでは黒でいる時間の上限をt_maxとし,そこにjikanの値を...
void linetraceS() //完全に黒がjikan...
{
long t0=0,t_black=0,t_max=jikan;
t0=CurrentTick();
while(t_black<t_max){ //t_blackがt_max...
if(SENSOR_3>white){ //完全に白のとき
turnRR; //右曲がり
} else if(SENSOR_3>white-5){ //白よりの灰色の...
turnR; //緩い右曲がり
} else if(SENSOR_3>black+5){ //灰色のとき
mae; //前進
} else if(SENSOR_3>black){ //黒寄りの灰色の...
turnL; //緩い左曲がり
} else{ //完全に黒のとき
turnLL; //左曲がり
t0=CurrentTick(); //現在時間をt0と...
until((SENSOR_3<black+5)&&(SENSOR_3>black));//...
t_black=CurrentTick()-t0; //現在時刻からt0...
}
Wait(step);
}
}
***カーブのときのライントレース(交差点に差し掛かるとルー...
交差点の判断は直進のときと同様の方法で行っている.
基本的には直線のときと同じ条件での構成になるが,今回制作...
void linetraceS() //完全に黒がjikan...
{
long t0=0,t_black=0,t_max=jikan;
t0=CurrentTick();
while(t_black<t_max){ //t_blackがt_max...
if(SENSOR_3>white){ //完全に白のとき
turnRRR; //キツい右曲がり
} else if(SENSOR_3>white-5){ //白よりの灰色の...
turnRR; //右曲がり
} else if(SENSOR_3>black+5){ //灰色のとき
mae; //前進
} else if(SENSOR_3>black){ //黒寄りの灰色の...
turnLL; //左曲がり
} else{ //完全に黒のとき
turnLLL; //キツい左曲がり
t0=CurrentTick(); //現在時間をt0と...
until((SENSOR_3<black+5)&&(SENSOR_3>black));//...
t_black=CurrentTick()-t0; //現在時刻からt0...
}
Wait(step);
}
}
***交差点を直進して突破するサブルーチン [#tb79d878]
前に示した2つのサブルーチンでは,完全に黒でいる時間が長...
その状況を突破するために,まず白よりの灰色になるまで前進...
void crossline()
{
mae; //前進
until(SENSOR_3>white-5);//白よりのグレーまで
turnRR; //右曲がり
until(SENSOR_3<black); //黒寄りのグレーまで
}
***交差点を曲がるサブルーチン [#oeacb03d]
・右に曲がるときのサブルーチン
このときも同様に右斜め前を向いて始まるので,そこから完全...
void Rcurve()
{
turnRRR; //キツい右曲がり
until(SENSOR_3>white); //完全に白になるまで
}
・左に曲がるときのサブルーチン
このときもやはり斜め右を向いた状態から始まるので,そのま...
void Lcurve()
{
curveL; //左曲がり
until(SENSOR_3>white); //完全に白になるまで
}
***回転するサブルーチン [#x94161f2]
コースのL・L'の地点において,ボールを掴んだあと道を引き返...
ボール回収後,ラインから外れるために一度前進しその後ライ...
void kaiten()
{
mae;
Wait(900);
OnFwd(OUT_C,20);OnRev(OUT_B,10);
until(SENSOR_3<black+5);
}
***ボールを掴む・離す際のサブルーチン(マスター側) [#k3b...
このロボットは,ボールを掴んで離す一連の動作をスレイブ側...
ここでは信号の混線を避けるため,掴む動作と離す動作で異な...
・ボールを掴む際のサブルーチン
掴む際マスターとスレイブでやり取りする信号をmsg1としてそ...
void catch()
{
int msg1; //msg1...
SendRemoteNumber(CONN,MAILBOX1,SIGNAL1); //CONN(...
while(msg1!=SIGNAL2){ //msg1...
ReceiveRemoteNumber(MAILBOX1,true,msg1); //MAILB...
Off(OUT_BC); //ルー...
}
}
・ボールを離す際のサブルーチン
離す際マスターとスレイブでやり取りする信号をmsg2としてそ...
void release()
{
int msg2; //msg2を...
SendRemoteNumber(CONN,MAILBOX2,SIGNAL3); //スレイ...
while(msg2!=SIGNAL4){ //msg2の...
ReceiveRemoteNumber(MAILBOX2,true,msg2);//MAILBO...
Off(OUT_BC); //ループ...
}
}
***プログラム全体 [#r730834f]
今回の課題では,箱に入っているボールは一つだけのとき位置...
task main()
{
SetSensorLight(S3);
mae; //前進
Wait(300);
linetraceC(); //M to K
Lcurve(); //箱の方に向...
linetraceC(); //K to J
OnRev(OUT_C,speedL); //向きの微調整
Wait(500); //上に同じ
catch(); //ボールを掴む
linetraceC(); //J to I
Lcurve(); //Iの方に向き...
linetraceC(); //I to C
Lcurve(); //Bの方に向き...
linetraceS(); //C to B
Rcurve(); //中央の線の...
linetraceC(); //B to 中央の線
Rcurve(); //A'の方に向...
linetraceS(); //to A'
Lcurve(); //B'の方に向...
linetraceC(); //to B'
Lcurve(); //C'の方に向...
linetraceS(); //B' to D'
Rcurve(); //H'の方に向...
linetraceC(); //D' to H'
OnRev(OUT_C,speedL); //向きの微調整
Wait(500); //上に同じ
release(); //ボールをは...
ushiro; //H'toD'
Wait(2000);
OnFwd(OUT_C,20);OnRev(OUT_B,10); //D'で回転
until(SENSOR_3>white-5); //白よりの灰...
linetraceC(); //D'toC'
crossline(); //C'
linetraceS(); //C'toB'
Lcurve(); //B'
linetraceS(); //B'toM'
Rcurve(); //B'とM'の間...
linetraceS(); //B'toM'
Lcurve(); //M'
linetraceC(); //M'toK'
crossline(); //K'
OnFwd(OUT_BC,30);Wait(2900);Off(OUT_BC);//2900の時間...
catch(); //L'でボール...
OnRev(OUT_BC,30);Wait(2900);Off(OUT_BC);//2900の時間...
Lcurve(); //K'で左曲がり
linetraceS(); //K'toJ'
release(); //J'でボール...
ushiro; //後退
Wait(2000); //2000の時間
OnFwd(OUT_C,20);OnRev(OUT_B,10); //K'で回転
until(SENSOR_3>white-5); //白よりの灰...
linetraceC(); //K'toM'
Rcurve(); //M'
linetraceS(); //M'toM'とBの...
Lcurve(); //M'とBの間の角
linetraceS(); //to二枚の間...
Rcurve(); //二枚の間の...
linetraceS(); //間の線上
Lcurve(); //間の先から...
linetraceS(); //toB
crossline(); //B
linetraceS(); //BtoM
Lcurve(); //M
linetraceC(); //MtoK
crossline(); //K
linetraceS(); //KtoL
Wait(2900); //2900の時間
catch(); //Lでボールを...
kaiten(); //Lで回転
linetraceC(); //LtoM
Rcurve(); //M
linetraceS(); //toBとMの間...
Lcurve(); //BとMの間の角
linetraceS(); //to二枚の間...
Rcurve(); //二枚の間の...
linetraceS(); //間の線上
Lcurve(); //間の先から...
linetraceS(); //toB'
Lcurve(); //B'
linetraceS(); //B'toD'
Rcurve(); //D'
linetraceS(); //D'toH'
release(); //H'でボール...
}
**スレイブ側のプログラム [#red22c09]
***定義 [#i1135d38]
#defineで次のように定義した
#define SIGNAL1 11 //マスターとやり取りする信号の番号
#define SIGNAL2 12 //同上
#define SIGNAL3 13 //同上
#define SIGNAL4 14 //同上
#define tukamu OnRev(OUT_A,20);Wait(800);//ボールを掴む
#define hanasu OnFwd(OUT_A,20);Wait(300);//ボールを落とす
#define up OnFwd(OUT_B,50);Wait(1800);//アームを上げる
#define down OnRev(OUT_B,50);Wait(900);//アームを下ろす
***プログラム全体 [#t4b8d068]
マスター側と同様,掴むときの変数をmsg1,信号をSIGNAL1,SIG...
task main ()
{
int msg1; // 受け取った値を格納する変数
int msg2; // 同上
while(true){
ReceiveRemoteNumber(MAILBOX1,true,msg1);//MAILBOX...
ReceiveRemoteNumber(MAILBOX2,true,msg2);//MAILBOX...
if(msg1==SIGNAL1){ //msg1にS...
down;
tukamu;
up;
Off(OUT_AB); //モータ...
SendResponseNumber(MAILBOX1,SIGNAL2);//マスタ...
}
if(msg2==SIGNAL3){ //msg2にS...
hanasu;
Off(OUT_A); //モータ...
SendResponseNumber(MAILBOX2,SIGNAL4);//マスタ...
}
}
}
*感想・反省点 [#oec31ff0]
今回初めて扱ったNXT間での通信は手こずったが,最終的にうま...
アーム部分や移動する部分などの機体は頑丈でしっかり動くよ...
しかし,本番直前にセンサーの位置を変更しそれに対応したプ...
また,チームで分担してプログラミングを行ったのだが,各自...
終了行:
[[2019a/Member]]
目次
#contents
*課題について [#v7f72e33]
詳しくはリンクを参照[[2019a/Mission3]]
*ロボットについて [#s311aae2]
今回のロボットは,2つのNXTを通信させることでモーターを4...
#ref(./s_S__46137369.jpg)
#ref(./s_S__46137370.jpg)
↑機体を前方から撮影した図
#ref(./s_S__46137371.jpg)
↑機体を後方から撮影した図
#ref(./s_S__46137368.jpg)
↑アームを上下させる部分の図
**センサーの取付け位置 [#p951d4cb]
明るさを読み取るための光センサーをロボットに取り付ける際...
また,センサーの取り付け位置をタイヤの軸にできるだけ近づ...
**アームについて [#x6afe20f]
このロボットでは,ボールをきれいにつかめるように開閉する...
開閉するアームは,同じ大きさのギアをつなげ一つのモーター...
アームを上下させる機構は,ひし形の角の点を回転させること...
また,モーターを直に取り付けて上下させようとすると先端に...
*プログラミングについて [#k0cfaf75]
このロボットは,2つのNXT(マスター側とスレイブ側)で通信...
今回作ったプログラムではライントレースする際判定をより繊...
,センサーの値を5段階で判定した.
まずNXTのモニター機能でセンサーが完全に黒の線上にある時と...
次に,bkackから+5の値までを黒寄りの灰色,whiteから−5の...
**マスター側のプログラム [#z1c84b5d]
***定義 [#t1ad70b0]
まずdefineで次のように定義した.
#define black 30 ...
#define white 50 ...
#define speedH 60 ...
#define speedL 30 ...
#define speedM 20 ...
#define mae OnFwd(OUT_BC,speedH); ...
#define ushiro OnRev(OUT_BC,speedH); ...
#define turnRRR OnFwd(OUT_C,speedH);OnRev(OUT_B,speedM);...
#define turnLLL OnFwd(OUT_C,speedH);OnRev(OUT_C,speedM);...
#define turnRR OnFwd(OUT_C,speedH);Off(OUT_B); ...
#define turnLL OnFwd(OUT_B,speedH);Off(OUT_C); ...
#define turnR OnFwd(OUT_C,speedH);OnFwd(OUT_B,speedL); ...
#define turnL OnFwd(OUT_B,speedH);OnFwd(OUT_C,speedL); ...
#define step 1 ...
#define jikan 100 ...
#define teishi Off(OUT_BC);Wait(300); ...
#define CONN 1 ...
#define SIGNAL1 11 ...
#define SIGNAL2 12 ...
#define SIGNAL3 13 ...
#define SIGNAL4 14 ...
#define curveL OnFwd(OUT_B,20);OnRev(OUT_C,10); ...
***直線のライントレース(交差点に差し掛かるとループから抜...
このプログラムではラインの左側をトレースしている.
トレースをする際黒のライン上にいるときは左に曲がるように...
CurrentTickを使うこととによって完全に黒い線上にいる時間を...
ここでは黒でいる時間の上限をt_maxとし,そこにjikanの値を...
void linetraceS() //完全に黒がjikan...
{
long t0=0,t_black=0,t_max=jikan;
t0=CurrentTick();
while(t_black<t_max){ //t_blackがt_max...
if(SENSOR_3>white){ //完全に白のとき
turnRR; //右曲がり
} else if(SENSOR_3>white-5){ //白よりの灰色の...
turnR; //緩い右曲がり
} else if(SENSOR_3>black+5){ //灰色のとき
mae; //前進
} else if(SENSOR_3>black){ //黒寄りの灰色の...
turnL; //緩い左曲がり
} else{ //完全に黒のとき
turnLL; //左曲がり
t0=CurrentTick(); //現在時間をt0と...
until((SENSOR_3<black+5)&&(SENSOR_3>black));//...
t_black=CurrentTick()-t0; //現在時刻からt0...
}
Wait(step);
}
}
***カーブのときのライントレース(交差点に差し掛かるとルー...
交差点の判断は直進のときと同様の方法で行っている.
基本的には直線のときと同じ条件での構成になるが,今回制作...
void linetraceS() //完全に黒がjikan...
{
long t0=0,t_black=0,t_max=jikan;
t0=CurrentTick();
while(t_black<t_max){ //t_blackがt_max...
if(SENSOR_3>white){ //完全に白のとき
turnRRR; //キツい右曲がり
} else if(SENSOR_3>white-5){ //白よりの灰色の...
turnRR; //右曲がり
} else if(SENSOR_3>black+5){ //灰色のとき
mae; //前進
} else if(SENSOR_3>black){ //黒寄りの灰色の...
turnLL; //左曲がり
} else{ //完全に黒のとき
turnLLL; //キツい左曲がり
t0=CurrentTick(); //現在時間をt0と...
until((SENSOR_3<black+5)&&(SENSOR_3>black));//...
t_black=CurrentTick()-t0; //現在時刻からt0...
}
Wait(step);
}
}
***交差点を直進して突破するサブルーチン [#tb79d878]
前に示した2つのサブルーチンでは,完全に黒でいる時間が長...
その状況を突破するために,まず白よりの灰色になるまで前進...
void crossline()
{
mae; //前進
until(SENSOR_3>white-5);//白よりのグレーまで
turnRR; //右曲がり
until(SENSOR_3<black); //黒寄りのグレーまで
}
***交差点を曲がるサブルーチン [#oeacb03d]
・右に曲がるときのサブルーチン
このときも同様に右斜め前を向いて始まるので,そこから完全...
void Rcurve()
{
turnRRR; //キツい右曲がり
until(SENSOR_3>white); //完全に白になるまで
}
・左に曲がるときのサブルーチン
このときもやはり斜め右を向いた状態から始まるので,そのま...
void Lcurve()
{
curveL; //左曲がり
until(SENSOR_3>white); //完全に白になるまで
}
***回転するサブルーチン [#x94161f2]
コースのL・L'の地点において,ボールを掴んだあと道を引き返...
ボール回収後,ラインから外れるために一度前進しその後ライ...
void kaiten()
{
mae;
Wait(900);
OnFwd(OUT_C,20);OnRev(OUT_B,10);
until(SENSOR_3<black+5);
}
***ボールを掴む・離す際のサブルーチン(マスター側) [#k3b...
このロボットは,ボールを掴んで離す一連の動作をスレイブ側...
ここでは信号の混線を避けるため,掴む動作と離す動作で異な...
・ボールを掴む際のサブルーチン
掴む際マスターとスレイブでやり取りする信号をmsg1としてそ...
void catch()
{
int msg1; //msg1...
SendRemoteNumber(CONN,MAILBOX1,SIGNAL1); //CONN(...
while(msg1!=SIGNAL2){ //msg1...
ReceiveRemoteNumber(MAILBOX1,true,msg1); //MAILB...
Off(OUT_BC); //ルー...
}
}
・ボールを離す際のサブルーチン
離す際マスターとスレイブでやり取りする信号をmsg2としてそ...
void release()
{
int msg2; //msg2を...
SendRemoteNumber(CONN,MAILBOX2,SIGNAL3); //スレイ...
while(msg2!=SIGNAL4){ //msg2の...
ReceiveRemoteNumber(MAILBOX2,true,msg2);//MAILBO...
Off(OUT_BC); //ループ...
}
}
***プログラム全体 [#r730834f]
今回の課題では,箱に入っているボールは一つだけのとき位置...
task main()
{
SetSensorLight(S3);
mae; //前進
Wait(300);
linetraceC(); //M to K
Lcurve(); //箱の方に向...
linetraceC(); //K to J
OnRev(OUT_C,speedL); //向きの微調整
Wait(500); //上に同じ
catch(); //ボールを掴む
linetraceC(); //J to I
Lcurve(); //Iの方に向き...
linetraceC(); //I to C
Lcurve(); //Bの方に向き...
linetraceS(); //C to B
Rcurve(); //中央の線の...
linetraceC(); //B to 中央の線
Rcurve(); //A'の方に向...
linetraceS(); //to A'
Lcurve(); //B'の方に向...
linetraceC(); //to B'
Lcurve(); //C'の方に向...
linetraceS(); //B' to D'
Rcurve(); //H'の方に向...
linetraceC(); //D' to H'
OnRev(OUT_C,speedL); //向きの微調整
Wait(500); //上に同じ
release(); //ボールをは...
ushiro; //H'toD'
Wait(2000);
OnFwd(OUT_C,20);OnRev(OUT_B,10); //D'で回転
until(SENSOR_3>white-5); //白よりの灰...
linetraceC(); //D'toC'
crossline(); //C'
linetraceS(); //C'toB'
Lcurve(); //B'
linetraceS(); //B'toM'
Rcurve(); //B'とM'の間...
linetraceS(); //B'toM'
Lcurve(); //M'
linetraceC(); //M'toK'
crossline(); //K'
OnFwd(OUT_BC,30);Wait(2900);Off(OUT_BC);//2900の時間...
catch(); //L'でボール...
OnRev(OUT_BC,30);Wait(2900);Off(OUT_BC);//2900の時間...
Lcurve(); //K'で左曲がり
linetraceS(); //K'toJ'
release(); //J'でボール...
ushiro; //後退
Wait(2000); //2000の時間
OnFwd(OUT_C,20);OnRev(OUT_B,10); //K'で回転
until(SENSOR_3>white-5); //白よりの灰...
linetraceC(); //K'toM'
Rcurve(); //M'
linetraceS(); //M'toM'とBの...
Lcurve(); //M'とBの間の角
linetraceS(); //to二枚の間...
Rcurve(); //二枚の間の...
linetraceS(); //間の線上
Lcurve(); //間の先から...
linetraceS(); //toB
crossline(); //B
linetraceS(); //BtoM
Lcurve(); //M
linetraceC(); //MtoK
crossline(); //K
linetraceS(); //KtoL
Wait(2900); //2900の時間
catch(); //Lでボールを...
kaiten(); //Lで回転
linetraceC(); //LtoM
Rcurve(); //M
linetraceS(); //toBとMの間...
Lcurve(); //BとMの間の角
linetraceS(); //to二枚の間...
Rcurve(); //二枚の間の...
linetraceS(); //間の線上
Lcurve(); //間の先から...
linetraceS(); //toB'
Lcurve(); //B'
linetraceS(); //B'toD'
Rcurve(); //D'
linetraceS(); //D'toH'
release(); //H'でボール...
}
**スレイブ側のプログラム [#red22c09]
***定義 [#i1135d38]
#defineで次のように定義した
#define SIGNAL1 11 //マスターとやり取りする信号の番号
#define SIGNAL2 12 //同上
#define SIGNAL3 13 //同上
#define SIGNAL4 14 //同上
#define tukamu OnRev(OUT_A,20);Wait(800);//ボールを掴む
#define hanasu OnFwd(OUT_A,20);Wait(300);//ボールを落とす
#define up OnFwd(OUT_B,50);Wait(1800);//アームを上げる
#define down OnRev(OUT_B,50);Wait(900);//アームを下ろす
***プログラム全体 [#t4b8d068]
マスター側と同様,掴むときの変数をmsg1,信号をSIGNAL1,SIG...
task main ()
{
int msg1; // 受け取った値を格納する変数
int msg2; // 同上
while(true){
ReceiveRemoteNumber(MAILBOX1,true,msg1);//MAILBOX...
ReceiveRemoteNumber(MAILBOX2,true,msg2);//MAILBOX...
if(msg1==SIGNAL1){ //msg1にS...
down;
tukamu;
up;
Off(OUT_AB); //モータ...
SendResponseNumber(MAILBOX1,SIGNAL2);//マスタ...
}
if(msg2==SIGNAL3){ //msg2にS...
hanasu;
Off(OUT_A); //モータ...
SendResponseNumber(MAILBOX2,SIGNAL4);//マスタ...
}
}
}
*感想・反省点 [#oec31ff0]
今回初めて扱ったNXT間での通信は手こずったが,最終的にうま...
アーム部分や移動する部分などの機体は頑丈でしっかり動くよ...
しかし,本番直前にセンサーの位置を変更しそれに対応したプ...
また,チームで分担してプログラミングを行ったのだが,各自...
ページ名: