2019b/Member/takaki/Mission3
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
**目次 [#r53d533a]
#contents
*課題3 [#md26d522]
**課題概要 [#o5ef8754]
交差点C, E, F, C', E', F'上に空き缶が設置されている。C, E...
**回収方法・道順 [#e0f6b98c]
私たちの班は、一度にすべてのボールを回収した後、順番に指...
#ref(2019b/Member/takaki/Mission3/2019b-mission2.png,100%...
#ref(2019b/Member/takaki/Mission3/IMG_2255.jpg,100%,コー...
*ロボットの説明 [#aa666193]
#ref(2019b/Member/takaki/Mission3/IMG_2260.jpg,100%,ロボ...
私たちの班は、上での説明のように、一度にボールを回収、設...
#ref(2019b/Member/takaki/Mission3/IMG_2259.jpg,100%,ロボ...
今回のロボットはNXT本体二つを一つのロボットに組み込んだ一...
#ref(2019b/Member/takaki/Mission3/IMG_2262.jpg,100%,ロボ...
画像のように光センサーを二つ使い、ライントレースをしやす...
#ref(2019b/Member/takaki/Mission3/IMG_2257.jpg,100%,ロボ...
しかし、一体型にしたことで、ロボットのバランスが不安定に...
*プログラムの説明 [#x8aae064]
プログラム作成は相方が行ったので、詳しい説明ができないと...
**マスター側プログラム [#ue6f3464]
マスター側の役割は、ライントレース・缶への接近・スレーブ...
***定義 [#j9e02d9a]
//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; //モータのスピード(曲線)」
マスター側の定義部分である。光センサー二つの値をそれぞれ...
***ライントレース関数 [#b640ce43]
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);
}
ライントレースをする関数である。この関数で、缶への接近も...
***右旋回、左旋回関数 [#i8af8037]
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の値だけ後退し、右左折をする関数である。
***スレーブ側へメッセージを送る関数 [#t2e8a657]
void sendMessage(int number){
int val = 0;
SendRemoteNumber(CONN, MAILBOX1, number);
until(val == number){
ReceiveRemoteNumber(MAILBOX2, true, val);
}
}
この関数を用いて、スレーブ側へ信号を送る。11でアームダウ...
***main関数 [#r8c200bb]
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);
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);
}
main関数では、一番上の図のような順番でボールの回収、設置...
**スレーブ側プログラム [#sfc549a2]
スレーブ側では、バーの操作やボールの回収、設置を行う。
***定義 [#x016fb41]
//slave program
#define CONN 0
#define barDown RotateMotor(OUT_C, 100, 500) //固定棒...
#define barUp RotateMotor(OUT_C, 100, -500) //固定棒...
***ボール回収・設置関数 [#m1600762]
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); //ボ...
}
1〜6の数字でボールの回収、設置を行う関数である。1〜3まで...
***main関数 [#b4694ab0]
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;
}
}
スレーブ側では、処理が終わった際に処理の終了を知らせる信...
*結果 [#b882dff2]
本番ではボールの回収は行えたが、設置することはできなかっ...
*感想 [#sc4824a3]
今回の課題3は、非常に惜しい結果となった。少しの段差や摩擦...
三回の課題を通して、思い通りのロボット、プログラムを作成...
終了行:
**目次 [#r53d533a]
#contents
*課題3 [#md26d522]
**課題概要 [#o5ef8754]
交差点C, E, F, C', E', F'上に空き缶が設置されている。C, E...
**回収方法・道順 [#e0f6b98c]
私たちの班は、一度にすべてのボールを回収した後、順番に指...
#ref(2019b/Member/takaki/Mission3/2019b-mission2.png,100%...
#ref(2019b/Member/takaki/Mission3/IMG_2255.jpg,100%,コー...
*ロボットの説明 [#aa666193]
#ref(2019b/Member/takaki/Mission3/IMG_2260.jpg,100%,ロボ...
私たちの班は、上での説明のように、一度にボールを回収、設...
#ref(2019b/Member/takaki/Mission3/IMG_2259.jpg,100%,ロボ...
今回のロボットはNXT本体二つを一つのロボットに組み込んだ一...
#ref(2019b/Member/takaki/Mission3/IMG_2262.jpg,100%,ロボ...
画像のように光センサーを二つ使い、ライントレースをしやす...
#ref(2019b/Member/takaki/Mission3/IMG_2257.jpg,100%,ロボ...
しかし、一体型にしたことで、ロボットのバランスが不安定に...
*プログラムの説明 [#x8aae064]
プログラム作成は相方が行ったので、詳しい説明ができないと...
**マスター側プログラム [#ue6f3464]
マスター側の役割は、ライントレース・缶への接近・スレーブ...
***定義 [#j9e02d9a]
//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; //モータのスピード(曲線)」
マスター側の定義部分である。光センサー二つの値をそれぞれ...
***ライントレース関数 [#b640ce43]
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);
}
ライントレースをする関数である。この関数で、缶への接近も...
***右旋回、左旋回関数 [#i8af8037]
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の値だけ後退し、右左折をする関数である。
***スレーブ側へメッセージを送る関数 [#t2e8a657]
void sendMessage(int number){
int val = 0;
SendRemoteNumber(CONN, MAILBOX1, number);
until(val == number){
ReceiveRemoteNumber(MAILBOX2, true, val);
}
}
この関数を用いて、スレーブ側へ信号を送る。11でアームダウ...
***main関数 [#r8c200bb]
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);
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);
}
main関数では、一番上の図のような順番でボールの回収、設置...
**スレーブ側プログラム [#sfc549a2]
スレーブ側では、バーの操作やボールの回収、設置を行う。
***定義 [#x016fb41]
//slave program
#define CONN 0
#define barDown RotateMotor(OUT_C, 100, 500) //固定棒...
#define barUp RotateMotor(OUT_C, 100, -500) //固定棒...
***ボール回収・設置関数 [#m1600762]
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); //ボ...
}
1〜6の数字でボールの回収、設置を行う関数である。1〜3まで...
***main関数 [#b4694ab0]
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;
}
}
スレーブ側では、処理が終わった際に処理の終了を知らせる信...
*結果 [#b882dff2]
本番ではボールの回収は行えたが、設置することはできなかっ...
*感想 [#sc4824a3]
今回の課題3は、非常に惜しい結果となった。少しの段差や摩擦...
三回の課題を通して、思い通りのロボット、プログラムを作成...
ページ名: