2019b/Member/yuu/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[2019b/Member]]
目次
#contents
*課題3:ボール運搬ロボット [#w5bac6c7]
交差点C, E, F, C', E', F'に空き缶が置かれていて、そのうち...
**ルールの一部 [#d7b41439]
''基本ルール''
--図のA地点または(および)A'地点からスタートする。ただし...
--競技が終了するまで、ロボットに触ったり人間が遠隔で操作...
--競技終了後、ロボットが、空き缶に触れていてはいけない。
''基本得点の計算方法''
--ボールを1個運べば8点。3つとも運べば24点。
--競技終了後、ゴールの空き缶が半分以上円からはみ出しまっ...
--競技終了後、ゴールの空き缶が完全に円から出しまった場合...
--競技終了後、空き缶にロボットが触れていれば、もとの基本...
*ロボットについて [#uae2a7dd]
2台のNXT一体型のロボットです。ライントレース機構とボール...
**ライントレース機構 [#f2528dfe]
線を見つけるためのライトセンサ2つを前に左右並べて付け、...
&ref(IMG_5847comp.jpg,nolink,80%, );
**ボールを掴む、放す機構 [#qa6f0068]
もともとアームで左右からボールを掴む形を作っていたのです...
3つの棒がついた回転部分を回すだけで順回転でボールをレール...
&ref(IMG_5848comp.jpg,nolink,80%, );
&ref(IMG_5849comp.jpg,nolink,80%, );
*プログラムについて [#x7118ba6]
**マスター側プログラム [#a848c1f8]
***マクロについて [#d02d7d6c]
//master program
//left sensor:S1 motor:C
//right sensor:S2 motor:B
#define CONN 1 //1のスレーブNXTと通信(マスターは0)
#define grayS1 50 //左ライトセンサの基準
#define grayS2 45 //右ライトセンサの基準
#define blackS1 45 //左ライトセンサの基準
#define blackS2 40 //右ライトセンサの基準
int fast = 50; //モータのスピード(直線)
int slow = 30; //モータのスピード(曲線)
grayはライントレース時と左右両方線がある交差点の判断、bla...
***自作関数 lineFollow() [#r81cb8c0]
void lineFollow(int breaksensor) //S1:0, S2:1, S1+S2:...
{
SetSensorLight(S1);
SetSensorLight(S2);
SetSensorLowspeed(S4);
int lightL, lightR, dist = 100
while(true){
lightL = SENSOR_1; //左ライトセンサの値
lightR = SENSOR_2; //右ライトセンサの値
if((lightL>grayS1) && (lightR>grayS2)){
OnFwdSync(OUT_BC, fast, 0); //直線
}else if((lightL>grayS1) && (lightR<grayS2)){
OnFwdSync(OUT_BC, slow, 50); //右へ
}else if((lightL<grayS1) && (lightR>grayS2)){
OnFwdSync(OUT_BC, slow, -50); //左へ
}
if((breaksensor == 0) && (lightL<blackS1)) break;...
if((breaksensor == 1) && (lightR<blackS2)) break;...
if((breaksensor == 2) && (lightL<grayS1) && (ligh...
if((breaksensor == 3) && (SensorUS(S4)<10)) break...
}
Off(OUT_BC);
}
ライトセンサ2つ使ったライントレースです。左センサ白、右...
whileループから抜けるためにどのセンサを使うかの引数breaks...
***自作関数 turnLeft()、turnRight() [#x61ab8b8]
void turnLeft(int deg){
SetSensorLight(S1);
SetSensorLight(S2);
RotateMotorEx(OUT_BC, fast, -deg, 0, true, true);
RotateMotor(OUT_B, fast, 400);
until((SENSOR_1>grayS1) && (SENSOR_2>grayS2)){
OnFwd(OUT_B, fast);
}
Off(OUT_BC);
}
void turnRight(int deg){
SetSensorLight(S1);
SetSensorLight(S2);
RotateMotorEx(OUT_BC, fast, -deg, 0, true, true);
RotateMotor(OUT_C, fast, 400);
until((SENSOR_1>grayS1) && (SENSOR_2>grayS2)){
OnFwd(OUT_C, fast);
}
Off(OUT_BC);
}
引数degだけ下がった後、左または右のモータ1つだけを回しカ...
***自作関数 sendMessage() [#c6b18d6c]
void sendMessage(int number){
int val = 0; //スレーブから送られてくる数、メイン...
SendRemoteNumber(CONN, MAILBOX1, number);
until(val == number){
ReceiveRemoteNumber(MAILBOX2, true, val);
}
}
ボールを回収したり、置く機構はスレーブ側なのでマスターか...
***メインプログラム [#w5e36fb4]
task main(){
SetSensorLight(S1);
SetSensorLight(S2);
int val = 0;
until(BluetoothStatus(CONN) == NO_ERR); //スレーブ...
RemoteStartProgram(CONN, "lineFollow_s.rxe"); //ス...
//ボール1回収
RotateMotorEx(OUT_BC, fast, 180, 0, true, true); /...
lineFollow(3);
sendMessage(11);
RotateMotorEx(OUT_BC, fast, 400, 0, true, true); /...
sendMessage(1);
sendMessage(12);
//ボール2回収
RotateMotorEx(OUT_BC, fast, -500, 0, true, true);
lineFollow(1);
turnRight(40);
lineFollow(2);
RotateMotorEx(OUT_BC, fast, 70, 0, true, true); //...
lineFollow(3);
sendMessage(11); //固定棒下げる
sendMessage(2); //回収
sendMessage(12); //固定棒上げる
//ボール3回収
turnLeft(270); //RotateMotorEx(OUT_BC, fast, -300,...
//lineFollow(2);
//turnLeft(30); このように変えた...
lineFollow(2);
turnRight(30);
lineFollow(3);
RotateMotorEx(OUT_BC, fast, -150, 0, true, true);
OnFwdSync(OUT_BC, fast, 0); //交差点認識で止まらな...
lineFollow(3);
sendMessage(11);
sendMessage(3);
sendMessage(12);
//ボール3置く
turnRight(270);
lineFollow(2);
RotateMotorEx(OUT_BC, fast, 70, 0, true, true);
lineFollow(2);
turnLeft(40);
lineFollow(1);
turnRight(40);
lineFollow(2);
RotateMotorEx(OUT_BC, fast, 70, 0, true, true);
lineFollow(2);
turnRight(40);
lineFollow(3);
RotateMotorEx(OUT_BC, fast, -150, 0, true, true);
OnFwdSync(OUT_BC, fast, 0);
lineFollow(3);
sendMessage(11);
sendMessage(4); //置く
sendMessage(12);
//ボール2置く
turnRight(290);
lineFollow(2);
turnLeft(50);
lineFollow(3);
RotateMotorEx(OUT_BC, fast, -150, 0, true, true);
OnFwdSync(OUT_BC, fast, 0);
lineFollow(3);
sendMessage(11);
sendMessage(5);
sendMessage(12);
//ボール1置く
RotateMotor(OUT_C, fast, -400);
RotateMotor(OUT_B, fast, 400);
until((SENSOR_1>grayS1) && (SENSOR_2>grayS2)){
OnFwd(OUT_B, fast); //タイヤが滑ってしまった時...
}
Off(OUT_BC);
lineFollow(3);
RotateMotorEx(OUT_BC, fast, -200, 0, true, true);
OnFwdSync(OUT_BC, fast, 0);
lineFollow(3);
sendMessage(11);
sendMessage(6);
sendMessage(12);
RotateMotorEx(OUT_BC, fast, -100, 0, true, true);
SendRemoteNumber(CONN, MAILBOX1, 21);
}
下にルートを載せておきます。緑の円はボールを回収する空き...
F…lineFollow~
M…RotateMotorEx~
R…turnRight~
L…turnLeft~
S…sendMessage
&ref(IMG_5730_1comp.gif,nolink,100%,ボール1回収);
&ref(IMG_5730_2comp.gif,nolink,100%,ボール2回収);
&ref(IMG_5730_3comp.gif,nolink,100%,ボール3回収);
&ref(IMG_5730_4comp.gif,nolink,100%,ボール3置く);
&ref(IMG_5730_5comp.gif,nolink,100%,ボール2置く);
&ref(IMG_5730_6comp.gif,nolink,100%,ボール1置く);
**スレーブ側プログラム [#p6c499b2]
***マクロについて [#ib2f0793]
//slave program
#define CONN 0
#define barDown RotateMotor(OUT_C, 100, 500) //固定棒...
#define barUp RotateMotor(OUT_C, 100, -500) //固定棒...
***自作関数 ball() [#a44afcbc]
void ball(int count = 0){
if(count == 1) RotateMotor(OUT_B, 40, 430); //ボー...
if(count == 2) RotateMotor(OUT_B, 40, 330); //ボー...
if(count == 3) RotateMotor(OUT_B, 40, 460); //ボー...
if(count == 4) RotateMotor(OUT_B, 40, -460); //ボ...
if(count == 5) RotateMotor(OUT_B, 40, -330); //ボ...
if(count == 6) RotateMotor(OUT_B, 40, -430); //ボ...
}
回転部分を回し、ボールを回収したり、置いたりするプログラ...
***メインプログラム [#j33a5702]
task main(){
int val=0, oldval;
while(true){
ReceiveRemoteNumber(MAILBOX1, true, val);
if(val != oldval){
if((val>0) && (val<10)){
ball(val);
}else if(val == 11){
barDown;
}else if(val == 12){
barUp;
}else if(val == 21){
break;
}
SendResponseNumber(MAILBOX2, val);
}
oldval = val;
}
}
MAILBOX1で送られてきたvalの値によってする動作を決めます。...
*結果 [#d48fd802]
H交差点左折時にタイヤが滑ってしまったり、途中で線を見失っ...
*反省 [#ld7d4b74]
二台のNXT一体型のためロボットが重く、重心の位置が後ろだっ...
2つ目、3つ目のボールを回収したあと、空き缶を検知した場...
課題2の時はモータとライトセンサが離れていたので、左右のモ...
この問題のロボットでの解決方法は前輪のモータをより後ろに...
プログラムでの解決方法は右左折する時にセンサ1つにすること...
&ref(IMG_5867comp.gif,nolink,80%,図1);
&ref(IMG_5868comp.gif,nolink,80%,図2);
&ref(IMG_5869comp.gif,nolink,80%,図3);
//&ref(IMG_5818_Moment(7).jpg,80%, );
//#attach();
終了行:
[[2019b/Member]]
目次
#contents
*課題3:ボール運搬ロボット [#w5bac6c7]
交差点C, E, F, C', E', F'に空き缶が置かれていて、そのうち...
**ルールの一部 [#d7b41439]
''基本ルール''
--図のA地点または(および)A'地点からスタートする。ただし...
--競技が終了するまで、ロボットに触ったり人間が遠隔で操作...
--競技終了後、ロボットが、空き缶に触れていてはいけない。
''基本得点の計算方法''
--ボールを1個運べば8点。3つとも運べば24点。
--競技終了後、ゴールの空き缶が半分以上円からはみ出しまっ...
--競技終了後、ゴールの空き缶が完全に円から出しまった場合...
--競技終了後、空き缶にロボットが触れていれば、もとの基本...
*ロボットについて [#uae2a7dd]
2台のNXT一体型のロボットです。ライントレース機構とボール...
**ライントレース機構 [#f2528dfe]
線を見つけるためのライトセンサ2つを前に左右並べて付け、...
&ref(IMG_5847comp.jpg,nolink,80%, );
**ボールを掴む、放す機構 [#qa6f0068]
もともとアームで左右からボールを掴む形を作っていたのです...
3つの棒がついた回転部分を回すだけで順回転でボールをレール...
&ref(IMG_5848comp.jpg,nolink,80%, );
&ref(IMG_5849comp.jpg,nolink,80%, );
*プログラムについて [#x7118ba6]
**マスター側プログラム [#a848c1f8]
***マクロについて [#d02d7d6c]
//master program
//left sensor:S1 motor:C
//right sensor:S2 motor:B
#define CONN 1 //1のスレーブNXTと通信(マスターは0)
#define grayS1 50 //左ライトセンサの基準
#define grayS2 45 //右ライトセンサの基準
#define blackS1 45 //左ライトセンサの基準
#define blackS2 40 //右ライトセンサの基準
int fast = 50; //モータのスピード(直線)
int slow = 30; //モータのスピード(曲線)
grayはライントレース時と左右両方線がある交差点の判断、bla...
***自作関数 lineFollow() [#r81cb8c0]
void lineFollow(int breaksensor) //S1:0, S2:1, S1+S2:...
{
SetSensorLight(S1);
SetSensorLight(S2);
SetSensorLowspeed(S4);
int lightL, lightR, dist = 100
while(true){
lightL = SENSOR_1; //左ライトセンサの値
lightR = SENSOR_2; //右ライトセンサの値
if((lightL>grayS1) && (lightR>grayS2)){
OnFwdSync(OUT_BC, fast, 0); //直線
}else if((lightL>grayS1) && (lightR<grayS2)){
OnFwdSync(OUT_BC, slow, 50); //右へ
}else if((lightL<grayS1) && (lightR>grayS2)){
OnFwdSync(OUT_BC, slow, -50); //左へ
}
if((breaksensor == 0) && (lightL<blackS1)) break;...
if((breaksensor == 1) && (lightR<blackS2)) break;...
if((breaksensor == 2) && (lightL<grayS1) && (ligh...
if((breaksensor == 3) && (SensorUS(S4)<10)) break...
}
Off(OUT_BC);
}
ライトセンサ2つ使ったライントレースです。左センサ白、右...
whileループから抜けるためにどのセンサを使うかの引数breaks...
***自作関数 turnLeft()、turnRight() [#x61ab8b8]
void turnLeft(int deg){
SetSensorLight(S1);
SetSensorLight(S2);
RotateMotorEx(OUT_BC, fast, -deg, 0, true, true);
RotateMotor(OUT_B, fast, 400);
until((SENSOR_1>grayS1) && (SENSOR_2>grayS2)){
OnFwd(OUT_B, fast);
}
Off(OUT_BC);
}
void turnRight(int deg){
SetSensorLight(S1);
SetSensorLight(S2);
RotateMotorEx(OUT_BC, fast, -deg, 0, true, true);
RotateMotor(OUT_C, fast, 400);
until((SENSOR_1>grayS1) && (SENSOR_2>grayS2)){
OnFwd(OUT_C, fast);
}
Off(OUT_BC);
}
引数degだけ下がった後、左または右のモータ1つだけを回しカ...
***自作関数 sendMessage() [#c6b18d6c]
void sendMessage(int number){
int val = 0; //スレーブから送られてくる数、メイン...
SendRemoteNumber(CONN, MAILBOX1, number);
until(val == number){
ReceiveRemoteNumber(MAILBOX2, true, val);
}
}
ボールを回収したり、置く機構はスレーブ側なのでマスターか...
***メインプログラム [#w5e36fb4]
task main(){
SetSensorLight(S1);
SetSensorLight(S2);
int val = 0;
until(BluetoothStatus(CONN) == NO_ERR); //スレーブ...
RemoteStartProgram(CONN, "lineFollow_s.rxe"); //ス...
//ボール1回収
RotateMotorEx(OUT_BC, fast, 180, 0, true, true); /...
lineFollow(3);
sendMessage(11);
RotateMotorEx(OUT_BC, fast, 400, 0, true, true); /...
sendMessage(1);
sendMessage(12);
//ボール2回収
RotateMotorEx(OUT_BC, fast, -500, 0, true, true);
lineFollow(1);
turnRight(40);
lineFollow(2);
RotateMotorEx(OUT_BC, fast, 70, 0, true, true); //...
lineFollow(3);
sendMessage(11); //固定棒下げる
sendMessage(2); //回収
sendMessage(12); //固定棒上げる
//ボール3回収
turnLeft(270); //RotateMotorEx(OUT_BC, fast, -300,...
//lineFollow(2);
//turnLeft(30); このように変えた...
lineFollow(2);
turnRight(30);
lineFollow(3);
RotateMotorEx(OUT_BC, fast, -150, 0, true, true);
OnFwdSync(OUT_BC, fast, 0); //交差点認識で止まらな...
lineFollow(3);
sendMessage(11);
sendMessage(3);
sendMessage(12);
//ボール3置く
turnRight(270);
lineFollow(2);
RotateMotorEx(OUT_BC, fast, 70, 0, true, true);
lineFollow(2);
turnLeft(40);
lineFollow(1);
turnRight(40);
lineFollow(2);
RotateMotorEx(OUT_BC, fast, 70, 0, true, true);
lineFollow(2);
turnRight(40);
lineFollow(3);
RotateMotorEx(OUT_BC, fast, -150, 0, true, true);
OnFwdSync(OUT_BC, fast, 0);
lineFollow(3);
sendMessage(11);
sendMessage(4); //置く
sendMessage(12);
//ボール2置く
turnRight(290);
lineFollow(2);
turnLeft(50);
lineFollow(3);
RotateMotorEx(OUT_BC, fast, -150, 0, true, true);
OnFwdSync(OUT_BC, fast, 0);
lineFollow(3);
sendMessage(11);
sendMessage(5);
sendMessage(12);
//ボール1置く
RotateMotor(OUT_C, fast, -400);
RotateMotor(OUT_B, fast, 400);
until((SENSOR_1>grayS1) && (SENSOR_2>grayS2)){
OnFwd(OUT_B, fast); //タイヤが滑ってしまった時...
}
Off(OUT_BC);
lineFollow(3);
RotateMotorEx(OUT_BC, fast, -200, 0, true, true);
OnFwdSync(OUT_BC, fast, 0);
lineFollow(3);
sendMessage(11);
sendMessage(6);
sendMessage(12);
RotateMotorEx(OUT_BC, fast, -100, 0, true, true);
SendRemoteNumber(CONN, MAILBOX1, 21);
}
下にルートを載せておきます。緑の円はボールを回収する空き...
F…lineFollow~
M…RotateMotorEx~
R…turnRight~
L…turnLeft~
S…sendMessage
&ref(IMG_5730_1comp.gif,nolink,100%,ボール1回収);
&ref(IMG_5730_2comp.gif,nolink,100%,ボール2回収);
&ref(IMG_5730_3comp.gif,nolink,100%,ボール3回収);
&ref(IMG_5730_4comp.gif,nolink,100%,ボール3置く);
&ref(IMG_5730_5comp.gif,nolink,100%,ボール2置く);
&ref(IMG_5730_6comp.gif,nolink,100%,ボール1置く);
**スレーブ側プログラム [#p6c499b2]
***マクロについて [#ib2f0793]
//slave program
#define CONN 0
#define barDown RotateMotor(OUT_C, 100, 500) //固定棒...
#define barUp RotateMotor(OUT_C, 100, -500) //固定棒...
***自作関数 ball() [#a44afcbc]
void ball(int count = 0){
if(count == 1) RotateMotor(OUT_B, 40, 430); //ボー...
if(count == 2) RotateMotor(OUT_B, 40, 330); //ボー...
if(count == 3) RotateMotor(OUT_B, 40, 460); //ボー...
if(count == 4) RotateMotor(OUT_B, 40, -460); //ボ...
if(count == 5) RotateMotor(OUT_B, 40, -330); //ボ...
if(count == 6) RotateMotor(OUT_B, 40, -430); //ボ...
}
回転部分を回し、ボールを回収したり、置いたりするプログラ...
***メインプログラム [#j33a5702]
task main(){
int val=0, oldval;
while(true){
ReceiveRemoteNumber(MAILBOX1, true, val);
if(val != oldval){
if((val>0) && (val<10)){
ball(val);
}else if(val == 11){
barDown;
}else if(val == 12){
barUp;
}else if(val == 21){
break;
}
SendResponseNumber(MAILBOX2, val);
}
oldval = val;
}
}
MAILBOX1で送られてきたvalの値によってする動作を決めます。...
*結果 [#d48fd802]
H交差点左折時にタイヤが滑ってしまったり、途中で線を見失っ...
*反省 [#ld7d4b74]
二台のNXT一体型のためロボットが重く、重心の位置が後ろだっ...
2つ目、3つ目のボールを回収したあと、空き缶を検知した場...
課題2の時はモータとライトセンサが離れていたので、左右のモ...
この問題のロボットでの解決方法は前輪のモータをより後ろに...
プログラムでの解決方法は右左折する時にセンサ1つにすること...
&ref(IMG_5867comp.gif,nolink,80%,図1);
&ref(IMG_5868comp.gif,nolink,80%,図2);
&ref(IMG_5869comp.gif,nolink,80%,図3);
//&ref(IMG_5818_Moment(7).jpg,80%, );
//#attach();
ページ名: