mexicain articulé avec urne pour le voyage de noce

Bonjour à tous, cet été je me suis marié, pour cette occasion j'ai réalisé un mannequin représentant un mexicain avec une guitare et son chapeau. nous ferons notre voyage de noce au mexique.
J'ai utilisé une carte arduino nano avec quatre servomoteurs pour pouvoir articulé la main qui actionne la guitare ainsi que le chapeau pour le rendre plus vivant, les deux autres servo pour démarrer un lecteur mp3 avec une enceinte pré-amplifiée au passage d'une lettre dans l'urne.
C'était mon premier projet sous arduino, j'ai eu beaucoup de mal a terminé mon projet mais le jour J, ça a fonctionné.

-j'ai utilisé deux alimentations, une pour la carte arduino en 12V et l'autre en 5V pour les servo.
Au début j'alimentais le tout en 5V mais quand deux servo étaient pilotés, la tension s'écroulait.
Les servo se mettaient à trembler.

-L'autre partie était le code, vu que arduino ne dispose pas de temporisation pour gérer le temps.
J'ai essayé beaucoup de code pour en arriver là, mais je pense que l'on peut l'écrire plus simplement et moins lourd. C'est pourquoi je me tourne vers vous.

je vous transmet le code:

//principe de fonctionnement: nous avons une urne munie d'un fin de course pour détecter le passage d'une lettre.
//Ceux ci provoque le démarrage d'un lecteur mp3 par l'action de servomoteur sur les touches.
//lorsque la musique arrive, un mannequin équipé d'une guitare avec la main articulée par un servo ainsi qu'un chapeau mexicain
//sont mis en mouvement le temps de la musique.

#include <Servo.h>
Servo myservo; //servo séquence de démarrage mp3
Servo myservo1; //servo touche play
Servo myservo2; //servo main articulée
Servo myservo3; //servo chapeau articulé
const int bp = 7; //fin de course urne
const int inter = 8; //inter pour mettre en continu les servos main et chapeau
int etat_inter = 0; //variable etat de l'inter
int pos = 0; //définir une position de référence par défaut servo séquence de démarrage mp3
int pos1 = 0; //définir une position de référence par défaut servo touche play
int pos2 = 0; //définir une position de référence par défaut servo main articulée et chapeau articulé
int image_bp = 0; //variable etat de bp
int last_image_bp = 0; // variable etat bp en sortie de boucle
int bp_compteur; // ne sert pas
unsigned long lastMillis = 0; //variable pour utilisée le temps
unsigned long last_to_Millis = 0; //variable pour utilisée le temps en sortie de boucle
void setup()
{
pinMode(bp, INPUT); // entrée fin de course urne
pinMode(inter, INPUT); //entrée inter
myservo.attach(9); //servo séquence de démarrage mp3 sur pin 9
myservo1.attach(10); //servo touche play sur pin 10
myservo2.attach(11); //servo main articulée sur pin 11
myservo3.attach(12); //servo chapeau sur pin 12
pos=0; //pour éviter un bug initialise la position à 0 utilisé pour le servo séquence de démarrage
pos1=0; //utilisé pour le servo play
pos2=0; //utilisé pour le servo main et chapeau
// Serial.begin(9600); // ne sert pas utilisé pour essai
}

