Translateur et Ascenseur : encapsulation et relecture des butées du translateur

This commit is contained in:
Samuel 2025-05-24 12:42:58 +02:00
parent df7a90d5a5
commit ef108cf44d
3 changed files with 134 additions and 30 deletions

View File

@ -13,9 +13,6 @@
#define DOIGT_PINCE_GAUCHE_OUVRE 2367 #define DOIGT_PINCE_GAUCHE_OUVRE 2367
#define DOIGT_PINCE_GAUCHE_PARKING 1550 #define DOIGT_PINCE_GAUCHE_PARKING 1550
#define ID_FEETECH_ASC_G 11
#define ID_FEETECH_ASC_D 10
SMS_STS sms_sts; SMS_STS sms_sts;
int ID_Feetech = 4; int ID_Feetech = 4;
@ -31,6 +28,12 @@ enum etat_action_t{
ACTION_ECHEC ACTION_ECHEC
}; };
enum translateur_action_t{
TRANSLATEUR_INIT,
TRANSLATEUR_AVANCE,
TRANSLATEUR_RECULE,
}translateur_action = TRANSLATEUR_INIT;
/// @brief pilote la vitesse des moteurs /// @brief pilote la vitesse des moteurs
/// @param vitesse vitesse signée, sera saturée à 255 /// @param vitesse vitesse signée, sera saturée à 255
@ -52,19 +55,22 @@ void Moteur_set(int vitesse){
} }
void Translateur_avance(){ void Translateur_avance(){
Moteur_set(128); Moteur_set(-255);
translateur_action = TRANSLATEUR_AVANCE;
} }
void Translateur_recule(){ void Translateur_recule(){
Moteur_set(-128); Moteur_set(255);
translateur_action = TRANSLATEUR_RECULE;
} }
void setup() void setup()
{ {
int liste_servo_id[4]= {3, 4, 10, 11};
Serial.begin(115200);//sms舵机波特率115200 Serial.begin(115200);//sms舵机波特率115200
Serial1.begin(1000000,SERIAL_8N1, RX, TX);//sts舵机波特率1000000 Serial1.begin(1000000,SERIAL_8N1, RX, TX);//sts舵机波特率1000000
sms_sts.pSerial = &Serial1; sms_sts.pSerial = &Serial1;
delay(1000); delay(5000);
cible_haute.nb_tour = 0; cible_haute.nb_tour = 0;
cible_haute.position = 500; cible_haute.position = 500;
@ -93,6 +99,18 @@ void setup()
delay(5000); delay(5000);
}*/ }*/
int error = 0;
do{
error = 0;
for (int i =0; i<4; i++){
int ID = sms_sts.Ping(liste_servo_id[i]);
printf("Servo %d: %d\n", liste_servo_id[i], ID );
if( ID != liste_servo_id[i]){
error = 1;
delay(100);
}
}
}while(error);
// Servo pinces à aimant // Servo pinces à aimant
@ -102,11 +120,8 @@ void setup()
ledcAttach(9, 50, 12); ledcAttach(9, 50, 12);
ledcWrite(9, 307); ledcWrite(9, 307);
// Moteur Translateur_init();
ledcAttach(3, 500, 8);
ledcWrite(3, 0);
ledcAttach(4, 500, 8);
ledcWrite(4, 0);
/*while(1){ /*while(1){
@ -129,6 +144,15 @@ void setup()
delay(5000); delay(5000);
}*/ }*/
/*
sms_sts.WheelMode(10);
sms_sts.WriteSpe(10, 2000, 50);
while(1){
printf(">load_d:%d\n", sms_sts.ReadLoad(10));
delay(25);
}*/
if(sms_sts.FeedBack(ID_Feetech)!=-1){ if(sms_sts.FeedBack(ID_Feetech)!=-1){
@ -145,6 +169,45 @@ void setup()
} }
void Translateur_init(void){
// Moteur
ledcAttach(3, 500, 8);
ledcWrite(3, 0);
ledcAttach(4, 500, 8);
ledcWrite(4, 0);
// Etat des contacteurs de fin de course
// relecture de 3 sur 2 (Avant)
// relecture de 4 sur 10 (Arrière)
pinMode(2, INPUT);
pinMode(10, INPUT);
}
enum etat_action_t Translateur_etat(void){
if(translateur_action == TRANSLATEUR_AVANCE){
if(digitalRead(2) == 0){
return ACTION_TERMINEE;
}
}
if(translateur_action == TRANSLATEUR_RECULE){
if(digitalRead(10) == 0){
return ACTION_TERMINEE;
}
}
return ACTION_EN_COURS;
}
void Translateur_cycle(void){
if(Translateur_etat() == ACTION_TERMINEE){
if(translateur_action == TRANSLATEUR_RECULE){
Translateur_avance();
}else{
Translateur_recule();
}
}
}
void loop() void loop()
{ {
static int m_pos=0; static int m_pos=0;
@ -152,22 +215,14 @@ void loop()
static position_t cible; static position_t cible;
if(millis() > myTime + 100){
myTime = millis();
Serial.print(">millis:"); Serial.print(">millis:");
Serial.println(millis()); Serial.println(millis());
if(millis() > myTime + 4000){
myTime = millis();
} }
int ID = sms_sts.Ping(ID_Feetech);
if(ID!=-1){
Serial.print("Servo ID:");
Serial.println(ID, DEC);
delay(100);
}else{
Serial.println("Ping servo ID error!");
delay(2000);
}
int Pos; int Pos;
int Speed; int Speed;
@ -194,13 +249,34 @@ void loop()
if(inByte == 'l'){ if(inByte == 'l'){
Ascenseur_descend(); Ascenseur_descend();
} }
if(inByte == 'a'){
Translateur_avance();
}
if(inByte == 'z'){
Translateur_recule();
}
if(inByte == 'c'){
while(Serial.available() > 0){
inByte = Serial.read();
}
while(1){
Translateur_cycle();
if(Serial.available() > 0){
break;
}
printf(">GPIO2:%d\n",digitalRead(2));
printf(">GPIO10:%d\n",digitalRead(10));
}
}
while(Serial.available() > 0){ while(Serial.available() > 0){
inByte = Serial.read(); inByte = Serial.read();
} }
} }
Ascenseur_gestion(); Ascenseur_gestion();
/*
if(sms_sts.FeedBack(ID)!=-1){ if(sms_sts.FeedBack(ID)!=-1){
Pos = sms_sts.ReadPos(-1); Pos = sms_sts.ReadPos(-1);
Speed = sms_sts.ReadSpeed(-1); Speed = sms_sts.ReadSpeed(-1);
@ -227,6 +303,6 @@ void loop()
}else{ }else{
Serial.println("FeedBack err"); Serial.println("FeedBack err");
delay(500); delay(500);
} }*/
} }

