CAN_Servomoteur_V1_Haoxuan avec lib de servo
Dependencies: mbed
lib.cpp
- Committer:
- Shanglin
- Date:
- 2018-04-12
- Revision:
- 0:3b683da943e6
File content as of revision 0:3b683da943e6:
#include "mbed.h" #include "lib.h" //RawSerial pc(SERIAL_TX, SERIAL_RX, 57600); //RawSerial serial4(PB_6,PB_7,57600); #define tolerance_en_position 16 //1 degre=(1002-21)/320=3.066position #define tolerance_en_position_negatif -16 #define V_b 45 #define V_m 45 #define V_h 45 #define TEMPO_R 30 //------------------------------------------a choisir--------------------------- #define nombre_servomoteur 3 // // #define ID_1 0xFD //=253 premiere // #define ID_3 0x0D //=13 troixieme // #define ID_2 0x0C //=12 deuxieme // #define ID_4 0x09 //Avec engrenage #define Pompe_pin1 PA_15 //Pin de Pompe //------------------------------------------------------------------------------ uint16_t Pos_Engrenage_centre = 351; uint16_t Pos_Engrenage_gauche = 607; uint16_t Pos_Engrenage_droit = 108; uint16_t Pos_Engrenage_Vers_Droit = 62; uint16_t Pos_Engrenage_Vers_Gauche = 630; //----------------------------variables de reception---------------------------- uint8_t rx[300]; uint8_t rx2[256]; unsigned char size_reponse=100; unsigned char recevoir = 0; unsigned char i2 = 0; unsigned char flag_serial4_receive2 = 0; //--------------------variables et fonction de verification--------------------- int16_t pos_position = 0, get_pos = 0, pos_ID = 0; uint8_t pos_led = 0, Status = 0,iID = 0; uint8_t nombre_servo = 0; uint8_t pos_time = 0; uint16_t position_servo_mul[20]; uint8_t data_servo_mul[40]; uint8_t flag_correction = 0; float new_tempo=0; float tab_tempo[20]; uint16_t position_servo_mul_different[20]; uint8_t data_servo_mul_different[60]; int8_t my_Tor = 0; int8_t Tension_inter = 0; float Tension = 0; uint8_t coeffient_time = 1; uint8_t veri = 0; typedef enum {pos,vitesse,pos_mul_complex,pos_mul_complex_different} type_etat ; static type_etat etat=pos; void verifacation() { uint8_t i = 0; switch(etat) { case pos: //------------------------Status-------------------- Status = getStatus(pos_ID); wait_ms(3); pc.printf("status = %d",Status); switch(Status) { case 0: break; case 2: //Exceed allowed POT limit pc.printf("ERR-Depasse la limite de position\n"); //clean_ERR(pos_ID); //wait_ms(500); clear(pos_ID); //positionControl(pos_ID, 1000, 3, GLED_ON); wait_ms(3); Status = getStatus(pos_ID); wait_ms(3); pc.printf("status = %d",Status); break; } //------------------Torque et position------------------------------ my_Tor = Get_Torque(pos_ID); wait_ms(5); //pc.printf("my_Tor = %x\n",my_Tor); while(my_Tor != 0x60) { setTorque(pos_ID,TORQUE_ON); my_Tor = Get_Torque(pos_ID); wait_ms(5); } Tension_inter = Get_Tension_actuelle(pos_ID); Tension = Tension_inter*0.074; if(Tension <=6.60) { coeffient_time = 6; } else if(Tension <= 6.90) { coeffient_time = 4; } else if(Tension <= 7.10) { coeffient_time = 2; } else if(Tension > 7.10) { coeffient_time = 1; } get_pos = getPos(pos_ID); pc.printf("P4=%d ",get_pos); if(((get_pos - pos_position)>tolerance_en_position)||((get_pos - pos_position)<tolerance_en_position_negatif)) { if((get_pos - pos_position)>tolerance_en_position) { new_tempo=(get_pos - pos_position)*0.084*coeffient_time + 1; if (new_tempo > 254) new_tempo = 254; } else if((get_pos - pos_position)<tolerance_en_position_negatif) { new_tempo=(get_pos - pos_position)*0.084*coeffient_time +1; if (new_tempo > 254) new_tempo = 254; } positionControl(pos_ID, pos_position, new_tempo, pos_led); pc.printf("Correction!\n"); } break; case pos_mul_complex: //---------------------------Status--------------------------- for(i=0; i<nombre_servo; i++) { Status = getStatus(data_servo_mul[1+2*i]); pc.printf("status = %d",Status); switch(Status) { case 0: break; case 2: //Exceed allowed POT limit //pc.printf("ERR-Depasse la limite de position\n"); //clean_ERR(id); //wait_ms(500); clear(data_servo_mul[1+2*i]); //positionControl(id, 1000, 3, GLED_ON); //wait_ms(3); //Status = getStatus(data_servo_mul[1+2*i]); //wait_ms(3); //pc.printf("status = %d",Status); break; } } //----------------------Torque et position-------------------------- for(i=0; i<nombre_servo; i++) { my_Tor = Get_Torque(data_servo_mul[1+2*i]); while(my_Tor != 0x60) { setTorque(data_servo_mul[1+2*i],TORQUE_ON); my_Tor = Get_Torque(data_servo_mul[1+2*i]); //pc.printf(" SET_TORQUE "); Status = getStatus(data_servo_mul[1+2*i]); clear(data_servo_mul[1+2*i]); Status = getStatus(data_servo_mul[1+2*i]); } } veri = 0; while(veri < nombre_servo){ for(i=0; i<nombre_servo; i++) { my_Tor = Get_Torque(data_servo_mul[1+2*i]); while(my_Tor != 0x60) { setTorque(data_servo_mul[1+2*i],TORQUE_ON); my_Tor = Get_Torque(data_servo_mul[1+2*i]); //pc.printf(" SET_TORQUE "); Status = getStatus(data_servo_mul[1+2*i]); clear(data_servo_mul[1+2*i]); Status = getStatus(data_servo_mul[1+2*i]); } } for(i=0; i<nombre_servo; i++) { Tension_inter = Get_Tension_actuelle(data_servo_mul[1+2*i]); Tension = Tension_inter*0.074; if(Tension <=6.60) { coeffient_time = 6; } else if(Tension <= 6.90) { coeffient_time = 4; } else if(Tension <= 7.10) { coeffient_time = 2; } else if(Tension > 7.10) { coeffient_time = 1; } get_pos = getPos(data_servo_mul[1+2*i]); pc.printf("PosiM=%d ",get_pos); if((get_pos - position_servo_mul[i])>tolerance_en_position) { tab_tempo[i]=(get_pos - position_servo_mul[i])*0.084*coeffient_time+1; //MinTempo pour 1 position:((320/60)*0.17)/(1000-20)=0.94ms MinPlayTime pour 1 position:0.94ms/11.2ms=0.084 if (tab_tempo[i] > 254) tab_tempo[i] = 254; flag_correction = 1; } else if((get_pos - position_servo_mul[i])<tolerance_en_position_negatif) { tab_tempo[i]=(position_servo_mul[i] - get_pos)*0.084*coeffient_time+1; if (tab_tempo[i] > 254) tab_tempo[i] = 254; flag_correction = 1; } } if(flag_correction == 1) { new_tempo = 0; for(i=0; i<nombre_servo; i++) { if(tab_tempo[i]>new_tempo) { new_tempo = tab_tempo[i]; } } flag_correction = 0; positionControl_Mul_ensemble_complex(nombre_servo,new_tempo,data_servo_mul, position_servo_mul); pc.printf("Correction!\n"); } veri = 0; for(i=0; i<nombre_servo; i++) { get_pos = getPos(data_servo_mul[1+2*i]); pc.printf("PosiM=%d ",get_pos); if((get_pos - position_servo_mul[i])>tolerance_en_position) { tab_tempo[i]=(get_pos - position_servo_mul[i])*0.084*coeffient_time+1; //MinTempo pour 1 position:((320/60)*0.17)/(1000-20)=0.94ms MinPlayTime pour 1 position:0.94ms/11.2ms=0.084 if (tab_tempo[i] > 254) tab_tempo[i] = 254; flag_correction = 1; } else if((get_pos - position_servo_mul[i])<tolerance_en_position_negatif) { tab_tempo[i]=(position_servo_mul[i] - get_pos)*0.084*coeffient_time+1; if (tab_tempo[i] > 254) tab_tempo[i] = 254; flag_correction = 1; }else //if(((get_pos - position_servo_mul[i])<tolerance_en_position)&&((get_pos - position_servo_mul[i])>tolerance_en_position_negatif)) { veri++; } } } break; case pos_mul_complex_different: //---------------------------Status--------------------------- for(i=0; i<nombre_servo; i++) { Status = getStatus(data_servo_mul_different[1+3*i]); //pc.printf("status = %d",Status); switch(Status) { case 0: break; case 2: //Exceed allowed POT limit //pc.printf("ERR-Depasse la limite de position\n"); //clean_ERR(id); //wait_ms(500); clear(data_servo_mul_different[1+3*i]); //positionControl(id, 1000, 3, GLED_ON); //wait_ms(3); //Status = getStatus(data_servo_mul_different[1+2*i]); //wait_ms(3); //pc.printf("status = %d",Status); break; } } //-------------------Torque et position----------------------------- for(i=0; i<nombre_servo; i++) { my_Tor = Get_Torque(data_servo_mul_different[1+3*i]); while(my_Tor != 0x60) { setTorque(data_servo_mul_different[1+3*i],TORQUE_ON); my_Tor = Get_Torque(data_servo_mul_different[1+3*i]); //wait_ms(5); //pc.printf(" SET_TORQUE "); } } for(i=0; i<nombre_servo; i++) { Tension_inter = Get_Tension_actuelle(data_servo_mul_different[1+3*i]); Tension = Tension_inter*0.074; if(Tension <=6.60) { coeffient_time = 6; } else if(Tension <= 6.90) { coeffient_time = 4; } else if(Tension <= 7.10) { coeffient_time = 2; } else if(Tension > 7.10) { coeffient_time = 1; } get_pos = getPos(data_servo_mul_different[1+3*i]); pc.printf("PosiM=%d ",get_pos); if((get_pos - position_servo_mul_different[i])>tolerance_en_position) { tab_tempo[i]=(get_pos - position_servo_mul_different[i])*0.084*coeffient_time+1; //MinTempo pour 1 position:((320/60)*0.17)/(1000-20)=0.94ms MinPlayTime pour 1 position:0.94ms/11.2ms=0.084 if (tab_tempo[i] > 254) tab_tempo[i] = 254; data_servo_mul_different[2+3*i] = tab_tempo[i]; flag_correction = 1; } else if((get_pos - position_servo_mul_different[i])<tolerance_en_position_negatif) { tab_tempo[i]=(position_servo_mul_different[i] - get_pos)*0.084*coeffient_time+1; if (tab_tempo[i] > 254) tab_tempo[i] = 254; data_servo_mul_different[2+3*i] = tab_tempo[i]; flag_correction = 1; } } if(flag_correction == 1) { flag_correction = 0; positionControl_Mul_ensemble_different_complex(nombre_servo,data_servo_mul_different, position_servo_mul_different); pc.printf("Correction!\n"); } break; } } //---------------------fonction d'interruption de reception--------------------- unsigned char flag_perdu_info = 0, indicateur = 0, Size_trame = 0, old_valueserial4 = 0; unsigned char char_receive_pc[100]; unsigned char char_receive_serial4[100]; unsigned char valueserial4=0; unsigned char valuepc=0,flag_seconde=0,flag_pc_receive=0,flag_serial4_receive=0; void receive_serial4() { char_receive_serial4[valueserial4]=serial4.getc(); automate(); } void Interrupt4_en(void){ serial4.attach(&receive_serial4,Serial::RxIrq); } void automate() { typedef enum {Attente,FF,Size,Data} type_etat; static type_etat etat=Attente; //pc.printf("coucou"); //pc.printf("%d\r\n", char_receive_serial4[valueserial4]); switch (etat) { case Attente: if(char_receive_serial4[0] == 0xFF) { etat = FF; valueserial4 = 1; } break; case FF: if(char_receive_serial4[1] == 0xFF) { etat = Size; valueserial4 = 2; } else { etat = Attente; valueserial4 = 0; flag_perdu_info = 1; //flag_perdu_info } break; case Size: if(char_receive_serial4[2] < 7) { etat = Attente; valueserial4 = 0; flag_perdu_info = 1; //flag_perdu_info } else { etat = Data; old_valueserial4 = 2; valueserial4 = 3; } Size_trame = char_receive_serial4[2]; break; case Data: if((valueserial4-2)==(Size_trame-3)) { flag_serial4_receive = 1; etat = Attente; valueserial4 = 0; } else { valueserial4++; } break; default:break; } } //----------------xxxxx----fonction de fermture de serial----------------------- /*void N_Herkulex() { if(Sv != NULL) delete Sv; if(recevoir==2) { size_reponse = rx2[recevoir]; } }*/ //--------------2e fonction d'effacer les erreurs (pas utilisee)---------------- int8_t clean_ERR(uint8_t id) { uint8_t Cx[11]; //{0xFF,0xFF,0x0B,0xFD,0x03,0xC6,0x38,0x30,0x02,0x00,0x00}; uint8_t Cr[9]; //{0xFF,0xFF,0x09,0xFD,0x04,0xC2,0x3C,0x30,0x02}; Cx[0] = HEADER; // Packet Header (0xFF) Cx[1] = HEADER; // Packet Header (0xFF) Cx[2] = MIN_PACKET_SIZE + 4; // Packet Size Cx[3] = id; // Servo ID Cx[4] = CMD_RAM_WRITE; // Command Ram Write (0x03) Cx[5] = 0xC6; // Checksum1 Cx[6] = 0x38; // Checksum2 Cx[7] = RAM_POSITION_FEEDFORWARD_1ST_GAIN; // Address Cx[8] = BYTE2; // Length Cx[9] = 0; Cx[10]= 0; Cr[0] = HEADER; // Packet Header (0xFF) Cr[1] = HEADER; // Packet Header (0xFF) Cr[2] = MIN_PACKET_SIZE + 2; // Packet Size Cr[3] = id; // Servo ID Cr[4] = CMD_RAM_READ; // Command Ram Read Cr[5] = 0xC2; // Checksum1 Cr[6] = 0x3C; // Checksum2 Cr[7] = RAM_POSITION_FEEDFORWARD_1ST_GAIN; // Address Cr[8] = BYTE2; // Length size_reponse = 13; for(uint8_t i = 0; i < 11 ; i++) { while(serial4.writeable() == 0); serial4.putc(Cx[i]); } wait_ms(0.3); for(uint8_t i = 0; i < 9 ; i++) { while(serial4.writeable() == 0); serial4.putc(Cr[i]); } wait_ms(0.5); uint8_t rxBuf[13]; if(flag_serial4_receive2) { for(i2 = 0; i2<13; i2++) { rxBuf[i2] = rx2[i2]; pc.printf(" %x",rx2[i2]); } flag_serial4_receive2=0; } // Checksum1 uint8_t chksum1 = (rxBuf[2]^rxBuf[3]^rxBuf[4]^rxBuf[7]^rxBuf[8]^rxBuf[9]^rxBuf[10]^rxBuf[11]^rxBuf[12]) & 0xFE; if (chksum1 != rxBuf[5]) { return -1; } // Checksum2 uint8_t chksum2 = (~rxBuf[5]&0xFE); if (chksum2 != rxBuf[6]) { return -1; } return 0; } //-------------------------fonction de transmission----------------------------- //comme j'ecrit cette partie dans chaque conction, cette fonction n'est pas souvent utilisee mais on l'utilise void txPacket(uint8_t packetSize, uint8_t* data) { /*#ifdef HERKULEX_DEBUG pc->printf("[TX]"); #endif for(uint8_t i = 0; i < packetSize ; i++) { #ifdef HERKULEX_DEBUG pc->printf("%02X ",data[i]); #endif txd->putc(data[i]); } #ifdef HERKULEX_DEBUG pc->printf("\n"); #endif*/ for(uint8_t i = 0; i < packetSize ; i++) { while(serial4.writeable() == 0); serial4.putc(data[i]); wait_us(100); } wait_ms(TEMPO_R); } //----------------------------fonction de reception----------------------------- //comme j'ecrit cette partie dans chaque conction, cette fonction n'est pas souvent utilisee mais on l'utilise void rxPacket(uint8_t packetSize, uint8_t* data) { /*#ifdef HERKULEX_DEBUG pc->printf("[RX]"); #endif for (uint8_t i=0; i < packetSize; i++) { data[i] = rxd->getc(); #ifdef HERKULEX_DEBUG pc->printf("%02X ",data[i]); #endif } #ifdef HERKULEX_DEBUG pc->printf("\n"); #endif*/ if(flag_serial4_receive) { for(unsigned char i4=0;i4<Size_trame; i4++) { data[i4] = char_receive_serial4[i4]; pc.printf("%d ",(int)char_receive_serial4[i4]); } flag_serial4_receive=0; valueserial4=0; } } //----------------------fonction d'effacer les erreurs-------------------------- void clear(uint8_t id) { uint8_t txBuf[11]; txBuf[0] = HEADER; // Packet Header (0xFF) txBuf[1] = HEADER; // Packet Header (0xFF) txBuf[2] = MIN_PACKET_SIZE + 4; // Packet Size txBuf[3] = id; // Servo ID txBuf[4] = CMD_RAM_WRITE; // Command Ram Write (0x03) txBuf[5] = 0; // Checksum1 txBuf[6] = 0; // Checksum2 txBuf[7] = RAM_STATUS_ERROR; // Address txBuf[8] = BYTE2; // Length txBuf[9] = 0; // Clear RAM_STATUS_ERROR txBuf[10]= 0; // Clear RAM_STATUS_DETAIL // Checksum1 = (PacketSize ^ pID ^ CMD ^ Data[0] ^ Data[1] ^ ... ^ Data[n]) & 0xFE // Checksum2 = (~Checksum1)&0xFE txBuf[5] = (txBuf[2]^txBuf[3]^txBuf[4]^txBuf[7]^txBuf[8]^txBuf[9]^txBuf[10]) & 0xFE; txBuf[6] = (~txBuf[5])&0xFE; // send packet (mbed -> herkulex) for(uint8_t i = 0; i < 11 ; i++) { while(serial4.writeable() == 0); serial4.putc(txBuf[i]); wait_us(100); } wait_ms(TEMPO_R); } //----------------fonction de mis a jour le couple de servo--------------------- void setTorque(uint8_t id, uint8_t cmdTorue) { uint8_t txBuf[10]; txBuf[0] = HEADER; // Packet Header (0xFF) txBuf[1] = HEADER; // Packet Header (0xFF) txBuf[2] = MIN_PACKET_SIZE + 3; // Packet Size txBuf[3] = id; // Servo ID txBuf[4] = CMD_RAM_WRITE; // Command Ram Write (0x03) txBuf[5] = 0; // Checksum1 txBuf[6] = 0; // Checksum2 txBuf[7] = RAM_TORQUE_CONTROL; // Address txBuf[8] = BYTE1; // Length txBuf[9] = cmdTorue; // Torque ON // Checksum1 = (PacketSize ^ pID ^ CMD ^ Data[0] ^ Data[1] ^ ... ^ Data[n]) & 0xFE // Checksum2 = (~Checksum1)&0xFE txBuf[5] = (txBuf[2]^txBuf[3]^txBuf[4]^txBuf[7]^txBuf[8]^txBuf[9]) & 0xFE; txBuf[6] = (~txBuf[5])&0xFE; // send packet (mbed -> herkulex) for(uint8_t i = 0; i < 10 ; i++) { while(serial4.writeable() == 0); serial4.putc(txBuf[i]); wait_us(100); } wait_ms(TEMPO_R); } //-------------fonction de controle de position pour un seul servo-------------- void positionControl(uint8_t id, uint16_t position, uint8_t playtime, uint8_t setLED) { float tempo=0; //if (position > 1023) return; //1002-21 if (playtime > 254) playtime = 254; //return; //1-254 == 11.2ms-2.844sec. tempo=playtime*0.012; pos_ID = id; uint8_t txBuf[12]; etat = pos; pos_position = position; pos_time = playtime; pos_led = setLED; txBuf[0] = HEADER; // Packet Header (0xFF) txBuf[1] = HEADER; // Packet Header (0xFF) txBuf[2] = MIN_PACKET_SIZE + 5; // Packet Size //txBuf[3] = MAX_PID; // pID is total number of servos in the network (0 ~ 253) txBuf[3] = id; // pID is total number of servos in the network (0 ~ 253) txBuf[4] = CMD_S_JOG; // Command S JOG (0x06) txBuf[5] = 0; // Checksum1 txBuf[6] = 0; // Checksum2 txBuf[7] = playtime; // Playtime txBuf[8] = position & 0x00FF; // Position (LSB, Least Significant Bit) txBuf[9] =(position & 0xFF00) >> 8;// position (MSB, Most Significanct Bit) txBuf[10] = POS_MODE | setLED; // Pos Mode and LED on/off txBuf[11] = id; // Servo ID // Checksum1 = (PacketSize ^ pID ^ CMD ^ Data[0] ^ Data[1] ^ ... ^ Data[n]) & 0xFE // Checksum2 = (~Checksum1)&0xFE txBuf[5] = (txBuf[2]^txBuf[3]^txBuf[4]^txBuf[7]^txBuf[8]^txBuf[9]^txBuf[10]^txBuf[11]) & 0xFE; txBuf[6] = (~txBuf[5])&0xFE; // send packet (mbed -> herkulex) //txPacket(12, txBuf); for(uint8_t i = 0; i < 12 ; i++) { while(serial4.writeable() == 0); serial4.putc(txBuf[i]); wait_us(100); } wait(tempo); wait_ms(TEMPO_R); } //-------------fonction de controle de vitesse pour un seul servo--------------- //Comme je n'ai pas utilise cette fonction, je ne l'ai pas encore change void velocityControl(uint8_t id, int16_t speed, uint8_t setLED) { if (speed > 1023 || speed < -1023) return; uint8_t txBuf[12]; txBuf[0] = HEADER; // Packet Header (0xFF) txBuf[1] = HEADER; // Packet Header (0xFF) txBuf[2] = MIN_PACKET_SIZE + 5; // Packet Size txBuf[3] = MAX_PID; // pID is total number of servos in the network (0 ~ 253) txBuf[4] = CMD_S_JOG; // Command S JOG (0x06) txBuf[5] = 0; // Checksum1 txBuf[6] = 0; // Checksum2 txBuf[7] = 0; // Playtime, unmeaningful in turn mode txBuf[8] = speed & 0x00FF; // Speed (LSB, Least Significant Bit) txBuf[9] =(speed & 0xFF00) >> 8; // Speed (MSB, Most Significanct Bit) txBuf[10] = TURN_MODE | setLED; // Turn Mode and LED on/off txBuf[11] = id; // Servo ID // Checksum1 = (PacketSize ^ pID ^ CMD ^ Data[0] ^ Data[1] ^ ... ^ Data[n]) & 0xFE // Checksum2 = (~Checksum1)&0xFE txBuf[5] = (txBuf[2]^txBuf[3]^txBuf[4]^txBuf[7]^txBuf[8]^txBuf[9]^txBuf[10]^txBuf[11]) & 0xFE; txBuf[6] = (~txBuf[5])&0xFE; // send packet (mbed -> herkulex) txPacket(12, txBuf); wait_ms(TEMPO_R); } //--------------------fonction d'acquis d'etat d'un servo----------------------- int8_t getStatus(uint8_t id) { uint8_t status; uint8_t txBuf[7]; size_reponse = 9; txBuf[0] = HEADER; // Packet Header (0xFF) txBuf[1] = HEADER; // Packet Header (0xFF) txBuf[2] = MIN_PACKET_SIZE; // Packet Size txBuf[3] = id; // Servo ID txBuf[4] = CMD_STAT; // Status Error, Status Detail request // Check Sum1 and Check Sum2 txBuf[5] = (txBuf[2]^txBuf[3]^txBuf[4]) & 0xFE; txBuf[6] = (~txBuf[5])&0xFE; // send packet (mbed -> herkulex) for(uint8_t i = 0; i < 7 ; i++) { while(serial4.writeable() == 0); serial4.putc(txBuf[i]); wait_us(100); } // send packet (mbed -> herkulex) uint8_t rxBuf[9]; wait_ms(TEMPO_R); if(flag_serial4_receive) { for(unsigned char i4=0;i4<Size_trame; i4++) { rxBuf[i4] = char_receive_serial4[i4]; pc.printf("%d ",(int)char_receive_serial4[i4]); } flag_serial4_receive=0; valueserial4=0; } // Checksum1 uint8_t chksum1 = (rxBuf[2]^rxBuf[3]^rxBuf[4]^rxBuf[7]^rxBuf[8]) & 0xFE; if (chksum1 != rxBuf[5]) { return -1; } // Checksum2 uint8_t chksum2 = (~rxBuf[5]&0xFE); if (chksum2 != rxBuf[6]) { return -1; } status = rxBuf[7]; // Status Error //status = rxBuf[8]; // Status Detail return status; } //------------------fonction de lire la position actuelle----------------------- int16_t getPos(uint8_t id) { uint16_t position = 0; uint8_t txBuf[9]; size_reponse = 13; txBuf[0] = HEADER; // Packet Header (0xFF) txBuf[1] = HEADER; // Packet Header (0xFF) txBuf[2] = MIN_PACKET_SIZE + 2; // Packet Size txBuf[3] = id; // Servo ID txBuf[4] = CMD_RAM_READ; // Command Ram Read txBuf[5] = 0; // Checksum1 txBuf[6] = 0; // Checksum2 txBuf[7] = RAM_CALIBRATED_POSITION; // Address txBuf[8] = BYTE2; // Check Sum1 and Check Sum2 txBuf[5] = (txBuf[2]^txBuf[3]^txBuf[4]^txBuf[7]^txBuf[8]) & 0xFE; txBuf[6] = (~txBuf[5])&0xFE; for(uint8_t i = 0; i < 9 ; i++) { while(serial4.writeable() == 0); serial4.putc(txBuf[i]); wait_us(100); } // send packet (mbed -> herkulex) uint8_t rxBuf[13]; wait_ms(TEMPO_R); if(flag_serial4_receive) { for(unsigned char i4=0;i4<Size_trame; i4++) { rxBuf[i4] = char_receive_serial4[i4]; pc.printf("%d ",(int)char_receive_serial4[i4]); } flag_serial4_receive=0; valueserial4=0; } // Checksum1 uint8_t chksum1 = (rxBuf[2]^rxBuf[3]^rxBuf[4]^rxBuf[7]^rxBuf[8]^rxBuf[9]^rxBuf[10]^rxBuf[11]^rxBuf[12]) & 0xFE; if (chksum1 != rxBuf[5]) { /*#ifdef HERKULEX_DEBUG pc->printf("Checksum1 fault\n"); #endif*/ return -1; } // Checksum2 uint8_t chksum2 = (~rxBuf[5]&0xFE); if (chksum2 != rxBuf[6]) { /* #ifdef HERKULEX_DEBUG pc->printf("Checksum2 fault\n"); #endif*/ return -1; } position = ((rxBuf[10]&0x03)<<8) | rxBuf[9]; /* #ifdef HERKULEX_DEBUG pc->printf("position = %04X(%d)\n", position, position); #endif*/ //} return position; } //---------------fonction d'acquis d'etat de couple d'un servo------------------ int8_t Get_Torque(int8_t id) { uint8_t txBuf[9]; int8_t Tor = 0; uint8_t iv=0; for(iv=0; iv<20; iv++) { rx2[iv] = 0; } txBuf[0] = HEADER; // Packet Header (0xFF) txBuf[1] = HEADER; // Packet Header (0xFF) txBuf[2] = MIN_PACKET_SIZE + 2; // Packet Size txBuf[3] = id; // Servo ID txBuf[4] = CMD_RAM_READ; // Command Ram Read txBuf[5] = 0; // Checksum1 txBuf[6] = 0; // Checksum2 txBuf[7] = RAM_TORQUE_CONTROL; txBuf[8] = BYTE1; // Length // Check Sum1 and Check Sum2 txBuf[5] = (txBuf[2]^txBuf[3]^txBuf[4]^txBuf[7]^txBuf[8]) & 0xFE; txBuf[6] = (~txBuf[5])&0xFE; pc.printf(" Torque "); for(uint8_t i = 0; i < 9 ; i++) { while(serial4.writeable() == 0); serial4.putc(txBuf[i]); wait_us(100); } // send packet (mbed -> herkulex) uint8_t rxBuf[12]; //wait_ms(3); wait_ms(TEMPO_R); if(flag_serial4_receive) { for(unsigned char i4=0;i4<Size_trame; i4++) { rxBuf[i4] = char_receive_serial4[i4]; pc.printf("%d ",(int)char_receive_serial4[i4]); } flag_serial4_receive=0; valueserial4=0; } uint8_t chksum1 = (rxBuf[2]^rxBuf[3]^rxBuf[4]^rxBuf[7]^rxBuf[8]^rxBuf[9]^rxBuf[10]^rxBuf[11]) & 0xFE; if (chksum1 != rxBuf[5]) { /*#ifdef HERKULEX_DEBUG pc->printf("Checksum1 fault\n"); #endif*/ recevoir=0; return -1; } // Checksum2 uint8_t chksum2 = (~rxBuf[5]&0xFE); if (chksum2 != rxBuf[6]) { /* #ifdef HERKULEX_DEBUG pc->printf("Checksum2 fault\n"); #endif*/ recevoir=0; return -1; } Tor = rxBuf[9]; /* #ifdef HERKULEX_DEBUG pc->printf("position = %04X(%d)\n", position, position); #endif*/ //} return Tor; } //---------------fonction pour lire le temperature max pour un servo------------ int8_t Get_Temperature_MAX(int8_t id) { uint8_t txBuf[9]; int8_t tempeMAX = 0; txBuf[0] = HEADER; // Packet Header (0xFF) txBuf[1] = HEADER; // Packet Header (0xFF) txBuf[2] = MIN_PACKET_SIZE + 2; // Packet Size txBuf[3] = id; // Servo ID txBuf[4] = CMD_RAM_READ; // Command Ram Read txBuf[5] = 0; // Checksum1 txBuf[6] = 0; // Checksum2 txBuf[7] = RAM_MAX_TEMPERATURE; txBuf[8] = BYTE1; // Length // Check Sum1 and Check Sum2 txBuf[5] = (txBuf[2]^txBuf[3]^txBuf[4]^txBuf[7]^txBuf[8]) & 0xFE; txBuf[6] = (~txBuf[5])&0xFE; pc.printf(" tempeMAX "); for(uint8_t i = 0; i < 9 ; i++) { while(serial4.writeable() == 0); serial4.putc(txBuf[i]); wait_us(100); } // send packet (mbed -> herkulex) uint8_t rxBuf[12]; //wait_ms(3); wait_ms(TEMPO_R); if(flag_serial4_receive) { for(unsigned char i4=0;i4<Size_trame; i4++) { rxBuf[i4] = char_receive_serial4[i4]; pc.printf("%d ",(int)char_receive_serial4[i4]); } flag_serial4_receive=0; valueserial4=0; } uint8_t chksum1 = (rxBuf[2]^rxBuf[3]^rxBuf[4]^rxBuf[7]^rxBuf[8]^rxBuf[9]^rxBuf[10]^rxBuf[11]) & 0xFE; if (chksum1 != rxBuf[5]) { /*#ifdef HERKULEX_DEBUG pc->printf("Checksum1 fault\n"); #endif*/ recevoir=0; return -1; } // Checksum2 uint8_t chksum2 = (~rxBuf[5]&0xFE); if (chksum2 != rxBuf[6]) { /* #ifdef HERKULEX_DEBUG pc->printf("Checksum2 fault\n"); #endif*/ recevoir=0; return -1; } tempeMAX = rxBuf[9]; /* #ifdef HERKULEX_DEBUG pc->printf("position = %04X(%d)\n", position, position); #endif*/ //} return tempeMAX; } //--------fonction de controle de position pour deux servo(same playtime)------- void positionControl_Mul_ensemble(uint8_t id, uint16_t position, uint8_t playtime, uint8_t setLED,uint8_t id2, uint16_t position2, uint8_t setLED2) { float tempo=0; //if (position > 1023) return; //1002-21 if (playtime > 254) return; //1-254 == 11.2ms-2.844sec. tempo=playtime*0.012; uint8_t txBuf[16]; etat = pos; pos_position = position; pos_time = playtime; pos_led = setLED; txBuf[0] = HEADER; // Packet Header (0xFF) txBuf[1] = HEADER; // Packet Header (0xFF) txBuf[2] = MIN_PACKET_SIZE + 9; // Packet Size //txBuf[3] = MAX_PID; // pID is total number of servos in the network (0 ~ 253) txBuf[3] = 254; // broadcast ID txBuf[4] = CMD_S_JOG; // Command S JOG (0x06) txBuf[5] = 0; // Checksum1 txBuf[6] = 0; // Checksum2 txBuf[7] = playtime; // Playtime txBuf[8] = position & 0x00FF; // Position (LSB, Least Significant Bit) txBuf[9] =(position & 0xFF00) >> 8;// position (MSB, Most Significanct Bit) txBuf[10] = POS_MODE | setLED; // Pos Mode and LED on/off txBuf[11] = id; // Servo ID txBuf[12] = position2 & 0x00FF; // Position (LSB, Least Significant Bit) txBuf[13] =(position2 & 0xFF00) >> 8;// position (MSB, Most Significanct Bit) txBuf[14] = POS_MODE | setLED2; // Pos Mode and LED on/off txBuf[15] = id2; // Servo ID // Checksum1 = (PacketSize ^ pID ^ CMD ^ Data[0] ^ Data[1] ^ ... ^ Data[n]) & 0xFE // Checksum2 = (~Checksum1)&0xFE txBuf[5] = (txBuf[2]^txBuf[3]^txBuf[4]^txBuf[7]^txBuf[8]^txBuf[9]^txBuf[10]^txBuf[11]^txBuf[12]^txBuf[13]^txBuf[14]^txBuf[15]) & 0xFE; txBuf[6] = (~txBuf[5])&0xFE; // send packet (mbed -> herkulex) for(uint8_t i = 0; i < 16 ; i++) { while(serial4.writeable() == 0); serial4.putc(txBuf[i]); wait_us(100); } wait(tempo); wait_ms(TEMPO_R); } //-----fonction de controle de position pour deux servo(different playtime)----- //a changer... void positionControl_Mul_playtime_different(uint8_t id, uint16_t position, uint8_t playtime, uint8_t setLED,uint8_t id2, uint16_t position2, uint8_t playtime2, uint8_t setLED2) { float tempo=0; //if (position > 1023) return; //1002-21 if (playtime > 254) playtime = 254; //return; //1-254 == 11.2ms-2.844sec. if(playtime>playtime2) { tempo=playtime*0.012; } else if(playtime<playtime2) { tempo=playtime2*0.012; } uint8_t txBuf[17]; etat = pos; pos_position = position; pos_time = playtime; pos_led = setLED; txBuf[0] = HEADER; // Packet Header (0xFF) txBuf[1] = HEADER; // Packet Header (0xFF) txBuf[2] = MIN_PACKET_SIZE + 9; // Packet Size //txBuf[3] = MAX_PID; // pID is total number of servos in the network (0 ~ 253) txBuf[3] = 254; // broadcast ID txBuf[4] = CMD_I_JOG; // Command I JOG txBuf[5] = 0; // Checksum1 txBuf[6] = 0; // Checksum2 txBuf[7] = position & 0x00FF; // Position (LSB, Least Significant Bit) txBuf[8] =(position & 0xFF00) >> 8;// position (MSB, Most Significanct Bit) txBuf[9] = POS_MODE | setLED; // Pos Mode and LED on/off txBuf[10] = id; // Servo ID txBuf[11] = playtime; // Playtime txBuf[12] = position2 & 0x00FF; // Position (LSB, Least Significant Bit) txBuf[13] =(position2 & 0xFF00) >> 8;// position (MSB, Most Significanct Bit) txBuf[14] = POS_MODE | setLED2; // Pos Mode and LED on/off txBuf[15] = id2; // Servo ID txBuf[16] = playtime2; // Playtime // Checksum1 = (PacketSize ^ pID ^ CMD ^ Data[0] ^ Data[1] ^ ... ^ Data[n]) & 0xFE // Checksum2 = (~Checksum1)&0xFE txBuf[5] = (txBuf[2]^txBuf[3]^txBuf[4]^txBuf[7]^txBuf[8]^txBuf[9]^txBuf[10]^txBuf[11]^txBuf[12]^txBuf[13]^txBuf[14]^txBuf[15]) & 0xFE; txBuf[6] = (~txBuf[5])&0xFE; // send packet (mbed -> herkulex) //txPacket(12, txBuf); for(uint8_t i = 0; i < 17 ; i++) { while(serial4.writeable() == 0); serial4.putc(txBuf[i]); wait_us(100); } wait(tempo); wait_ms(TEMPO_R); } //-----fonction de controle de position pour plusieurs servo(same playtime)----- void positionControl_Mul_ensemble_complex(uint8_t nb_servo, uint8_t playtime, uint8_t* data, uint16_t* pos) // uint16_t position, uint8_t setLED, uint8_t id { float tempo=0; uint8_t taille = 0,i = 0,idata = 0, ipos = 0; //if (position > 1023) return; //1002-21 if (playtime > 254) return; //1-254 == 11.2ms-2.844sec. tempo=playtime*0.012; taille = 7 + 1 + 4 * nb_servo; nombre_servo = nb_servo; pos_time = playtime; uint8_t txBuf[taille]; etat = pos_mul_complex; txBuf[0] = HEADER; // Packet Header (0xFF) txBuf[1] = HEADER; // Packet Header (0xFF) txBuf[2] = MIN_PACKET_SIZE + 1 + 4 * nb_servo; // Packet Size //txBuf[3] = MAX_PID; // pID is total number of servos in the network (0 ~ 253) txBuf[3] = 254; // broadcast ID txBuf[4] = CMD_S_JOG; // Command S JOG (0x06) txBuf[5] = 0; // Checksum1 txBuf[6] = 0; // Checksum2 txBuf[7] = playtime; // Playtime for(i=0; i<nb_servo; i++) { txBuf[8+i*4] = pos[ipos] & 0x00FF; // Position (LSB, Least Significant Bit) txBuf[9+i*4] =(pos[ipos] & 0xFF00) >> 8;// position (MSB, Most Significanct Bit) position_servo_mul[ipos] = pos[ipos]; ipos++; txBuf[10+i*4] = POS_MODE | data[idata]; // Pos Mode and LED on/off data_servo_mul[idata] = data[idata]; idata++; txBuf[11+i*4] = data[idata]; // Servo ID data_servo_mul[idata] = data[idata]; idata++; } // Checksum1 = (PacketSize ^ pID ^ CMD ^ Data[0] ^ Data[1] ^ ... ^ Data[n]) & 0xFE // Checksum2 = (~Checksum1)&0xFE txBuf[5] = txBuf[2]^txBuf[3]^txBuf[4]^txBuf[7]; for(i=1; i<(taille-7); i++) { txBuf[5]=txBuf[5]^txBuf[7+i]; } txBuf[5] = txBuf[5]& 0xFE; txBuf[6] = (~txBuf[5])&0xFE; // send packet (mbed -> herkulex) for(uint8_t i = 0; i < taille ; i++) { while(serial4.writeable() == 0); serial4.putc(txBuf[i]); wait_us(100); } //wait(tempo); //wait_ms(TEMPO_R); } //--fonction de controle de position pour plusieurs servo(different playtime)--- void positionControl_Mul_ensemble_different_complex(uint8_t nb_servo, uint8_t* data, uint16_t* pos) // uint16_t position, uint8_t setLED, uint8_t id, uint8_t playtime { float tempo=0; uint8_t Max_playtime = 0; uint8_t taille = 0,i = 0,idata = 0, ipos = 0,iplay_time = 0; //if (position > 1023) return; //1002-21 //if (playtime > 254) return; //1-254 == 11.2ms-2.844sec. for(iplay_time=0; iplay_time<nb_servo; iplay_time++) { if(Max_playtime<data[2+3*iplay_time]) { Max_playtime=data[2+3*iplay_time]; } } tempo=Max_playtime*0.012; taille = 7 + 5 * nb_servo; nombre_servo = nb_servo; uint8_t txBuf[taille]; etat = pos_mul_complex_different; txBuf[0] = HEADER; // Packet Header (0xFF) txBuf[1] = HEADER; // Packet Header (0xFF) txBuf[2] = MIN_PACKET_SIZE + 5 * nb_servo; // Packet Size //txBuf[3] = MAX_PID; // pID is total number of servos in the network (0 ~ 253) txBuf[3] = 254; // broadcast ID txBuf[4] = CMD_I_JOG; // Command I JOG (0x06) txBuf[5] = 0; // Checksum1 txBuf[6] = 0; // Checksum2 for(i=0; i<nb_servo; i++) { txBuf[7+i*5] = pos[ipos] & 0x00FF; // Position (LSB, Least Significant Bit) txBuf[8+i*5] =(pos[ipos] & 0xFF00) >> 8;// position (MSB, Most Significanct Bit) position_servo_mul_different[ipos] = pos[ipos]; ipos++; txBuf[9+i*5] = POS_MODE | data[idata]; // Pos Mode and LED on/off data_servo_mul_different[idata] = data[idata]; idata++; txBuf[10+i*5] = data[idata]; // Servo ID data_servo_mul_different[idata] = data[idata]; idata++; txBuf[11+i*5] = data[idata]; // Playtime data_servo_mul_different[idata] = data[idata]; idata++; } // Checksum1 = (PacketSize ^ pID ^ CMD ^ Data[0] ^ Data[1] ^ ... ^ Data[n]) & 0xFE // Checksum2 = (~Checksum1)&0xFE txBuf[5] = txBuf[2]^txBuf[3]^txBuf[4]; for(i=1; i<(taille-6); i++) { txBuf[5]=txBuf[5]^txBuf[6+i]; } txBuf[5] = txBuf[5]& 0xFE; txBuf[6] = (~txBuf[5])&0xFE; // send packet (mbed -> herkulex) for(uint8_t i = 0; i < taille ; i++) { while(serial4.writeable() == 0); serial4.putc(txBuf[i]); wait_us(100); } wait(tempo); wait_ms(TEMPO_R); } //---------------fonction pour lire la tension min pour un servo---------------- int8_t Get_Tension_MIN(int8_t id) { uint8_t txBuf[9]; int8_t tensionMIN = 0; txBuf[0] = HEADER; // Packet Header (0xFF) txBuf[1] = HEADER; // Packet Header (0xFF) txBuf[2] = MIN_PACKET_SIZE + 2; // Packet Size txBuf[3] = id; // Servo ID txBuf[4] = CMD_RAM_READ; // Command Ram Read txBuf[5] = 0; // Checksum1 txBuf[6] = 0; // Checksum2 txBuf[7] = RAM_MIN_VOLTAGE; txBuf[8] = BYTE1; // Length // Check Sum1 and Check Sum2 txBuf[5] = (txBuf[2]^txBuf[3]^txBuf[4]^txBuf[7]^txBuf[8]) & 0xFE; txBuf[6] = (~txBuf[5])&0xFE; pc.printf(" tensionMIN "); for(uint8_t i = 0; i < 9 ; i++) { while(serial4.writeable() == 0); serial4.putc(txBuf[i]); wait_us(100); } // send packet (mbed -> herkulex) uint8_t rxBuf[12]; //wait_ms(3); wait_ms(TEMPO_R); if(flag_serial4_receive) { for(unsigned char i4=0;i4<Size_trame; i4++) { rxBuf[i4] = char_receive_serial4[i4]; pc.printf("%d ",(int)char_receive_serial4[i4]); } flag_serial4_receive=0; valueserial4=0; } uint8_t chksum1 = (rxBuf[2]^rxBuf[3]^rxBuf[4]^rxBuf[7]^rxBuf[8]^rxBuf[9]^rxBuf[10]^rxBuf[11]) & 0xFE; if (chksum1 != rxBuf[5]) { /*#ifdef HERKULEX_DEBUG pc->printf("Checksum1 fault\n"); #endif*/ recevoir=0; return -1; } // Checksum2 uint8_t chksum2 = (~rxBuf[5]&0xFE); if (chksum2 != rxBuf[6]) { /* #ifdef HERKULEX_DEBUG pc->printf("Checksum2 fault\n"); #endif*/ recevoir=0; return -1; } tensionMIN = rxBuf[9]; /* #ifdef HERKULEX_DEBUG pc->printf("position = %04X(%d)\n", position, position); #endif*/ //} return tensionMIN; } //-------------fonction pour controle la tension min pour un servo-------------- void Set_Tension_MIN(int8_t id,uint8_t Tension_Min) { uint8_t txBuf[10]; txBuf[0] = HEADER; // Packet Header (0xFF) txBuf[1] = HEADER; // Packet Header (0xFF) txBuf[2] = MIN_PACKET_SIZE + 3; // Packet Size txBuf[3] = id; // Servo ID txBuf[4] = CMD_RAM_WRITE; // Command Ram Write (0x03) txBuf[5] = 0; // Checksum1 txBuf[6] = 0; // Checksum2 txBuf[7] = RAM_MIN_VOLTAGE; txBuf[8] = BYTE1; // Length txBuf[9] = Tension_Min; // Check Sum1 and Check Sum2 txBuf[5] = (txBuf[2]^txBuf[3]^txBuf[4]^txBuf[7]^txBuf[8]^txBuf[9]) & 0xFE; txBuf[6] = (~txBuf[5])&0xFE; pc.printf(" tensionMIN "); for(uint8_t i = 0; i < 10 ; i++) { while(serial4.writeable() == 0); serial4.putc(txBuf[i]); wait_us(100); } //wait_ms(3); wait_ms(TEMPO_R); } //------------fonction pour lire la tension acttuelle pour un servo------------- int8_t Get_Tension_actuelle(int8_t id) { uint8_t txBuf[9]; int8_t tension = 0; txBuf[0] = HEADER; // Packet Header (0xFF) txBuf[1] = HEADER; // Packet Header (0xFF) txBuf[2] = MIN_PACKET_SIZE + 2; // Packet Size txBuf[3] = id; // Servo ID txBuf[4] = CMD_RAM_READ; // Command Ram Read (0x03) txBuf[5] = 0; // Checksum1 txBuf[6] = 0; // Checksum2 txBuf[7] = RAM_VOLTAGE; txBuf[8] = BYTE2; // Length // Check Sum1 and Check Sum2 txBuf[5] = (txBuf[2]^txBuf[3]^txBuf[4]^txBuf[7]^txBuf[8]) & 0xFE; txBuf[6] = (~txBuf[5])&0xFE; pc.printf(" tension "); for(uint8_t i = 0; i < 9 ; i++) { while(serial4.writeable() == 0); serial4.putc(txBuf[i]); wait_us(100); } // send packet (mbed -> herkulex) uint8_t rxBuf[13]; //wait_ms(3); wait_ms(TEMPO_R); if(flag_serial4_receive) { for(unsigned char i4=0;i4<Size_trame; i4++) { rxBuf[i4] = char_receive_serial4[i4]; pc.printf("%d ",(int)char_receive_serial4[i4]); } flag_serial4_receive=0; valueserial4=0; } uint8_t chksum1 = (rxBuf[2]^rxBuf[3]^rxBuf[4]^rxBuf[7]^rxBuf[8]^rxBuf[9]^rxBuf[10]^rxBuf[11]^rxBuf[12]) & 0xFE; if (chksum1 != rxBuf[5]) { /*#ifdef HERKULEX_DEBUG pc->printf("Checksum1 fault\n"); #endif*/ recevoir=0; return -1; } // Checksum2 uint8_t chksum2 = (~rxBuf[5]&0xFE); if (chksum2 != rxBuf[6]) { /* #ifdef HERKULEX_DEBUG pc->printf("Checksum2 fault\n"); #endif*/ recevoir=0; return -1; } tension = rxBuf[9]; /* #ifdef HERKULEX_DEBUG pc->printf("position = %04X(%d)\n", position, position); #endif*/ //} return tension; } //-----------------deplacement des cubes--------------------- void deplacement_cubes(uint8_t poi_init, uint8_t poi_fini,int8_t ID,int8_t ID2,int8_t ID3,int8_t ID4,PinName Pompe_pin) { PwmOut Pompe(Pompe_pin); switch(poi_init) { case 5: //verifie X //uint8_t servo1[6] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3}; // uint8_t setLED, uint8_t id //uint8_t servo2[6] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3}; uint8_t servo3[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, BLED_ON, ID4}; uint8_t servo4[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint8_t servo5[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; //uint16_t position1[3] = {512, 236, 236}; //uint16_t position2[3] = {512, 512, 788}; uint16_t position3[4] = {374, 926, 788, Pos_Engrenage_centre}; uint16_t position6[4] = {481, 950, 714, Pos_Engrenage_centre}; uint16_t position4[4] = {650, 952, 511, Pos_Engrenage_centre}; uint16_t position5[4] = {451, 944, 720, Pos_Engrenage_centre}; /*positionControl_Mul_ensemble_complex(nombre_servomoteur,60,servo1, position1); verifacation(); positionControl_Mul_ensemble_complex(nombre_servomoteur,60,servo2, position2); verifacation();*/ positionControl_Mul_ensemble_complex(4,V_b,servo3, position3); verifacation(); positionControl_Mul_ensemble_complex(4,V_b,servo3, position6); verifacation(); positionControl_Mul_ensemble_complex(4,V_h,servo4, position4); verifacation(); wait(0.3); Pompe = 1; wait(0.1); positionControl_Mul_ensemble_complex(4,V_m,servo5, position5); verifacation(); break; case 3: //verifie X //uint8_t servo31[6] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3}; // uint8_t setLED, uint8_t id //uint8_t servo32[6] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3}; uint8_t servo33[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, BLED_ON, ID4}; uint8_t servo34[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, BLED_ON, ID4}; uint8_t servo35[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, BLED_ON, ID4}; //uint16_t position31[3] = {512, 236, 236}; //uint16_t position32[3] = {512, 512, 788}; uint16_t position33[4] = {374, 926, 788, Pos_Engrenage_centre}; uint16_t position34[4] = {673, 837, 595, Pos_Engrenage_centre}; //647, 842, 604 uint16_t position36[4] = {547, 845, 702, Pos_Engrenage_centre}; uint16_t position35[4] = {451, 944, 720, Pos_Engrenage_centre}; //positionControl_Mul_ensemble_complex(nombre_servomoteur,60,servo31, position31); //verifacation(); //positionControl_Mul_ensemble_complex(nombre_servomoteur,60,servo32, position32); //verifacation(); positionControl_Mul_ensemble_complex(4,V_b,servo33, position33); verifacation(); positionControl_Mul_ensemble_complex(4,V_h,servo34, position34); verifacation(); wait(0.3); Pompe = 1; wait(0.1); positionControl_Mul_ensemble_complex(4,V_m,servo33, position36); verifacation(); positionControl_Mul_ensemble_complex(4,V_m,servo35, position35); verifacation(); break; case 2: //uint8_t servo20[6] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3}; //uint8_t servo21[6] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3}; // uint8_t setLED, uint8_t id //uint8_t servo22[6] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3}; uint8_t servo23[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, BLED_ON, ID4}; uint8_t servo24[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint8_t servo25[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; //uint16_t position20[3] = {512, 236, 236}; //uint16_t position21[3] = {512, 236, 236}; //uint16_t position22[3] = {512, 512, 788}; uint16_t position23[4] = {374, 926, 788, Pos_Engrenage_gauche}; uint16_t position24[4] = {673, 837, 595, Pos_Engrenage_gauche}; uint16_t position25[4] = {451, 944, 720, Pos_Engrenage_gauche}; /*positionControl_Mul_ensemble_complex(nombre_servomoteur,60,servo20, position20); verifacation(); wait(0.2); positionControl_Mul_ensemble_complex(nombre_servomoteur,60,servo21, position21); verifacation(); positionControl_Mul_ensemble_complex(nombre_servomoteur,60,servo22, position22); verifacation();*/ positionControl_Mul_ensemble_complex(4,V_b,servo23, position23); verifacation(); positionControl_Mul_ensemble_complex(4,V_h,servo24, position24); verifacation(); wait(0.3); Pompe = 1; wait(0.1); positionControl_Mul_ensemble_complex(4,V_m,servo25, position25); verifacation(); break; case 4: //uint8_t servo40[6] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3}; //uint8_t servo41[6] = {GLED_ON, ID4, BLED_ON, ID2, GLED_ON, ID3}; // uint8_t setLED, uint8_t id //uint8_t servo42[6] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3}; uint8_t servo43[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, BLED_ON, ID4}; uint8_t servo44[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint8_t servo45[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; //uint16_t position40[3] = {512, 236, 236}; //uint16_t position41[3] = {512, 236, 236}; //uint16_t position42[3] = {512, 512, 788}; uint16_t position43[4] = {374, 926, 788, Pos_Engrenage_droit}; uint16_t position44[4] = {673, 837, 595, Pos_Engrenage_droit}; uint16_t position45[4] = {451, 944, 720, Pos_Engrenage_droit}; /*positionControl_Mul_ensemble_complex(nombre_servomoteur,60,servo40, position40); verifacation(); wait(0.2); positionControl_Mul_ensemble_complex(nombre_servomoteur,60,servo41, position41); verifacation(); positionControl_Mul_ensemble_complex(nombre_servomoteur,60,servo42, position42); verifacation();*/ positionControl_Mul_ensemble_complex(4,V_b,servo43, position43); verifacation(); positionControl_Mul_ensemble_complex(4,V_h,servo44, position44); verifacation(); wait(0.3); Pompe = 1; wait(0.1); positionControl_Mul_ensemble_complex(4,V_m,servo45, position45); verifacation(); break; case 1: //verifie X //uint8_t servo11[6] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3}; // uint8_t setLED, uint8_t id //uint8_t servo12[6] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3}; uint8_t servo13[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, BLED_ON, ID4}; uint8_t servo14[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, BLED_ON, ID4}; uint8_t servo15[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, BLED_ON, ID4}; uint8_t servo16[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, BLED_ON, ID4}; //uint16_t position11[3] = {512, 236, 236}; //uint16_t position12[3] = {512, 512, 788}; uint16_t position13[4] = {374, 926, 788, Pos_Engrenage_centre}; uint16_t position17[4] = {658, 657, 790, Pos_Engrenage_centre}; uint16_t position14[4] = {731, 675, 695, Pos_Engrenage_centre}; uint16_t position15[4] = {658, 657, 790, Pos_Engrenage_centre}; uint16_t position16[4] = {417, 885, 796, Pos_Engrenage_centre}; //positionControl_Mul_ensemble_complex(nombre_servomoteur,60,servo11, position11); //verifacation(); //positionControl_Mul_ensemble_complex(nombre_servomoteur,60,servo12, position12); //verifacation(); positionControl_Mul_ensemble_complex(4,V_b,servo13, position13); verifacation(); positionControl_Mul_ensemble_complex(4,V_m,servo13, position17); verifacation(); positionControl_Mul_ensemble_complex(4,V_h,servo14, position14); verifacation(); wait(0.3); Pompe = 1; wait(0.1); positionControl_Mul_ensemble_complex(4,V_h,servo15, position15); verifacation(); //wait(2); positionControl_Mul_ensemble_complex(4,V_h,servo16, position16); verifacation(); break; /*case 22: uint8_t servo221[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; // uint8_t setLED, uint8_t id uint8_t servo222[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint8_t servo223[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; uint8_t servo224[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint16_t position221[4] = {452, 801, 849, Pos_Engrenage_gauche}; uint16_t position222[4] = {535, 768, 805, Pos_Engrenage_gauche}; uint16_t position223[4] = {553, 819, 733, Pos_Engrenage_gauche}; uint16_t position224[4] = {395, 864, 832, Pos_Engrenage_gauche}; positionControl_Mul_ensemble_complex(4,V_m,servo221, position221); verifacation(); positionControl_Mul_ensemble_complex(4,V_h,servo222, position222); verifacation(); positionControl_Mul_ensemble_complex(4,V_b,servo223, position223); verifacation(); wait(0.5); Pompe = 1; wait(0.5); positionControl_Mul_ensemble_complex(4,V_b,servo224, position224); verifacation(); break; case 42: uint8_t servo421[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; // uint8_t setLED, uint8_t id uint8_t servo422[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint8_t servo423[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; uint8_t servo424[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint16_t position421[4] = {452, 801, 849, Pos_Engrenage_droit}; uint16_t position422[4] = {535, 768, 805, Pos_Engrenage_droit}; uint16_t position423[4] = {553, 819, 733, Pos_Engrenage_droit}; uint16_t position424[4] = {395, 864, 832, Pos_Engrenage_droit}; positionControl_Mul_ensemble_complex(4,V_m,servo421, position421); verifacation(); positionControl_Mul_ensemble_complex(4,V_h,servo422, position422); verifacation(); positionControl_Mul_ensemble_complex(4,V_b,servo423, position423); verifacation(); wait(0.5); Pompe = 1; wait(0.5); positionControl_Mul_ensemble_complex(4,V_b,servo424, position424); verifacation(); break;*/ } switch(poi_fini) { /*case 11: uint8_t servo101[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; // uint8_t setLED, uint8_t id uint8_t servo102[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint8_t servo103[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; uint8_t servo104[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint16_t position101[4] = {663, 615, 820, Pos_Engrenage_centre}; uint16_t position102[4] = {742, 542, 819, Pos_Engrenage_centre}; uint16_t position103[4] = {715, 660, 719, Pos_Engrenage_centre}; uint16_t position104[4] = {418, 885, 789, Pos_Engrenage_centre}; positionControl_Mul_ensemble_complex(4,V_b,servo101, position101); verifacation(); positionControl_Mul_ensemble_complex(4,V_m,servo102, position102); verifacation(); positionControl_Mul_ensemble_complex(4,V_h,servo103, position103); verifacation(); wait(0.5); Pompe = 0; wait(0.5); positionControl_Mul_ensemble_complex(4,V_b,servo104, position104); verifacation(); break;*/ case 12: uint8_t servo121[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; // uint8_t setLED, uint8_t id uint8_t servo122[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint8_t servo123[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; uint8_t servo124[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint16_t position121[4] = {660, 620, 828, Pos_Engrenage_centre}; uint16_t position122[4] = {659, 669, 763, Pos_Engrenage_centre}; uint16_t position123[4] = {532, 570, 835, Pos_Engrenage_centre}; uint16_t position124[4] = {418, 885, 789, Pos_Engrenage_centre}; positionControl_Mul_ensemble_complex(4,V_m,servo121, position121); verifacation(); positionControl_Mul_ensemble_complex(4,V_h,servo122, position122); verifacation(); wait(0.1); Pompe = 0; wait(0.2); positionControl_Mul_ensemble_complex(4,V_b,servo123, position123); verifacation(); positionControl_Mul_ensemble_complex(4,V_b,servo124, position124); verifacation(); break; case 13: uint8_t servo131[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; // uint8_t setLED, uint8_t id uint8_t servo132[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint8_t servo133[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; uint8_t servo134[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint16_t position131[4] = {552, 649, 853, Pos_Engrenage_centre}; uint16_t position132[4] = {647, 589, 813, Pos_Engrenage_centre}; uint16_t position133[4] = {552, 649, 853, Pos_Engrenage_centre}; uint16_t position134[4] = {418, 885, 789, Pos_Engrenage_centre}; positionControl_Mul_ensemble_complex(4,V_m,servo131, position131); verifacation(); positionControl_Mul_ensemble_complex(4,V_h,servo132, position132); verifacation(); wait(0.1); Pompe = 0; wait(0.2); positionControl_Mul_ensemble_complex(4,V_b,servo133, position133); verifacation(); positionControl_Mul_ensemble_complex(4,V_b,servo134, position134); verifacation(); break; /*case 14: uint8_t servo141[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; // uint8_t setLED, uint8_t id uint8_t servo142[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint8_t servo143[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; uint8_t servo144[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint16_t position141[4] = {504, 593, 845, Pos_Engrenage_centre}; uint16_t position142[4] = {609, 525, 816, Pos_Engrenage_centre}; uint16_t position143[4] = {420, 661, 845, Pos_Engrenage_centre}; uint16_t position144[4] = {418, 885, 789, Pos_Engrenage_centre}; positionControl_Mul_ensemble_complex(4,V_m,servo141, position141); verifacation(); positionControl_Mul_ensemble_complex(4,V_h,servo142, position142); wait(0.5); Pompe = 0; wait(0.5); verifacation(); positionControl_Mul_ensemble_complex(4,V_b,servo143, position143); verifacation(); positionControl_Mul_ensemble_complex(4,V_b,servo144, position144); verifacation(); break; case 15: uint8_t servo151[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; // uint8_t setLED, uint8_t id uint8_t servo152[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; //uint8_t servo153[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; uint8_t servo154[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint8_t servo155[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint16_t position151[4] = {439, 688, 723, Pos_Engrenage_centre}; uint16_t position152[4] = {406, 691, 789, Pos_Engrenage_centre}; //uint16_t position153[4] = {399, 667, 767, Pos_Engrenage_centre}; uint16_t position154[4] = {552, 539, 801, Pos_Engrenage_centre}; uint16_t position155[4] = {418, 885, 789, Pos_Engrenage_centre}; //positionControl_Mul_ensemble_complex(4,V_m,servo151, position151); //verifacation(); positionControl_Mul_ensemble_complex(4,V_h,servo152, position152); verifacation(); //positionControl_Mul_ensemble_complex(4,V_b,servo153, position153); //verifacation(); positionControl_Mul_ensemble_complex(4,V_b,servo154, position154); verifacation(); wait(0.5); Pompe = 0; wait(0.5); positionControl_Mul_ensemble_complex(4,V_b,servo155, position155); verifacation(); break;*/ case 22: uint8_t servo221[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; // uint8_t setLED, uint8_t id uint8_t servo222[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint8_t servo223[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; uint8_t servo224[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint16_t position221[4] = {452, 801, 849, Pos_Engrenage_Vers_Gauche}; uint16_t position222[4] = {535, 768, 805, Pos_Engrenage_Vers_Gauche}; uint16_t position223[4] = {553, 819, 733, Pos_Engrenage_Vers_Gauche}; uint16_t position224[4] = {395, 864, 832, Pos_Engrenage_Vers_Gauche}; positionControl_Mul_ensemble_complex(4,V_m,servo221, position221); verifacation(); positionControl_Mul_ensemble_complex(4,V_h,servo222, position222); verifacation(); positionControl_Mul_ensemble_complex(4,V_b,servo223, position223); verifacation(); wait(0.1); Pompe = 0; wait(0.2); positionControl_Mul_ensemble_complex(4,V_b,servo224, position224); verifacation(); break; case 23: uint8_t servo231[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; // uint8_t setLED, uint8_t id uint8_t servo232[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint8_t servo233[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; uint8_t servo234[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint16_t position231[4] = {395, 885, 829, Pos_Engrenage_Vers_Gauche}; uint16_t position232[4] = {540, 733, 816, Pos_Engrenage_Vers_Gauche}; uint16_t position233[4] = {384, 772, 829, Pos_Engrenage_Vers_Gauche}; uint16_t position234[4] = {384, 887, 829, Pos_Engrenage_Vers_Gauche}; positionControl_Mul_ensemble_complex(4,V_m,servo231, position231); verifacation(); positionControl_Mul_ensemble_complex(4,V_h,servo232, position232); verifacation(); wait(0.1); Pompe = 0; wait(0.2); positionControl_Mul_ensemble_complex(4,V_b,servo233, position233); verifacation(); positionControl_Mul_ensemble_complex(4,V_b,servo234, position234); verifacation(); break; case 32: uint8_t servo321[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; // uint8_t setLED, uint8_t id uint8_t servo322[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint8_t servo323[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; uint8_t servo324[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint16_t position321[4] = {452, 801, 849, Pos_Engrenage_centre}; uint16_t position322[4] = {535, 768, 805, Pos_Engrenage_centre}; uint16_t position323[4] = {577, 819, 699, Pos_Engrenage_centre}; uint16_t position324[4] = {395, 864, 832, Pos_Engrenage_centre}; positionControl_Mul_ensemble_complex(4,V_m,servo321, position321); verifacation(); positionControl_Mul_ensemble_complex(4,V_h,servo322, position322); verifacation(); positionControl_Mul_ensemble_complex(4,V_b,servo323, position323); verifacation(); wait(0.1); Pompe = 0; wait(0.2); positionControl_Mul_ensemble_complex(4,V_b,servo324, position324); verifacation(); break; case 33: uint8_t servo331[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; // uint8_t setLED, uint8_t id uint8_t servo332[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint8_t servo333[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; uint8_t servo334[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint16_t position331[4] = {395, 885, 829, Pos_Engrenage_centre}; uint16_t position332[4] = {540, 733, 816, Pos_Engrenage_centre}; uint16_t position333[4] = {384, 772, 829, Pos_Engrenage_centre}; uint16_t position334[4] = {384, 887, 829, Pos_Engrenage_centre}; positionControl_Mul_ensemble_complex(4,V_m,servo331, position331); verifacation(); positionControl_Mul_ensemble_complex(4,V_h,servo332, position332); verifacation(); wait(0.1); Pompe = 0; wait(0.2); positionControl_Mul_ensemble_complex(4,V_b,servo333, position333); verifacation(); positionControl_Mul_ensemble_complex(4,V_b,servo334, position334); verifacation(); break; case 42: uint8_t servo421[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; // uint8_t setLED, uint8_t id uint8_t servo422[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint8_t servo423[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; uint8_t servo424[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint16_t position421[4] = {452, 801, 849, Pos_Engrenage_Vers_Droit}; uint16_t position422[4] = {535, 768, 805, Pos_Engrenage_Vers_Droit}; uint16_t position423[4] = {573, 818, 725, Pos_Engrenage_Vers_Droit}; uint16_t position424[4] = {395, 864, 832, Pos_Engrenage_Vers_Droit}; positionControl_Mul_ensemble_complex(4,V_m,servo421, position421); verifacation(); positionControl_Mul_ensemble_complex(4,V_h,servo422, position422); verifacation(); positionControl_Mul_ensemble_complex(4,V_b,servo423, position423); verifacation(); wait(0.1); Pompe = 0; wait(0.2); positionControl_Mul_ensemble_complex(4,V_b,servo424, position424); verifacation(); break; case 43: uint8_t servo431[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; // uint8_t setLED, uint8_t id uint8_t servo432[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint8_t servo433[8] = {GLED_ON, ID, BLED_ON, ID2, GLED_ON, ID3, GLED_ON, ID4}; uint8_t servo434[8] = {BLED_ON, ID, GLED_ON, ID2, BLED_ON, ID3, GLED_ON, ID4}; uint16_t position431[4] = {395, 885, 829, Pos_Engrenage_Vers_Droit}; uint16_t position432[4] = {540, 733, 816, Pos_Engrenage_Vers_Droit}; uint16_t position433[4] = {384, 772, 829, Pos_Engrenage_Vers_Droit}; uint16_t position434[4] = {384, 887, 829, Pos_Engrenage_Vers_Droit}; positionControl_Mul_ensemble_complex(4,V_m,servo431, position431); verifacation(); positionControl_Mul_ensemble_complex(4,V_h,servo432, position432); verifacation(); wait(0.1); Pompe = 0; wait(0.2); positionControl_Mul_ensemble_complex(4,V_b,servo433, position433); verifacation(); positionControl_Mul_ensemble_complex(4,V_b,servo434, position434); verifacation(); break; } } void GetPos_Engrenage(int8_t ID) { Pos_Engrenage_centre = getPos(ID); Pos_Engrenage_gauche = Pos_Engrenage_centre + 256; Pos_Engrenage_droit = Pos_Engrenage_centre - 243; Pos_Engrenage_Vers_Gauche = Pos_Engrenage_centre + 256; Pos_Engrenage_Vers_Droit = Pos_Engrenage_centre - 289; pc.printf("Posi_central=%d Posi_gauche=%d Posi_droit=%d\n",Pos_Engrenage_centre,Pos_Engrenage_gauche,Pos_Engrenage_droit); } void Pompe_init(PinName Pompe_pin) { PwmOut Pompe1(Pompe_pin); Pompe1.period(1); Pompe1 = 0; wait(0.1); } void Pompe_essai(PinName Pompe_pin){ PwmOut Pompe1(Pompe_pin); Pompe1 = 1; wait(1); Pompe1 = 0; wait(1); } void Arreter_couple(int8_t ID){ setTorque(ID,TORQUE_FREE); } void cubes_systeme(unsigned char Cb1,unsigned char Cb2,unsigned char Cb3, int8_t ID, int8_t ID2, int8_t ID3, int8_t ID4,PinName Pompe_pin){ //-----------------traitement des infos recues par CAN--------------------------------------- /*unsigned char C1 = combinaison_CAN/100; unsigned char C2 = (combinaison_CAN%100)/10; unsigned char C3 = combinaison_CAN%10; pc.printf("%d %d %d",C1,C2,C3);*/ unsigned short combinaison_CAN = Cb1*100+Cb2*10+Cb3; //------------------------------------------------------------------------------------------- if((combinaison_CAN == 123) || (combinaison_CAN == 321)) { //--- deplacement_cubes(5, 42,ID,ID2,ID3,ID4,Pompe_pin); deplacement_cubes(2, 43,ID,ID2,ID3,ID4,Pompe_pin); deplacement_cubes(3, 12,ID,ID2,ID3,ID4,Pompe_pin); } else if((combinaison_CAN == 154) || (combinaison_CAN == 451)) { //---- deplacement_cubes(1, 42,ID,ID2,ID3,ID4,Pompe_pin); deplacement_cubes(3, 43,ID,ID2,ID3,ID4,Pompe_pin); deplacement_cubes(5, 22,ID,ID2,ID3,ID4,Pompe_pin); } else if((combinaison_CAN == 241) || (combinaison_CAN == 142)) { //---- deplacement_cubes(3, 42,ID,ID2,ID3,ID4,Pompe_pin); deplacement_cubes(5, 43,ID,ID2,ID3,ID4,Pompe_pin); deplacement_cubes(2, 12,ID,ID2,ID3,ID4,Pompe_pin); } else if((combinaison_CAN == 253) || (combinaison_CAN == 352)) { //---- deplacement_cubes(1, 22,ID,ID2,ID3,ID4,Pompe_pin); deplacement_cubes(3, 42,ID,ID2,ID3,ID4,Pompe_pin); deplacement_cubes(5, 23,ID,ID2,ID3,ID4,Pompe_pin); } else if((combinaison_CAN == 345) || (combinaison_CAN == 543)) { //---- deplacement_cubes(3, 22,ID,ID2,ID3,ID4,Pompe_pin); deplacement_cubes(1, 23,ID,ID2,ID3,ID4,Pompe_pin); deplacement_cubes(5, 42,ID,ID2,ID3,ID4,Pompe_pin); } else if((combinaison_CAN == 314) || (combinaison_CAN == 413)) { //---- deplacement_cubes(4, 22,ID,ID2,ID3,ID4,Pompe_pin); deplacement_cubes(3, 23,ID,ID2,ID3,ID4,Pompe_pin); deplacement_cubes(5, 12,ID,ID2,ID3,ID4,Pompe_pin); } else if((combinaison_CAN == 425) || (combinaison_CAN == 524)) { //---- deplacement_cubes(5, 12,ID,ID2,ID3,ID4,Pompe_pin); deplacement_cubes(3, 13,ID,ID2,ID3,ID4,Pompe_pin); deplacement_cubes(2, 42,ID,ID2,ID3,ID4,Pompe_pin); } else if((combinaison_CAN == 432) || (combinaison_CAN == 234)) { //---- deplacement_cubes(1, 42,ID,ID2,ID3,ID4,Pompe_pin); deplacement_cubes(2, 32,ID,ID2,ID3,ID4,Pompe_pin); deplacement_cubes(5, 33,ID,ID2,ID3,ID4,Pompe_pin); } else if((combinaison_CAN == 531) || (combinaison_CAN == 135)) { //---- deplacement_cubes(2, 12,ID,ID2,ID3,ID4,Pompe_pin); deplacement_cubes(4, 13,ID,ID2,ID3,ID4,Pompe_pin); deplacement_cubes(5, 32,ID,ID2,ID3,ID4,Pompe_pin); } else if((combinaison_CAN == 512) || (combinaison_CAN == 215)) { //---- deplacement_cubes(4, 12,ID,ID2,ID3,ID4,Pompe_pin); deplacement_cubes(5, 13,ID,ID2,ID3,ID4,Pompe_pin); deplacement_cubes(2, 32,ID,ID2,ID3,ID4,Pompe_pin); } } void monter_immeble(unsigned char nb_bras, unsigned char C1,unsigned char C2,unsigned char C3){ cubes_systeme(C1,C2,C3,ID_1,ID_2,ID_3,ID_4,Pompe_pin1); /*if(nb_bras == 2){ cubes_systeme(C1,C2,C3,ID,ID2,ID3,ID4,Pompe_pin1); //deuximeme bras }*/ } void Systeme_deplacement_cube_init(void){ Bras_Droite_init(); } void Bras_Droite_init(void){ Interrupt4_en(); wait_ms(0.5); clear(ID_1); clear(ID_2); clear(ID_2); clear(ID_4); setTorque(ID_1,TORQUE_ON); setTorque(ID_2,TORQUE_ON); setTorque(ID_3,TORQUE_ON); setTorque(ID_4,TORQUE_ON); wait_ms(0.3); Pompe_init(Pompe_pin1); }