Merci pour ton idée ashira mais je crois que ce n'est pas la bonne piste, j'avais étalonné les servos au préalable.
J'ai finalement résolu le problème concernant mon servo en inclinaison. Il s'agissait en effet, d'un problème d'alimentation. Il avait besoin d'une tension comprise entre 6 et 7,4 V. Du coup, avec l'arduino et les 5V en sortie c'était trop faible pour positionner le servo à une position de départ éloignée de sa position actuelle.
Avec une alimentation 7,4 V ça roule !
Il s'agit d'un QUIMAT DLX-218 180° (tension : 6 à 7,4 V)
Par contre j'ai toujours mon souci avec le servo en rotation.
Il s'agit d'un KOOKYE mini digital 180°
Tension : 3 à 7,2 V
0,17s / 60°
Petite précision, le problème ne se produit qu'après déconnexion / reconnexion de l'USB du PC.
En fin de programme, le servo se repositionne à 90° => Ok
J'utilise les touches de mon clavier pour le faire tourner à gauche ou à droite de 5° ou 10°
Mais au départ, mes commandes sont sans effet, jusqu'à ce que j'arrive à une commande >= 65° => Il se positionne alors dans une position réelle de 180°
Ensuite, chaque commande le fait revenir en arrière de 5°, mais il est complètement décalé entre l'indication de position et la position réelle.
Il faut que je le repositionne une seconde fois à >= 65° pour qu'il se place cette fois en position réelle 0°
A partir de là je peux le positionner directement à 90° à l'aide du touche dédiée, et il se positionne effectivement à 90°
Ensuite son comportement est tout à fait normal, même si j'arrête et que je relance le moniteur.
La galère revient quand je débranche puis rebranche le cable USB.
Le code :
#include <Servo.h>
// Les servomoteurs de la tête ////////////////////////
int tete_inclinaison;
int tete_rotation;
const int CENTRE = 90;
const int DECAL = 5;
Servo servo_tete_inclinaison;
Servo servo_tete_rotation;
char commande;
///////////////////////////////////////////////////////
void setup()
{
// Servomoteurs ////////////////////////////////////
servo_tete_inclinaison.attach(9,600,2400);
servo_tete_rotation.attach(10,600,2400);
//on commence par positionner les servos au centre
servo_tete_inclinaison.write(CENTRE);
servo_tete_rotation.write(CENTRE);
Serial.begin(9600);
Serial.println("Go");
tete_inclinaison = servo_tete_inclinaison.read();
tete_rotation = servo_tete_rotation.read();
Serial.print("Position départ inclinaison : " );
Serial.println(tete_inclinaison, DEC);
Serial.print("Position départ rotation : " );
Serial.println(tete_rotation, DEC);
////////////////////////////////////////////////
}
void loop()
{
//réception d'une commande moteur sur la liaison série ?
if(Serial.available())
{
commande = '0';
commande = Serial.read(); //on lit
//on modifie la consigne si c'est un caractère qui nous intéresse
if(commande == '5')
{
tete_inclinaison = CENTRE;
tete_rotation = CENTRE;
}
else if(commande == '2')
{
tete_inclinaison += DECAL; //ajout de 10° au servo 1
}
else if(commande == '8')
{
tete_inclinaison -= DECAL; //retrait de 10° au servo 1
}
else if(commande == '6')
{
tete_rotation += DECAL;
}
else if(commande == '4')
{
tete_rotation -= DECAL;
}
else if(commande == '3')
{
tete_inclinaison += DECAL;
tete_rotation += DECAL;
}
else if(commande == '1')
{
tete_inclinaison += DECAL;
tete_rotation -= DECAL;
}
else if(commande == '9')
{
tete_inclinaison -= DECAL;
tete_rotation += DECAL;
}
else if(commande == '7')
{
tete_inclinaison -= DECAL;
tete_rotation -= DECAL;
}
else commande = '0';
if (commande != '0')
{
//si une commande a été précisée on modifie le ou les angles
servo_tete_inclinaison.write(tete_inclinaison);
servo_tete_rotation.write(tete_rotation);
//et on fait un retour sur la console pour savoir où on est rendu
Serial.print("Inclinaison : " );
Serial.println(tete_inclinaison, DEC);
Serial.print("Rotation : " );
Serial.println(tete_rotation, DEC);
}
}
}
Si quelqu'un a une idée ...