Code-source-robot-transporteur-integrations
De Wiki de bureau d'études PeiP
Avant propos
Vous êtes sur la page contenant le code source du robot transporteur NXT, avec toutes les intégrations, programmé par Déborah Saunders et Jean Wasilewski.
Le code se réparti en deux fichiers, le premier est lancé par le robot maitre, et le deuxième par le robot esclave.
Le schéma suivant explique comment raccorder les différents capteurs et servomoteurs :
Le servomoteurs gauche se branche sur l'entrée A, et le droit sur l'entrée B. Le capteur RFID se branche sur l'entrée 1, et celui de couleur sur le connecteur 2. La boussole se branche sur l'entré 3, et le capteur ultrasons sur la 4. Le moteur de levage se branche sur l'entrée B, et la pince quant à elle se branche sur le connecteur A
Code Source de l'esclave
/* Author : Jean Wasilewski & Deborah Saunders Creation : 02/02/2013 File : handv3.nxc */ // Includes #include "NXCDefs.h" #include "BTlib.nxc" #include "RFIDlib.nxc" #include "NBCCommon.h" // Output Definitions #define MOTOR_PINCE OUT_A #define MOTOR_LEVAGE OUT_B // BlueTooth Definitions #define BT_CONN 0 #define MAILBOX 0 // Speed Definitions #define SPEED_SLOW 50 #define SPEED_FAST 100 // Receive Definitions #define DO_NOTHING 0 #define DO_GET 1 #define DO_LET 2 // Receive Definitions #define SEND_NOTHING "0" #define SEND_RUN "1" #define SEND_LEAVE "2" // Global vars string state = SEND_NOTHING; bool stahps = false; bool dejafait = false; bool got_object = false; bool not(bool in) { if(in) { return false; } else { return true; } } // Master BlueTooth Check sub masterBTCheck(int conn){ string cStr; cStr = NumToStr(conn); cStr = StrCat("on line",cStr); if (!BTCommCheck(conn)){ TextOut(5,LCD_LINE2,"*Connect Slave"); TextOut(5,LCD_LINE3,cStr); TextOut(60,LCD_LINE3,"from"); TextOut(5,LCD_LINE4,"this NXT menu"); Wait(7000); Stop(true); } } void deposer_colis() { if(dejafait) { RotateMotor(MOTOR_LEVAGE, 65, 540); //Wait(SEC_1); OnFwd(MOTOR_PINCE, 45); Wait(SEC_1); Off(MOTOR_PINCE); dejafait = false; state = SEND_LEAVE; } } void recuperer_colis() { //RotateMotor(MOTOR_PINCE, 85, -180); OnFwd(MOTOR_PINCE, -45); Wait(SEC_2); if(!dejafait) { RotateMotor(MOTOR_LEVAGE, 65, -540); dejafait = true; } Wait(SEC_1); state = SEND_RUN; } // Main Task task main() { int in; masterBTCheck(BT_CONN); while(true) { ClearScreen(); in = StrToNum(BTReceiveMessage(BT_CONN, MAILBOX, TRUE)); if(in == DO_NOTHING) { TextOut(5,LCD_LINE1,"NOTHING COMMAND"); } else if(in == DO_GET) { recuperer_colis(); TextOut(5,LCD_LINE1,"GET COMMAND"); } else if(in == DO_LET) { deposer_colis(); TextOut(5,LCD_LINE1,"LET COMMAND"); } else { TextOut(5,LCD_LINE1,"BT Command unrecognized"); } BTSendMessage(BT_CONN, MAILBOX, state); TextOut(5, LCD_LINE7, NumToStr(in)); Wait(100); // Overload Protector } }
Code Source du maitre
// Includes #include "NXCDefs.h" #include "BTlib.nxc" #include "RFIDlib.nxc" #include "NBCCommon.h" // Input Definitions #define SENS_LIGHT IN_1 #define SENS_RFID IN_2 #define SENS_COMPA IN_3 #define SENS_ULTRA IN_4 // Output Definitions #define MOTOR_LEFT OUT_A #define MOTOR_RIGHT OUT_B #define MOTORS OUT_AB // BlueTooth Definitions #define BT_CONN 1 #define BT_SERV 0 #define MAILBOX 0 #define MAILPOS 9 // Speed Definitions //#define SPEED_SLOW -50 //#define SPEED_FAST -80 #define SPEED_SLOW -20 #define SPEED_FAST -45 // Card Definitions #define CARTE1 4 #define CARTE2 253 #define CARTE3 221 #define CARTE4 128 #define CARTE5 47 #define CARTE6 187 #define CARTE7 66 #define CARTE8 68 /* #define CARTE1 78 #define CARTE2 82 #define CARTE3 111 #define CARTE4 145 #define CARTE5 31 #define CARTE6 157 #define CARTE7 5 #define CARTE8 105 */ // Compass Definitions #define COMPASS1 152 #define COMPASS3 121 #define COMPASS4 (360 - COMPASS3) #define COMPASS8 (360 - COMPASS8) // Color Definitions #define BLACK INPUT_BLACKCOLOR #define BLUE INPUT_BLUECOLOR #define GREEN INPUT_GREENCOLOR #define YELLOW INPUT_YELLOWCOLOR #define RED INPUT_REDCOLOR #define WHITE INPUT_WHITECOLOR #define NOCOLOR -1 // Headers task get_object(); task let_object(); task follow_line(); task t_rfid(); task compass_run(); // Globals int color_main; int color_other; bool got_object; int read; int color_read; int last_rfid; bool blind_run; int cap; int e; string s_rfid; string s_line; string s_comp1; string s_comp2; int color_line = GREEN; int color_base = YELLOW; int color_depo = BLUE; // Not Function bool not(bool in) { if(in) { return false; } else { return true; } } // RFID Globals string data = ""; byte a[5]; // RFID Initiation void init_rfid() { string version, manufacturer, type; string serial = ""; // set sensor port to read I2C data SetSensorLowspeed(SENS_RFID); // send dummy command to wake up sensor RFIDDummy(SENS_RFID); // get sensor version, manufacturer, type and serial number version = GetI2CString(SENS_RFID,RFID_ADDRESS,RFID_VERSION); manufacturer = GetI2CString(SENS_RFID,RFID_ADDRESS,RFID_MANUFACTURER); type = GetI2CString(SENS_RFID,RFID_ADDRESS,RFID_TYPE); GetRFIDSerial(SENS_RFID,serial); } // RFID Procedure int check_rfid() { GetRFIDArray(SENS_RFID,a,true); RFIDDataToString(a,data); return a[3]; } // BT Initialization Procedure sub BTCheck(int conn) { string cStr; cStr = NumToStr(conn); cStr = StrCat("on line",cStr); if (!BTCommCheck(conn)) { TextOut(5,LCD_LINE2,"*Connect NXT"); TextOut(5,LCD_LINE3,cStr); TextOut(60,LCD_LINE3,"from"); TextOut(5,LCD_LINE4,"master NXT menu"); Wait(3000); Stop(true); } } // Colorreader Globals ColorSensorReadType csr; // Colorreader Initialization Procedure void init_colorreader() { SetSensorColorFull(SENS_LIGHT); csr.Port = SENS_LIGHT; SysColorSensorRead(csr); } // Rouler function void rouler() { OnFwd(MOTOR_LEFT, SPEED_FAST); OnFwd(MOTOR_RIGHT, SPEED_FAST); } // Find Back Line global int rl; // Find Back Line Function void find_back_line() { bool line_found = false; int initClock = 0; int clock = 0; int multi = 100; int cpt = 0; while ((!line_found)&&(cpt<=5)) { OnFwd(MOTORS, rl * SPEED_FAST); SysColorSensorRead(csr); clock = clock + 1; if(csr.ColorValue == GREEN) { line_found = true; } if(clock<multi) { rl = -1; } else if(clock<=(multi*2)) { //rl = rl * -1; rl = 1; } else { multi=multi*4; cpt = cpt +1; } } //Off(MOTORS); } // Initialization Function int init() { BTCheck(BT_CONN); BTCheck(BT_SERV); init_colorreader(); init_rfid(); read = -1; color_read = -1; rl = -1; color_main = GREEN; color_other = NOCOLOR; got_object = false; last_rfid = -1; SetSensorLowspeed(SENS_COMPA); blind_run = false; cap = -1; e = 8; SetSensorLowspeed(SENS_ULTRA); } // SafeQuit_FollowLine Function int SafeQuit_FollowLine() { s_line = " "; TextOut(5,LCD_LINE2,s_line); Off(MOTORS); } // SafeQuit_GetObject Function int SafeQuit_GetObject() { s_line = " "; TextOut(5,LCD_LINE3,s_line); Off(MOTORS); StopTask(get_object); } // SafeQuit_LetObject Function int SafeQuit_LetObject() { s_line = " "; TextOut(5,LCD_LINE3,s_line); Off(MOTORS); StopTask(let_object); } // SafeQuit_CompassRun Function int SafeQuit_CompassRun() { s_line = " "; TextOut(5,LCD_LINE3,s_line); TextOut(5,LCD_LINE4,s_line); Off(MOTORS); StopTask(compass_run); } // Compass Run Task // Output : 3 & 4 task compass_run() { bool line = false; int comp = -1; TextOut(5,LCD_LINE3,"co running "); rouler(); Wait(MS_800); TextOut(5,LCD_LINE3,"co follow compass "); while(not(line)) { SysColorSensorRead(csr); if(csr.ColorValue == color_line) { Off(MOTORS); line = true; StartTask(follow_line); SafeQuit_CompassRun(); } else { s_comp1 = NumToStr(color_read); s_comp1 = StrCat("c c:",s_comp1); s_comp1 = StrCat(s_comp1," l:"); s_comp1 = StrCat(s_comp1,NumToStr(color_main)); s_comp1 = StrCat(s_comp1, " "); TextOut(5,LCD_LINE3,s_comp1); comp = SensorHTCompass(IN_3); s_comp2 = NumToStr(comp); s_comp2 = StrCat("co c:",s_comp2); s_comp2 = StrCat(s_comp2," w:"); s_comp2 = StrCat(s_comp2,NumToStr(cap)); s_comp2 = StrCat(s_comp2, " "); TextOut(5,LCD_LINE4,s_comp2); if((comp - e) > cap) { OnFwd(OUT_A, 35); OnFwd(OUT_B, -35); } else if((comp + e) < cap) { OnFwd(OUT_A, -35); OnFwd(OUT_B, 35); } else { OnFwd(OUT_A, 35); OnFwd(OUT_B, 35); } } } } // Get Object Task // Ouput : 3 task get_object() { bool etape1 = false; bool etape2 = false; Off(MOTORS); while(!etape1) { TextOut(5,LCD_LINE3,"go e1 "); color_line = YELLOW; color_base = GREEN; color_depo = BLUE; SysColorSensorRead(csr); if(csr.ColorValue == color_depo) { // Action colis Off(MOTORS); TextOut(5,LCD_LINE3,"go e1 BT ON "); while(not(BTReceiveMessage(BT_CONN, MAILBOX, TRUE) == "1")) { BTSendMessage(BT_CONN, MAILBOX, "1");// Do_get Wait(100); // Overload protector } Wait(SEC_2); TextOut(5,LCD_LINE3,"go e1 U Turn "); OnFwdSync(OUT_AB,70,60); Wait(2500); Off(MOTORS); got_object = true; etape1 = true; TextOut(5,LCD_LINE3,"go e1 done "); } else if(csr.ColorValue == color_line) { TextOut(5,LCD_LINE3,"go e1 line ok "); rouler(); } else { TextOut(5,LCD_LINE3,"go e1 line search "); bool line_found = false; int initClock = 0; int clock = 0; int multi = 100; int cpt = 0; while ((!line_found)&&(cpt<=5)) { OnFwd(MOTORS, rl * SPEED_FAST); SysColorSensorRead(csr); clock = clock + 1; if((csr.ColorValue == color_line)||(csr.ColorValue == color_depo)) { line_found = true; } if(clock<multi) { rl = -1; } else if(clock<=(multi*2)) { //rl = rl * -1; rl = 1; } else { multi=multi*4; cpt = cpt +1; } } Off(MOTORS); } } while(!etape2) { TextOut(5,LCD_LINE3,"go e2 "); color_line = YELLOW; color_base = BLUE; color_depo = GREEN; SysColorSensorRead(csr); if(csr.ColorValue == color_depo) { //Wait(SEC_2); Off(MOTORS); etape2 = true; TextOut(5,LCD_LINE3,"go e2 done "); StartTask(follow_line); SafeQuit_GetObject(); } else if(csr.ColorValue == color_line) { TextOut(5,LCD_LINE3,"go e2 line ok "); rouler(); } else { TextOut(5,LCD_LINE3,"go e2 line search "); bool line_found = false; int initClock = 0; int clock = 0; int multi = 100; int cpt = 0; while ((!line_found)&&(cpt<=5)) { OnFwd(MOTORS, rl * SPEED_FAST); SysColorSensorRead(csr); clock = clock + 1; if((csr.ColorValue == color_line)||(csr.ColorValue == color_depo)) { line_found = true; } if(clock<multi) { rl = -1; } else if(clock<=(multi*2)) { //rl = rl * -1; rl = 1; } else { multi=multi*4; cpt = cpt +1; } } Off(MOTORS); } } } // Let Object Task // Output : 3 task let_object() { bool etape1 = false; bool etape2 = false; while(!etape1) { TextOut(5,LCD_LINE3,"go e1 "); color_line = YELLOW; color_base = GREEN; color_depo = BLUE; SysColorSensorRead(csr); if(csr.ColorValue == color_depo) { // Action colis Off(MOTORS); TextOut(5,LCD_LINE3,"go e1 BT ON "); while(not(BTReceiveMessage(BT_CONN, MAILBOX, TRUE) == "2"))// Do_get { BTSendMessage(BT_CONN, MAILBOX, "2"); Wait(100); // Overload protector } Wait(SEC_2); TextOut(5,LCD_LINE3,"go e1 U Turn "); OnFwd(MOTORS,50); Wait(SEC_1); Off(MOTORS); OnFwdSync(OUT_AB,70,60); Wait(2500); Off(MOTORS); got_object = false; etape1 = true; TextOut(5,LCD_LINE3,"go e1 done "); } else if(csr.ColorValue == color_line) { TextOut(5,LCD_LINE3,"go e1 line ok "); rouler(); } else { // Retrouver ligne TextOut(5,LCD_LINE3,"go e1 line search "); bool line_found = false; int initClock = 0; int clock = 0; int multi = 100; int cpt = 0; while ((!line_found)&&(cpt<=5)) { OnFwd(MOTORS, rl * SPEED_FAST); SysColorSensorRead(csr); clock = clock + 1; if((csr.ColorValue == color_line)||(csr.ColorValue == color_depo)) { line_found = true; } if(clock<multi) { rl = -1; } else if(clock<=(multi*2)) { //rl = rl * -1; rl = 1; } else { multi=multi*4; cpt = cpt +1; } } TextOut(5,LCD_LINE1,"Looking for line ..."); } } while(!etape2) { TextOut(5,LCD_LINE3,"go e2 "); color_line = YELLOW; color_base = BLUE; color_depo = GREEN; SysColorSensorRead(csr); if(csr.ColorValue == color_depo) { //Wait(SEC_2); Off(MOTORS); etape2 = true; TextOut(5,LCD_LINE3,"go e2 done "); StartTask(follow_line); SafeQuit_LetObject(); } else if(csr.ColorValue == color_line) { TextOut(5,LCD_LINE3,"go e2 line ok "); rouler(); } else { TextOut(5,LCD_LINE3,"go e2 line search "); bool line_found = false; int initClock = 0; int clock = 0; int multi = 100; int cpt = 0; while ((!line_found)&&(cpt<=5)) { OnFwd(MOTORS, rl * SPEED_FAST); SysColorSensorRead(csr); clock = clock + 1; if((csr.ColorValue == color_line)||(csr.ColorValue == color_depo)) { line_found = true; } if(clock<multi) { rl = -1; } else if(clock<=(multi*2)) { //rl = rl * -1; rl = 1; } else { multi=multi*4; cpt = cpt +1; } } Off(MOTORS); } } } // Follow Line Task // Ouput : 2 task follow_line() { while(true) { SysColorSensorRead(csr); color_read = csr.ColorValue; if(color_read == color_main) { s_line = NumToStr(color_read); s_line = StrCat("c c:",s_line); s_line = StrCat(s_line," l:"); s_line = StrCat(s_line,NumToStr(color_main)); s_line = StrCat(s_line, " "); TextOut(5,LCD_LINE2,s_line); if(SensorUS(SENS_ULTRA) > 20) { rouler(); } else { Off(MOTORS); } } else { s_line = NumToStr(color_read); s_line = StrCat("c c:",s_line); s_line = StrCat(s_line," l:"); s_line = StrCat(s_line,NumToStr(color_main)); s_line = StrCat(s_line, " "); TextOut(5,LCD_LINE2,s_line); find_back_line(); } } } // RFID Task // Output : 1 task t_rfid() { while(true) { read = check_rfid(); if(not(read == 0)&¬(read == last_rfid)) { last_rfid = read; } // Then check cards if(read == CARTE1) { PlayTone(440, 500); if(not(blind_run)) { StopTask(follow_line); SafeQuit_FollowLine(); cap = COMPASS1; StartTask(compass_run); } } else if(read == CARTE2) { PlayTone(440, 500); if(not(got_object)) { StopTask(follow_line); SafeQuit_FollowLine(); StartTask(get_object); } } else if(read == CARTE3) { // Discontinue } else if(read == CARTE4) { // Discontinue } else if(read == CARTE5) { // Checkpoint } else if(read == CARTE6) { PlayTone(440, 500); if(got_object) { StopTask(follow_line); SafeQuit_FollowLine(); StartTask(let_object); } } else if(read == CARTE7) { //PlayTone(440, 500); // Checkpoint } else if(read == CARTE8) { // Discontinue } s_rfid = NumToStr(read); s_rfid = StrCat("r c:",s_rfid); s_rfid = StrCat(s_rfid, " l:"); s_rfid = StrCat(s_rfid, NumToStr(last_rfid)); s_rfid = StrCat(s_rfid, " "); TextOut(5,LCD_LINE1,s_rfid); BTSendMessage(BT_SERV, MAILPOS, NumToStr(last_rfid)); } } // Main Task task main() { init(); Precedes(follow_line, t_rfid); }