2018a/Member/Uata/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2018a/Member]]
#contents
*最終課題概要 [#fcf3161c]
**フィールドの説明 [#k2f1a3c4]
#ref(2018a-mission3.jpg)~
---フィールドは課題2で使用した紙を使用する。~
---2種類の空き缶(Aタイプ,Bタイプ)をそれぞれ3個づつ用意し...
---空き缶には色をつけたり文字や記号を書いてもよい。あるい...
**基本ルール [#v2a0c558]
-競技時間は審判が続行不能と判断するまで、あるいはリタイア...
-図のA地点またはA'地点からスタートする。ただし接地してい...
-タイプの空き缶を円Y内に、Bタイプの空き缶を円X内に運ぶ。~
-開始の合図から5秒以内にスタートボタンを押す作業を完了す...
-競技が終了するまで、ロボットに触ったり人間が遠隔で操作し...
-途中でうまく動かなくなった場合、1回限り再スタートするこ...
-得点は基本得点(運んだ缶の数や位置)と技術得点(採点者によ...
*ロボットの概要 [#q8fb5a6c]
今回の課題に対しては二台のロボットを使用し、それぞれに特...
**Master側のロボット [#q686ed47]
Master側のロボットは三段に積まれた缶の二段目を挟み、固定...
機体は三輪式を採用している。また、缶を掴むところの機構は...
フィールド上の動きは光センサーや超音波センサーなどを使わ...
#ref(Image_9407a88.jpg)~
**Slave側のロボット [#zae350a9]
Slave側のロボットは一段目、三段目の缶を挟み運ぶ役割をした...
機体を製作する上でMaster側と同じような三輪式を作ってみる...
そのため下図のようになるべく本体をボタンの付いている方を...
#ref(Image_c53db42.jpg)
*プログラム概要 [#md0db707]
**二つの機体をつなげるプログラム [#w8261459]
二つの機体にはそれぞれの役割があると先でも説明した。その...
なので、Master側が缶を掴んだ後Slave側を移動させ缶を掴ませ...
***MasterからのメッセージでSlaveが動くプログラム [#qded68...
-Master側~
task main()
{
SendRemoteNumber(1,MAILBOX1,11); //Slave側のMAILBO...
}
-Slave側~
task main()
{
int msg,frg1=1;
while(frg1){
ReceiveRemoteNumber(MAILBOX1,true,msg); // MA...
if(msg==11){ //も...
(命令);
frg1=0;
}
}
}
***SlaveからのメッセージでMasterが動くプログラム [#lb95b0...
-Slave側~
task main()
{
SendResponseNumber(MAILBOX1,12); //Master側のMAILB...
}
-Master側~
task main()
{
int msg,frg1=1;
while(frg1){
ReceiveRemoteNumber(MAILBOX1,true,msg); // MA...
if(msg==12){ //も...
(動かしたい命令);
frg1=0;
}
}
}
**プログラムの定義 [#iaddc74e]
Master側、Slave側それぞれで以下のようにプログラムを定義し...
-Master側~
#define kail OnFwd(OUT_B,50);OnRev(OUT_C,50);Wait(500);O...
#define kair OnFwd(OUT_C,50);OnRev(OUT_B,50);Wait(500);O...
-Slave側~
#define SPEED_H 30
#define SPEED_L 35
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
#define go_forward OnRL(SPEED_H, SPEED_H); // 前進
#define Back(X) OnRev(OUT_BC,30);Wait(X);Off(OUT_BC);//...
#define turn_rt(X) OnRL(SPEED_L, -SPEED_L);Wait(X);Off(...
#define turn_right(X) OnRL(SPEED_L, 0);Wait(X);Off(OUT_...
#define turn_left(X) OnRL(0, SPEED_L);Wait(X);Off(OUT_BC...
#define turn_lt(X) OnRL(-SPEED_L, SPEED_L);Wait(X);Off(O...
**サブルーチンを用いてのプログラム [#gf850175]
前進、後退など一部動作はMaster側のみサブルーチンを使い組...
-前進するプログラム~
sub zen(int i)
{
int t;
t=i*50;
OnFwd(OUT_B,50); OnFwd(OUT_C,49);
Wait(t);
Off(OUT_BC);
}
~
sub zeny(int i)
{
int t;
t=i*100;
OnFwd(OUT_B,25); OnFwd(OUT_C,25);
Wait(t);
Off(OUT_BC);
}
-後退するプログラム~
sub kou(int i)
{
int t;
t=i*50;
OnRev(OUT_B,50);OnRev(OUT_C,49);
Wait(t);
Off(OUT_BC);
}
-缶を掴むプログラム~
sub armc()
{
OnFwd(OUT_A,30);
}
-缶を離すプログラム~
sub armo()
{
OnRev(OUT_A,30);
}
**プログラムの完成 [#p0681c32]
完成したプログラムは以下のようになった。連携は一方が動い...
-Masterが?の経路を移動
task main()
{
int msg,frg1=1,frg2=1; //関数frg1,frg2を定義
zen(51); //2.55秒、50%の速...
kair; //0.5秒右旋回
zen(75); //3.75秒、50%の速...
kair; //0.5秒右旋回
zeny(20); //2秒、25%の速さで...
armc(); //二段目の缶を掴む...
SendRemoteNumber(1,MAILBOX1,11);//送信 //Slave側...
-Slaveが?の経路を移動
task main()
{
int msg,frg1=1,frg2=1;
while(frg1){
ReceiveRemoteNumber(MAILBOX1,true,msg); //MAILBOX1...
if(msg==11){
SetSensorLowspeed(S1); //缶の方向を探した後、近づ...
int d = searchDirection(120);
if (d > 10) {
fwdDist(d-10.0);
}
str(500); //0.5秒前進
Off(OUT_A); //モーターAの電源...
str(400); //0.4秒前進
OnRev(OUT_A,30); //一段目と三段目...
Wait(1000); //1秒待つ
Back(1000); //1秒後退
SendResponseNumber(MAILBOX1,12); //Master側に12の...
frg1=0; //関数frg1に0を代入
}
}
-Masterが?の経路を移動
ReceiveRemoteNumber(MAILBOX1,true,msg);//受信
if(msg==12){
armo(); //缶を離す
kou(20); //1秒後退
kair; //0.5秒右旋回
zen(44); //2.2秒、50%の速さで前進
kail; //0.5秒左旋回
zeny(20); //0.5秒、25%の速さで前進
armc(); //二段目の缶を掴む Yに移動完了
frg1=0; //関数frg1に0...
SendRemoteNumber(1,MAILBOX1,13); //Slave側に13の数字...
}
}
-Slaveが?の経路を移動
while(frg2){
ReceiveRemoteNumber(MAILBOX1,true,msg); //MAILBOX1...
if(msg==13){
turn_lt(600); //0.6秒左旋回
str(4000); //4秒前進
turn_rt(1000); //1秒右旋回
str(1000); //1秒前進
OnFwd(OUT_A,30); //缶を離す Yに...
Wait(500); //0.5秒待つ
Off(OUT_A); //モーターAの電...
Back(1000); //1秒後退
turn_rt(800); //0.8秒右旋回
str(500); //0.5秒前進
turn_lt(1000); //1秒左旋回
str(2000); //2秒前進
turn_left(1000); //1秒左折
OnRev(OUT_A,30); //一段目と三段目...
Wait(1000); //1秒待つ
Back(1000); //1秒後退
turn_rt(2000); //2秒右旋回
str(4000); //4秒前進
OnFwd(OUT_A,30); //缶を離す
Wait(1000); //1秒待つ
Off(OUT_A); //モーターAの電...
SendResponseNumber(MAILBOX1,14); //Master側に14の...
frg2=0; //関数frg2に0を...
}
}
}
-Masterがその場で缶を離す
while(frg2){
ReceiveRemoteNumber(MAILBOX1,true,msg); //43 受信
if(msg==14){
armo(); //缶を離す
frg2=0; //関数frg2に0を代入(完全停止)
}
}
}
#ref(Inked2018a-mission3_LI.jpg)
*まとめ [#d7c33bed]
**結果 [#o76ad397]
結果は一回目は0点、二回目は2点となった。また技術点は平均1...
**反省 [#teb81a3c]
最終課題では授業初期に教わったdefineによるプログラムの定...
しかし、プログラミング構成面での反省点がそんなに挙げられ...
終了行:
[[2018a/Member]]
#contents
*最終課題概要 [#fcf3161c]
**フィールドの説明 [#k2f1a3c4]
#ref(2018a-mission3.jpg)~
---フィールドは課題2で使用した紙を使用する。~
---2種類の空き缶(Aタイプ,Bタイプ)をそれぞれ3個づつ用意し...
---空き缶には色をつけたり文字や記号を書いてもよい。あるい...
**基本ルール [#v2a0c558]
-競技時間は審判が続行不能と判断するまで、あるいはリタイア...
-図のA地点またはA'地点からスタートする。ただし接地してい...
-タイプの空き缶を円Y内に、Bタイプの空き缶を円X内に運ぶ。~
-開始の合図から5秒以内にスタートボタンを押す作業を完了す...
-競技が終了するまで、ロボットに触ったり人間が遠隔で操作し...
-途中でうまく動かなくなった場合、1回限り再スタートするこ...
-得点は基本得点(運んだ缶の数や位置)と技術得点(採点者によ...
*ロボットの概要 [#q8fb5a6c]
今回の課題に対しては二台のロボットを使用し、それぞれに特...
**Master側のロボット [#q686ed47]
Master側のロボットは三段に積まれた缶の二段目を挟み、固定...
機体は三輪式を採用している。また、缶を掴むところの機構は...
フィールド上の動きは光センサーや超音波センサーなどを使わ...
#ref(Image_9407a88.jpg)~
**Slave側のロボット [#zae350a9]
Slave側のロボットは一段目、三段目の缶を挟み運ぶ役割をした...
機体を製作する上でMaster側と同じような三輪式を作ってみる...
そのため下図のようになるべく本体をボタンの付いている方を...
#ref(Image_c53db42.jpg)
*プログラム概要 [#md0db707]
**二つの機体をつなげるプログラム [#w8261459]
二つの機体にはそれぞれの役割があると先でも説明した。その...
なので、Master側が缶を掴んだ後Slave側を移動させ缶を掴ませ...
***MasterからのメッセージでSlaveが動くプログラム [#qded68...
-Master側~
task main()
{
SendRemoteNumber(1,MAILBOX1,11); //Slave側のMAILBO...
}
-Slave側~
task main()
{
int msg,frg1=1;
while(frg1){
ReceiveRemoteNumber(MAILBOX1,true,msg); // MA...
if(msg==11){ //も...
(命令);
frg1=0;
}
}
}
***SlaveからのメッセージでMasterが動くプログラム [#lb95b0...
-Slave側~
task main()
{
SendResponseNumber(MAILBOX1,12); //Master側のMAILB...
}
-Master側~
task main()
{
int msg,frg1=1;
while(frg1){
ReceiveRemoteNumber(MAILBOX1,true,msg); // MA...
if(msg==12){ //も...
(動かしたい命令);
frg1=0;
}
}
}
**プログラムの定義 [#iaddc74e]
Master側、Slave側それぞれで以下のようにプログラムを定義し...
-Master側~
#define kail OnFwd(OUT_B,50);OnRev(OUT_C,50);Wait(500);O...
#define kair OnFwd(OUT_C,50);OnRev(OUT_B,50);Wait(500);O...
-Slave側~
#define SPEED_H 30
#define SPEED_L 35
#define OnRL(speedR,speedL) OnFwd(OUT_B,speedR);OnFwd(OU...
#define go_forward OnRL(SPEED_H, SPEED_H); // 前進
#define Back(X) OnRev(OUT_BC,30);Wait(X);Off(OUT_BC);//...
#define turn_rt(X) OnRL(SPEED_L, -SPEED_L);Wait(X);Off(...
#define turn_right(X) OnRL(SPEED_L, 0);Wait(X);Off(OUT_...
#define turn_left(X) OnRL(0, SPEED_L);Wait(X);Off(OUT_BC...
#define turn_lt(X) OnRL(-SPEED_L, SPEED_L);Wait(X);Off(O...
**サブルーチンを用いてのプログラム [#gf850175]
前進、後退など一部動作はMaster側のみサブルーチンを使い組...
-前進するプログラム~
sub zen(int i)
{
int t;
t=i*50;
OnFwd(OUT_B,50); OnFwd(OUT_C,49);
Wait(t);
Off(OUT_BC);
}
~
sub zeny(int i)
{
int t;
t=i*100;
OnFwd(OUT_B,25); OnFwd(OUT_C,25);
Wait(t);
Off(OUT_BC);
}
-後退するプログラム~
sub kou(int i)
{
int t;
t=i*50;
OnRev(OUT_B,50);OnRev(OUT_C,49);
Wait(t);
Off(OUT_BC);
}
-缶を掴むプログラム~
sub armc()
{
OnFwd(OUT_A,30);
}
-缶を離すプログラム~
sub armo()
{
OnRev(OUT_A,30);
}
**プログラムの完成 [#p0681c32]
完成したプログラムは以下のようになった。連携は一方が動い...
-Masterが?の経路を移動
task main()
{
int msg,frg1=1,frg2=1; //関数frg1,frg2を定義
zen(51); //2.55秒、50%の速...
kair; //0.5秒右旋回
zen(75); //3.75秒、50%の速...
kair; //0.5秒右旋回
zeny(20); //2秒、25%の速さで...
armc(); //二段目の缶を掴む...
SendRemoteNumber(1,MAILBOX1,11);//送信 //Slave側...
-Slaveが?の経路を移動
task main()
{
int msg,frg1=1,frg2=1;
while(frg1){
ReceiveRemoteNumber(MAILBOX1,true,msg); //MAILBOX1...
if(msg==11){
SetSensorLowspeed(S1); //缶の方向を探した後、近づ...
int d = searchDirection(120);
if (d > 10) {
fwdDist(d-10.0);
}
str(500); //0.5秒前進
Off(OUT_A); //モーターAの電源...
str(400); //0.4秒前進
OnRev(OUT_A,30); //一段目と三段目...
Wait(1000); //1秒待つ
Back(1000); //1秒後退
SendResponseNumber(MAILBOX1,12); //Master側に12の...
frg1=0; //関数frg1に0を代入
}
}
-Masterが?の経路を移動
ReceiveRemoteNumber(MAILBOX1,true,msg);//受信
if(msg==12){
armo(); //缶を離す
kou(20); //1秒後退
kair; //0.5秒右旋回
zen(44); //2.2秒、50%の速さで前進
kail; //0.5秒左旋回
zeny(20); //0.5秒、25%の速さで前進
armc(); //二段目の缶を掴む Yに移動完了
frg1=0; //関数frg1に0...
SendRemoteNumber(1,MAILBOX1,13); //Slave側に13の数字...
}
}
-Slaveが?の経路を移動
while(frg2){
ReceiveRemoteNumber(MAILBOX1,true,msg); //MAILBOX1...
if(msg==13){
turn_lt(600); //0.6秒左旋回
str(4000); //4秒前進
turn_rt(1000); //1秒右旋回
str(1000); //1秒前進
OnFwd(OUT_A,30); //缶を離す Yに...
Wait(500); //0.5秒待つ
Off(OUT_A); //モーターAの電...
Back(1000); //1秒後退
turn_rt(800); //0.8秒右旋回
str(500); //0.5秒前進
turn_lt(1000); //1秒左旋回
str(2000); //2秒前進
turn_left(1000); //1秒左折
OnRev(OUT_A,30); //一段目と三段目...
Wait(1000); //1秒待つ
Back(1000); //1秒後退
turn_rt(2000); //2秒右旋回
str(4000); //4秒前進
OnFwd(OUT_A,30); //缶を離す
Wait(1000); //1秒待つ
Off(OUT_A); //モーターAの電...
SendResponseNumber(MAILBOX1,14); //Master側に14の...
frg2=0; //関数frg2に0を...
}
}
}
-Masterがその場で缶を離す
while(frg2){
ReceiveRemoteNumber(MAILBOX1,true,msg); //43 受信
if(msg==14){
armo(); //缶を離す
frg2=0; //関数frg2に0を代入(完全停止)
}
}
}
#ref(Inked2018a-mission3_LI.jpg)
*まとめ [#d7c33bed]
**結果 [#o76ad397]
結果は一回目は0点、二回目は2点となった。また技術点は平均1...
**反省 [#teb81a3c]
最終課題では授業初期に教わったdefineによるプログラムの定...
しかし、プログラミング構成面での反省点がそんなに挙げられ...
ページ名: