Bonjour a tous
Aller un petit coup D arduino , suite à l’idée génial de @Heisenberg
d utiliser le son du haut parleur et de synchroniser la bouche du robot , Un problème persiste faire fonctionner deux servos moteur en même temps (problème d interruption dans l arduino) .
J ai fouillé sur internet et j ai trouvé cette bibliothèque arduino (VarSpeedServo) . l’avantage plus besoin de delay() ni de boucles for() pour faire avancer les servos .
ci dessous le programme de @Heisenberg
J’ai modifié le code pour l’adapter à la bibliothèque , résultat code plus simple et exécution plus rapide des servos
lien pour télécharger la bibliothèque avec exemples : https://github.com/netlabtoolkit/VarSpeedServo
#include <VarSpeedServo.h>
int ServoPin = 11;
int HPpin = 5;
int vitesse = 15;
VarSpeedServo bouche; // objet servo bouche
VarSpeedServo tete; // mouvement tete
VarSpeedServo yeuxl; // yeux horizons
VarSpeedServo coup; // coup du robot
int SecondDetection = 1; //
int val = 0; // variable pour bouche
int i = 0; // variable pour test bouche
int BoucheStatus = 0;
int ActionBouche = 0;
const int L2 = 2; //broche 2 du micro-contrôleur leds yeux du robot
int flag = 0;
void setup()
{
analogReference(EXTERNAL);
pinMode(ServoPin, OUTPUT);
Serial.begin(9600);
Serial.println(“— Start DEBUG —“);
bouche.attach(11); // attaches the servo on pin 9 to the servo object
bouche.write(45);
pinMode(L2, OUTPUT); //L2 est une broche de sortie yeux
yeuxl.attach(5);
}
void loop()
{
tete.write(90,vitesse); // tete centre
yeuxl.write(50,vitesse);// centre les yeux
val = analogRead(HPpin);
// allume les led en parlant ou paupieres si installées
if (val > 700){digitalWrite(L2,LOW);
}else{ digitalWrite(L2,HIGH);
// Serial.println(val);
// Serial.println(flag);
}
switch (flag) // action toutes les 15 et 30 paroles
{
case 15:
action();
break;
case 30 :
action2();
break;
default:
Mvbouche();
}
if (flag > 31){flag = 0;}
} // fin loop
void action(){
tete.attach(10); // alim servo 10
coup.attach(3);
yeuxl.attach(5);
tetegauche();
tetedroite();
coupbas();
couphaut();
yeuxled();
MvyeuxL();
flag++;
tete.detach(); // coupe alim des servos
coup.detach();
yeuxl.detach();}
void action2(){
yeuxl.attach(5);
MvyeuxL();
yeuxled();
flag++;
yeuxl.detach();}
void Mvbouche()
{
if (val < 665 || val > 680 ) // recherche valeur entre 665 et 680
{
BoucheStatus = 1; // bouche fermée
} else // sinon
{
i++; // la valeur entre 665 et 680 est pas trouvée
// Serial.println(val);
}
if (i>=SecondDetection)
{ i=0;
BoucheStatus = 0;
}
if (BoucheStatus == 0 && ActionBouche == 0)
{
bouche.write(100,250,true);
ActionBouche = 1;
bouche.write(45,250,true);
}
if (BoucheStatus == 1 && ActionBouche == 1)
{
bouche.write(45,250,true);
ActionBouche =0;
flag++; // compteur e boucles
}
}
void yeuxled(){
digitalWrite(L2,HIGH); // met la broche au niveau haut (5V) – allume la LED
delay(4000); // pause de 500 millisecondes (ms)
digitalWrite(L2,LOW); // met la broche au niveau bas (0V) – éteint la LED
delay(500); // pause de 500ms
}
void tetedroite(){
tete.write(90,vitesse,true);
tete.write(40,vitesse,true);
tete.write(90,vitesse,true);
}
void couphaut(){
coup.write(40,vitesse,true);
coup.write(170,vitesse,true);
coup.write(100,vitesse,true);
}
void coupbas(){
coup.write(100,vitesse,true);
coup.write(40,vitesse,true);
coup.write(100,vitesse,true);
}
void tetegauche(){
tete.write(90,vitesse,true);
tete.write(140,vitesse,true);
tete.write(90,vitesse,true);
}
void MvyeuxL(){
yeuxl.write(45,vitesse,true);
yeuxl.write(75,vitesse,true);
yeuxl.write(20,vitesse,true);
yeuxl.write(50,vitesse,true);
}