void loop() {
// Serial.print("lastMillis: "); ne sert pas utilisé pour essai
// Serial.println(lastMillis, DEC); ne sert pas utilisé pour essai
// Serial.println(last_to_Millis, DEC); ne sert pas utilisé pour essai

image_bp = digitalRead(bp); //passage d'une lettre dans l'urne
delay(150); //pause de 150ms

// bp_compteur++; ne sert pas utilisé pour essai

//regarde si une différence est en cours entre les deux variables
if (image_bp != last_image_bp){
//si le bp est à l'état haut et que c'est la première mise sous tension ou 4 heures et 3min se sont écoulées (4heures extinction mp3 + 3min mise en veille)
if (image_bp == HIGH && (lastMillis == 0 || (millis()- lastMillis > 14580000)))
{ //digitalWrite(ledPin2, HIGH); ne sert pas utilisé pour essai
for(pos1 = 0; pos1 < 170; pos1 += 1) // on incrémente la position1 de 1 jusqu'à 170 degrés
{
myservo1.write(pos1); // le servo play prend la valeur de pos1
delay(10); // pause de 10ms entre chaque point
}
delay(2000); //appui de 2s sur le bouton play
for(pos1 = 170; pos1>=1; pos1-=1) // on incrémente la position1 de 170 jusqu'à 1 degrés
{
myservo1.write(pos1); // le servo play prend la valeur de pos1
delay(10); // pause de 10ms entre chaque point

}

for(pos = 0; pos < 180; pos += 1) // on incrémente la position de 0 jusqu'à 180 degrés
{
myservo.write(pos); // le servo séquence de démarrage prend la valeur de pos
delay(10); // pause de 10ms entre chaque point
}
delay(5000); //appui sur le bouton power pendant 5s
for(pos = 180; pos>=1; pos-=1) // on incrémente la position de 180 jusqu'à 1 degrés
{
myservo.write(pos); // le servo séquence de démarrage prend la valeur de pos
delay(10); // pause de 10ms entre chaque point

}
delay(2000); // on attend 2s pour la suite du programme
}
//dans le cas ou une lettre est passée et plus de 3min sont écoulées (au bout de 3min le lecteur mp3 se met en veille)
if (image_bp == HIGH && (millis()-lastMillis > 180000))
{
for(pos = 0; pos < 180; pos += 1) // on incrémente la position de 0 jusqu'à 180 degrés
{
myservo.write(pos); // le servo séquence de démarrage prend la valeur de pos
delay(10); // pause de 10ms entre chaque point
}
delay(3000); //on appui pendant 3s sur power
for(pos = 180; pos>=1; pos-=1) // on incrémente la position de 180 jusqu'à 0 degrés
{
myservo.write(pos); // le servo séquence de démarrage prend la valeur de pos
delay(10); // pause de 10ms entre chaque point
}
delay(3000); // on attend 3s pour la suite du programme
for(pos1 = 0; pos1 < 170; pos1 += 1) // on incrémente la position de 0 jusqu'à 170 degrés
{
myservo1.write(pos1); // le servo play prend la valeur de pos1
delay(10); // pause de 10ms entre chaque point
}
for(pos1 = 170; pos1>=1; pos1-=1) // on incrémente la position de 170 jusqu'à 0 degrés
{
myservo1.write(pos1); // le servo play prend la valeur de pos1
delay(10); // pause de 10ms entre chaque point
}

lastMillis = millis(); //en sorti de boucle la variable lastMillis prend la valeur millis()
image_bp = LOW; // permet de sortir de la boucle sans répéter l'action image == HIGH
}

if (image_bp == HIGH) //permet l'action quand l'interval est inférieur à 3min et aussi dans la première action
// (image_bp == HIGH && (lastMillis == 0 || (millis()- lastMillis > 14580000))) d'exécuter cette action quand même
{
for(pos1 = 0; pos1 < 170; pos1 += 1) // on incrémente la position de 0 jusqu'à 170 degrés
{
myservo1.write(pos1); // le servo play prend la valeur de pos1
delay(10); // pause de 10ms entre chaque point
}
for(pos1 = 170; pos1>=1; pos1-=1) // on incrémente la position de 170 jusqu'à 0 degrés
{
myservo1.write(pos1); // le servo play prend la valeur de pos1
delay(10); // pause de 10ms entre chaque point
}

lastMillis = millis(); //en sorti de boucle la variable lastMillis prend la valeur millis()

}

last_image_bp = image_bp; //lorsque l'on sort de la boucle permet de voir les changements d'état et d'attendre la fin des actions
}

if (millis() == lastMillis) //si une séquence de démarrage a eu lieu
{last_to_Millis = millis(); //la variable last_to_Millis prend la valeur millis()
//permet de faire un premiere cycle et d'utiliser la variable last_to_millis pour un décompte futur
for(pos2 = 0; pos2 < 75; pos2 += 1) //on incrémente la position2 de 0 jusqu'à 75 degrés
{
// myservo.write(pos);
myservo2.write(pos2); //le servo main articulée prend la valeur de pos2
myservo3.write(pos2); //le servo chapeau articulée prend la valeur de pos2
delay(15); // pause de 15ms entre chaque point
}
for(pos2 = 75; pos2>=1; pos2-=1) // on incrémente la position2 de 75 jusqu'à 0 degrés
{
//myservo.write(pos);
myservo2.write(pos2); //le servo main articulée prend la valeur de pos2
myservo3.write(pos2); //le servo chapeau articulée prend la valeur de pos2
delay(15); // pause de 15ms entre chaque point
}
}
if ((millis()-last_to_Millis <18000) && (last_to_Millis >18500)) //si millis()-last_to_Millis est inférieur à 18s et la variable last_to_Millis
//est supèrieur à 18,5s, soit lors d'un premier demarrage la variable doit avoir incrémenté de 18,5s
{
for(pos2 = 0; pos2 < 75; pos2 += 1) //on incrémente la position2 de 0 jusqu'à 75 degrés
{
// myservo.write(pos);
myservo2.write(pos2); //le servo main articulée prend la valeur de pos2
myservo3.write(pos2); //le servo chapeau articulée prend la valeur de pos2
delay(15); // pause de 15ms entre chaque point
}
for(pos2 = 75; pos2>=1; pos2-=1) // on incrémente la position2 de 75 jusqu'à 0 degrés
{
//myservo.write(pos);
myservo2.write(pos2); //le servo main articulée prend la valeur de pos2
myservo3.write(pos2); //le servo chapeau articulée prend la valeur de pos2
delay(15); // pause de 15ms entre chaque point
}
}
etat_inter=digitalRead(inter); //etat_inter prend la valeur lue de inter
delay(150); // pause de 150ms entre chaque point
if (etat_inter==1) //si la variable vaut 1
//l'inter permet de faire un cycle continu du bras et chapeau articulé
{
for(pos2 = 0; pos2 < 75; pos2 += 1) //on incrémente la position2 de 0 jusqu'à 75 degrés
{
myservo2.write(pos2); //le servo main articulée prend la valeur de pos2
myservo3.write(pos2); //le servo chapeau articulée prend la valeur de pos2
delay(15); // pause de 15ms entre chaque point
}
for(pos2 = 75; pos2>=1; pos2-=1) // on incrémente la position2 de 75 jusqu'à 0 degrés
{
myservo2.write(pos2); //le servo main articulée prend la valeur de pos2
myservo3.write(pos2); //le servo chapeau articulée prend la valeur de pos2
delay(15); // pause de 15ms entre chaque point
}
}
else {
//digitalWrite(ledPin2, LOW);
pos=0; //si aucune action est en cours la pos prend la valeur 0.
pos1=0;
pos2=0;
}

}

J'espère que le code est facile à lire.
Merci hervé.

Bonsoir,
Projet original mais malheureusement pas dans la bonne rubrique.
Regarde avec un modo pour déplacer le sujet.
@+

Re,

rv250:
Dans quelle rubrique puis je déplacer mon sujet, je pensais que c'était ici, car le projet fonctionne.

Autant pour moi :-[ , si le projet fonctionne, tu es au bon endroit.
@+

Une ch'tite photo de la mariée du mexicain ? :grin:

Si le projet fonctionne et est fini autant le laisser ici.

voici une première photo. Je vais essayer de récupérer une vidéo ainsi que d'autre photo de l'urne, lecteur mp3, la main, le chapeau...

rv250:
Bonjour à tous, cet été je me suis marié, pour cette occasion j'ai réalisé un mannequin représentant un mexicain avec une guitare et son chapeau. nous ferons notre voyage de noce au mexique.
...
C'était mon premier projet sous arduino, j'ai eu beaucoup de mal a terminé mon projet mais le jour J, ça a fonctionné.
...

[HUM]
Cool : un voyage de noce au mexique avec un mannequin; ça c'est top ! :grin:

retour sérieux :sunglasses:

Jolie réalisation et réussie dans les temps = bravo
tous mes voeux de bonheur