6
Actionneurs/Ascenseur.h Normal file
View File

@ -0,0 +1,6 @@
void Ascenseur_init(void);
int Ascenseur_monte(void);
int Ascenseur_descend(void);
void Ascenseur_step_up(void);
void Ascenseur_step_down(void);
void Ascenseur_gestion(void);

View File

@ -52,6 +52,9 @@ void Ascenseur_config_servo(int id){
enum etat_action_t Ascenseur_cherche_butees(void){ enum etat_action_t Ascenseur_cherche_butees(void){
static bool butee_g = 0, butee_d = 0; static bool butee_g = 0, butee_d = 0;
static int old_pos_d, old_pos_g;
int pos_d, pos_g, my_load;
static enum { static enum {
CHERCHE_BUTEE_INIT, CHERCHE_BUTEE_INIT,
CHERCHE_BUTEE, CHERCHE_BUTEE,
@ -66,33 +69,49 @@ enum etat_action_t Ascenseur_cherche_butees(void){
tab_vitesses[1] = 500 * ASC_G_SIGNE; tab_vitesses[1] = 500 * ASC_G_SIGNE;
sms_sts.WheelMode(ID_FEETECH_ASC_D); sms_sts.WheelMode(ID_FEETECH_ASC_D);
sms_sts.WheelMode(ID_FEETECH_ASC_G); sms_sts.WheelMode(ID_FEETECH_ASC_G);
old_pos_d = sms_sts.ReadPos(ID_FEETECH_ASC_D);
old_pos_g = sms_sts.ReadPos(ID_FEETECH_ASC_G);
sms_sts.SyncWriteSpe(asc_ID, 2, tab_vitesses, tab_acc); sms_sts.SyncWriteSpe(asc_ID, 2, tab_vitesses, tab_acc);
delay(200); delay(200);
etat_cherche_butees = CHERCHE_BUTEE; etat_cherche_butees = CHERCHE_BUTEE;
Serial.printf("CHERCHE_BUTEE_INIT\n");
break; break;
case CHERCHE_BUTEE: case CHERCHE_BUTEE:
{ {
int my_load = sms_sts.ReadLoad(ID_FEETECH_ASC_D);
if(abs(my_load) > 150 ){ /*pos_d = sms_sts.ReadPos(ID_FEETECH_ASC_D);
printf(">delta_pos_d:%d\n",pos_d - old_pos_d);
if(abs(pos_d - old_pos_d) < 10 ){*/
my_load = sms_sts.ReadLoad(ID_FEETECH_ASC_D);
printf(">load_d:%d\n", my_load);
if(abs(my_load) > 250 ){
sms_sts.EnableTorque(ID_FEETECH_ASC_D, 0); sms_sts.EnableTorque(ID_FEETECH_ASC_D, 0);
position_basse_droit = sms_sts.ReadPos(ID_FEETECH_ASC_D); position_basse_droit = sms_sts.ReadPos(ID_FEETECH_ASC_D);
Serial.printf("position_basse_droit:%d\n", position_basse_droit); Serial.printf("position_basse_droit:%d\n", position_basse_droit);
butee_d = true; butee_d = true;
} }
//old_pos_d = pos_d;
/*
pos_g = sms_sts.ReadPos(ID_FEETECH_ASC_G);
printf(">delta_pos_g:%d\n",pos_g - old_pos_g);*/
my_load = sms_sts.ReadLoad(ID_FEETECH_ASC_G); my_load = sms_sts.ReadLoad(ID_FEETECH_ASC_G);
if(abs(my_load) > 150 ){ printf(">load_g:%d\n", my_load);
if(abs(my_load) > 250 ){
sms_sts.EnableTorque(ID_FEETECH_ASC_G, 0); sms_sts.EnableTorque(ID_FEETECH_ASC_G, 0);
position_basse_gauche = sms_sts.ReadPos(ID_FEETECH_ASC_G); position_basse_gauche = sms_sts.ReadPos(ID_FEETECH_ASC_G);
Serial.printf("position_basse_gauche:%d\n", position_basse_gauche); Serial.printf("position_basse_gauche:%d\n", position_basse_gauche);
butee_g = true; butee_g = true;
} }
//old_pos_g = pos_g;
if(butee_d && butee_g){ if(butee_d && butee_g){
etat_cherche_butees = EA_POS_INIT; etat_cherche_butees = EA_POS_INIT;
} }
Serial.printf("CHERCHE_BUTEE\n");
delay(100);
break;} break;}
case EA_POS_INIT: case EA_POS_INIT:
@ -106,6 +125,7 @@ enum etat_action_t Ascenseur_cherche_butees(void){
tab_vitesses_u[1] = 2000; tab_vitesses_u[1] = 2000;
sms_sts.SyncWritePosEx(asc_ID, 2, tab_position, tab_vitesses_u, tab_acc); sms_sts.SyncWritePosEx(asc_ID, 2, tab_position, tab_vitesses_u, tab_acc);
etat_cherche_butees = CHERCHE_BUTEE_INIT; etat_cherche_butees = CHERCHE_BUTEE_INIT;
Serial.printf("EA_POS_INIT\n");
return ACTION_TERMINEE; return ACTION_TERMINEE;
break; break;
} }
@ -177,10 +197,12 @@ void Ascenseur_gestion(void){
case ASCENSEUR_INIT: case ASCENSEUR_INIT:
// On vérifie que les deux servomoteurs répondent // On vérifie que les deux servomoteurs répondent
do{ do{
erreur = 0;
int ID = sms_sts.Ping(asc_ID[0]); int ID = sms_sts.Ping(asc_ID[0]);
erreur = sms_sts.getLastError(); erreur = sms_sts.getLastError();
ID = sms_sts.Ping(asc_ID[1]); ID = sms_sts.Ping(asc_ID[1]);
erreur += sms_sts.getLastError(); erreur += sms_sts.getLastError();
Serial.printf("ASCENSEUR_INIT erreur:%d\n",erreur);
}while(erreur != 0); }while(erreur != 0);
etat_ascenseur = ASCENSEUR_ACTIF; etat_ascenseur = ASCENSEUR_ACTIF;
break; break;