Bonjour,
Après avoir cherché dans le forum sans trouver de sujet correspondant, je fais donc appel à vos compétences pour m'aider.
Je souhaite faire un pont tournant pour mon petit réseau ferroviaire et, après avoir testé diverses solutions (moteur pas à pas, servo 360, micro servomoteur sg90) ,je me suis arrêté sur un servomoteur un peu plus puissant, le " AZDelivery 5 x MG995".
J'ai 4 boutons pour choisir la position et le sens de la rotation (le sens dépend de la position actuelle par rapport à celle demandée). Je fixe les différentes positions par constantes et mon souci est que le moteur ne s'arrête pas exactement au même endroit selon qu'il tourne dans un sens ou dans l'autre. Exemple, en passant de la position 1 à la 2, je note précisément, en passant de 2 à 3, je note également, mais en revenant de 3 vers 2 il y a un petit décalage (1 ou 2 degrés). Comme il est essentiel que la voie sur le pont tombe parfaitement en face des voies fixes extérieures, ce décalage n'est pas acceptable.
Voici mon code :
/*
Utilisation servo-moteur
piloté par bouton 1 2 3 4 pour le choix de la rotation
conservation de la position du moteur en EPROM
4 positions
1 2 et 3 = 3 voies de sortie
4 = voies d'entree et de sortie si retournement
Les positions sont contenues dans les variables val1, val2, val3, val4
Valx = pos_prec retenue pour la positiion de départ des boucles de rotation la plus petite
entre la position theorique et la position réelle
*/
#include <EEPROM.h>
#include <Servo.h>
Servo myservo; // create servo object to control a servo
const int bout1 = 8; // position interrupteur fin course 1
const int bout2 = 4; // position interrupteur fin course 2
const int bout3 = 7; // position interrupteur fin course 3
const int bout4 = 11; // position interrupteur fin course 14
const int val4 = 90; // Position du moteur sortie 1
const int val3 = 102; // Position du moteur sortie 2
const int val2 = 120; // Position du moteur sortie 3
const int val1 = 135; // Position du moteur sortie 4 retournement
int val = 0; // conserve la pos_prec du bouton saisie pour les traitements
int valx = 0; // pos_prec retenue pour la positiion de départ des boucles de rotation
int vitesse = 1; // détermine la vitesse de rotation du pont
int etat = 0; // variable pour les boucles de rotation
int i = 0; // variable pour la boucle de déplacement du bras
int caractere = 0; // pos_prec du bouton actionne
int pos_prec; // pos_prec recupérée de l'EEPROM, derniere position connue
int pos_read; // pos_read valeur renvoyee par servo_read
int adresse = 14; // adresse de stockage dans EEPROM
void setup() {
Serial.begin(9600);
// attachInterrupt(digitalPinToInterrupt(SENSOR_PIN_2), blink, CHANGE); // attache l’interruption externe n°0 à la fonction blink
// pinMode(SENSOR_PIN_2, INPUT);
pinMode(bout1, INPUT_PULLUP);
pinMode(bout2, INPUT_PULLUP);
pinMode(bout3, INPUT_PULLUP);
pinMode(bout4, INPUT_PULLUP);
pos_prec = EEPROM.read(adresse); // Retourne la pos_prec contenue dans l'eeprom, à l’adresse "14"
myservo.write(pos_prec); // le moteur a la derniere position memorisee
myservo.attach(3); // attache l'objet servo à la pin 3 Rotation
}
void loop() {
caractere = 0;
Serial.print(" caractere0 = ");
Serial.println(caractere);
Serial.print(" bout1 = ");
Serial.println(digitalRead(bout1));
Serial.print(" bout2 = ");
Serial.println(digitalRead(bout2));
Serial.print(" bout3 = ");
Serial.println(digitalRead(bout3));
Serial.print(" bout4 = ");
Serial.println(digitalRead(bout4));
/**** récupération de la pos_prec du bouton saisie et affectation des variables associées */
if (digitalRead(bout1) == 1)
{
caractere = 1;
val = val1;
}
else if (digitalRead(bout2) == 1)
{
val = val2;
caractere = 2;
}
else if (digitalRead(bout3) == 1)
{
caractere = 3;
val = val3;
}
else if (digitalRead(bout4) == 1)
{
caractere = 4;
val = val4;
}
/*********************************************/
// si un bouton a ete actionne ***************
if (caractere != 0)
{
Serial.print(" caractere = ");
Serial.println(caractere);
Serial.println(" ");
pos_prec = EEPROM.read(adresse); // lecture derniere position connu
pos_read = myservo.read(); // lecture position du moteur
if (pos_read <= pos_prec) {
valx = pos_read; // renseigne le debut de la boucle de rotation
}
else {
valx = pos_prec; // renseigne le debut de la boucle de rotation
}
if (pos_read <= val) { // definit le sens de rotation
for (etat = valx; etat <= val; etat += vitesse) {
Serial.print(" caractere = ");
Serial.print(caractere);
Serial.print(" pos_prec = ");
Serial.print(pos_prec);
Serial.print(" pos_read = ");
Serial.print(pos_read);
Serial.print(" val = ");
Serial.print(val);
Serial.print(" valx = ");
Serial.print(valx);
if (etat > val) {
myservo.write(etat);
EEPROM.write(adresse, etat);
Serial.print(" etatA = ");
Serial.println(etat);
break;
}
else {
myservo.write(etat);
EEPROM.write(adresse, etat);
Serial.print(" etatB = ");
Serial.println(etat);
delay(30);
}
}
}
else {
for (etat = valx; etat >= val; etat -= vitesse) {
Serial.print(" caractere = ");
Serial.print(caractere);
Serial.print(" pos_prec = ");
Serial.print(pos_prec);
Serial.print(" pos_read = ");
Serial.print(pos_read);
Serial.print(" val = ");
Serial.print(val);
Serial.print(" valx = ");
Serial.print(valx);
if (etat > val) {
myservo.write(etat);
EEPROM.write(adresse, etat);
Serial.print(" etatC = ");
Serial.println(etat);
}
else {
myservo.write(etat);
EEPROM.write(adresse, etat);
Serial.print(" etatD = ");
Serial.println(etat);
delay(30);
}
}
}
}
}
Merci pour votre aide.