Petit rappel : si nous comparons le courant électrique à un fleuve :
La Tension en volt -> c'est la largeur d'un fleuve.
l'Intensité en ampère -> c'est la vitesse du passage de l'eau
Pourquoi sommes nous limités à utiliser simultanément que 2à3 servos standards ou 6à8 mini servos sur nos cartes arduino reliées par usb à un pc, tout simplement à cause de l' intensité (vitesse de passage) du courant délivrée par la broche 5V de nos cartes arduino, soit 500mA.
Si divers capteurs ainsi que les servos pompent trop d' intensité, la carte ne dispose plus assez d' intensité pour fonctionner, et plante.
Comment l' astuce fonctionne :
les cartes arduino sont livrées avec la library Servo
qui permet d' utiliser très simplement des servomoteurs de modélisme. Un exemple d' utilisation:
met le servo sous tension
réalise un mouvement (par exemple place le palonnier à 180 °)
attend un peu (le temps de faire le mouvement)
débranche le servo .
Si vous voulez ralentir la vitesse des servo il faut réaliser des petites pauses entre chaque mouvements du servo par exemple :
initialisation
met le servo sous tension
place le palonnier à 0 °
attend un peu (le temps de faire le mouvement)
programme principal (à exécuter en boucle) .
Si la position du palonnier n' est pas à 180° :
rajoute 1 à la position du servo 1.
Fait une petite pause de 0,4 secondes.
Il est également possible d' écrire l' algorithme du programme principal ainsi:
en créant une variable qui enregistre le temps écoulé depuis le début du programme
la variable lngTemps , ainsi le programme n' est pas bloqué en pause à attendre que le mouvement de 1° soit réalisé, il continu d' exécuter le programme principal en boucle.
Programme principal (à exécuter en boucle) .
Si lngTemps + 0,4 secondes < temps
Si la position du palonnier n' est pas à 180° :
rajoute 1 à la position du servo 1.
lngTemps = temps
en ajoutant à notre programme un booléen (un type de variable à 2 valeurs possibles vrai ou faux) , la variable 'bolutilisationduservo1 ' il est possible d' utiliser le temps d' inaction du servomoteur 1 pour bouger un autre servomoteur.
Programme principal (à executer en boucle) .
Si lngTemps + 0,2 secondes < temps
si bolutilisationduservo1 == vrai
debrancher le servo 2
brancher le servo 1
si la position du palonnier du servo 1 n' est pas à 180° :
rajoute 1 à la position du servo 1.
bolutilisationduservo1 = faux
ou
debrancher le servo 1
brancher le servo 2
si la position du palonnier du servo 2 n' est pas à 180° :
rajoute 1 à la position du servo 2.
bolutilisationduservo1 = vrai
lngTemps = temps
Voilà le principe de l'astuce :
un servomoteur est débranché pendant que l'autre effectue un mouvement de 1°.
Les 2 servomoteurs semblent bouger ensemble et le mouvement reste fluide.
Ainsi, l'intensité sollicitée pour assurer le fonctionnement des 2 servomoteurs est divisée par 2.
voici un extrait du programme de Margot, ou 11 servomoteurs semblent bouger ensemble sans que la carte plante.
//*****************************************************************************************
//*********************************** parler **********************************************
//*****************************************************************************************
void proParler()
{
if (lngChronoMicroPauseMachoire + intVitesseMachoire < millis())
{
proMouvement_Machoire();
lngChronoMicroPauseMachoire = millis();
}
if (lngChronoMicroPause_Cou_Yeux + intVitesseCou< millis())
{
if (boolCouActifs == true)
{
Servo_EyeR_Lid1.detach();
Servo_EyeR_Lid2.detach();
Servo_EyeL_Lid1.detach();
Servo_EyeL_Lid2.detach();
Servo_EyeR_GD.detach();
Servo_EyeL_GD.detach();
Servo_EyeR_HB.detach();
Servo_EyeL_HB.detach();
ServoGauche.attach(7);
ServoDroit.attach(8);
Servo_Machoire.attach(25);
proMouvement_cou();
boolCouActifs = false;
}
else
{
ServoGauche.detach();
ServoDroit.detach();
Servo_Machoire.detach();
if(int_Etat_Clignement == 0)
{
Servo_EyeR_Lid1.attach(11);
Servo_EyeR_Lid2.attach(12);
Servo_EyeL_Lid1.attach(23);
Servo_EyeL_Lid2.attach(24);
Servo_EyeR_GD.attach(9);
Servo_EyeL_GD.attach(13);
Servo_EyeR_HB.attach(10);
Servo_EyeL_HB.attach(22);
proMouvement_Yeux();
}
boolCouActifs = true;
}
lngChronoMicroPause_Cou_Yeux = millis();
}
if (lngChronoMicroPausePaupieres + intVitessePaupiere < millis())
{
proClignerYeux();
}
}