0Home Page test forums PROGRAMMATION ARDUINO TUTO VOIX SYNCHONISEE PARFAITE

This topic contains 20 replies, has 10 voices, and was last updated by  Pierrot59 1 month ago.

  • Author
    Posts
  • #5049

    ╔ Jack ╗
    Moderator

    Voici un tuto expliquant comment brancher un HP sur un arduino nano dédié ( non relié a myrobotlab ) afin d’avoir une synchronisation parfaite entre la bouche du inmoov et les paroles.
    Comment cela fonctionne ?
    C’est tres simple , chaque son envoie une impulsion sur une entrée analogique de l’arduino qui actionne instantanément le servo.

    Ce qu’il faut :

    –> un arduino nano
    –> un petit HP avec ampli
    ————————————————————————————————–
    les branchements :

    http://img15.hostingpics.net/pics/832542branchementparoleinmoov.jpg
    ————————————————————————————————–
    le script arduino :

    // code pour Parole du Inmoov !! le son du PC doit etre suffisemment fort

    #include <Servo.h>

    // Définition des constantes

    #define VOICEservoPin 6 // pin du servo bouche
    #define VOICEHPpin 3 // pin du HP

    //déclaration des variables

    Servo VOICEmyservo;

    int VOICESecondDetection = 1; //
    int VOICEval = 0; // variable to store the read value
    int VOICEi = 0;
    int VOICEpos = 55; // variable to store the servo position
    int VOICEBoucheStatus = 0;
    int VOICEActionBouche = 0;

    unsigned long timeofdetect;
    char VOICEdelayFlag = 0;
    unsigned long VOICEdelay = 1;
    unsigned long VOICEtime;

    void setup()

    {

    analogReference(EXTERNAL);
    pinMode(VOICEservoPin, OUTPUT);
    Serial.begin(9600);

    VOICEmyservo.attach(VOICEservoPin);
    VOICEmyservo.write(55);

    }

    void loop()

    // debut VOICE
    { if (VOICEdelayFlag == 0) {
    VOICEval = analogRead(VOICEHPpin);

    if (VOICEval < 630 || VOICEval > 680 ) // recherche valeur entre 665 et 680 ( a ajuster si besoin )

    {
    VOICEBoucheStatus = 1; // bouche fermée

    }
    else // tant que

    {
    VOICEi++; // la valeur entre 630 et 680 est pas trouvée
    }

    if (VOICEi >= VOICESecondDetection)
    {
    VOICEi = 0;
    VOICEBoucheStatus = 0;

    }

    }
    if (VOICEBoucheStatus == 0 && VOICEActionBouche == 0) {
    if (VOICEdelayFlag == 0) {
    VOICEmyservo.write(95);
    VOICEtime = millis();
    VOICEdelayFlag = 1;
    }
    delay(40); //1

    if (VOICEtime + VOICEdelay < millis() and VOICEdelayFlag == 1) {
    VOICEmyservo.write(55);
    VOICEtime = millis();
    VOICEdelayFlag = 2;
    }
    delay(40); //2

    if (VOICEtime + VOICEdelay < millis() and VOICEdelayFlag == 2) {
    VOICEActionBouche = 1;
    VOICEtime = millis();
    VOICEdelayFlag = 0;
    }
    }

    if ((VOICEBoucheStatus == 1 && VOICEActionBouche == 1) or VOICEdelayFlag == 3)
    {
    if (VOICEdelayFlag == 0) {
    VOICEdelayFlag = 3;
    VOICEmyservo.write(55);
    VOICEtime = millis();
    delay(40); // 3
    }
    if (VOICEtime + VOICEdelay < millis()) {
    VOICEActionBouche = 0;
    VOICEtime = millis();
    VOICEdelayFlag = 0;
    }

    }

    // fin de VOICE

    }

    • This topic was modified 2 years, 12 months ago by  ╔ Jack ╗.
    • This topic was modified 2 years, 12 months ago by  ╔ Jack ╗.
    • This topic was modified 2 years, 12 months ago by  ╔ Jack ╗.
  • #5056

    lecagnois
    Participant

    Bonjour a tous

    Je confirme le montage rends la bouche parfaitement synchro , c est impressionnant
    j ai utilisé un arduno uno (que j avais dans un fond de tiroir) et des HP à 7 euros trouvés dans une grande surface .

  • #5057

    anthony
    Moderator

    Merci pour le tuto !
    Lecagnois le rendu est vraiment super, avec le petit plus dans les yeux aussi

    Il y a moyen d’optimiser je pense en calquant l’amplitude de l’ouverture de la bouche, sur l’intonation des mots.
    Au lieu de spécifier une valeur fixe d’ouverture du servo on lui met une valeur dynamique basé sur le voltage fluctuant en entrée . La commande map est notre amie
    A voir si le servo arrive à suivre la cadence

    position_du_servo=map(val_relevée, MIN_voltage, MAX_voltage, posMin_servo, posMax_servo);

    https://github.com/MyRobotLab/pyrobotlab/blob/master/home/moz4r/INO/mouthcontrol_hardware.ino

    • #5096

      Sebastien
      Participant

      Bravo pour toutes ces avancées sur l’animation de la bouche.
      Pour faire avancer le Schmilblick, voici une approche un peu différente utilisant le calcul du RMS du signal audio. Cela pose d’autres problèmes… notamment de décalage et un rendu un peu différent…
      Le servo moteur de la mâchoire est un peu faiblar en plus…

      Les explications sur le principe de fonctionnement.
      http://quai-lab.com/synchroniser-bouche-dun-robot-humanoide/

  • #5060

    ╔ Jack ╗
    Moderator

    • This reply was modified 2 years, 12 months ago by  ╔ Jack ╗.
  • #5062

    Pierrick
    Participant

    Un grand merci pour ce tuto Jack.
    Le béotien que je suis se demande quand même où modifier ses min/max sachant que bouche fermée j’ai 60 et ouverte 100 dans MRL?
    Oui j’en suis (que)là!!!!

  • #5063

    ╔ Jack ╗
    Moderator

    Pas de soucis , et je n’ai aucun mérite , j’ai démarré comme toi il y a peu de temps et j’en suis arrivé à ce résultat grâce à des amis qui sont ici car aucune connaissance en arduino , électronique et programmation il y a quelques mois !! mais on apprend vite avec ce inmoov ! 😀
    Pour répondre à ta question , toutes les valeurs ou tu vois 55 dans le script modifie les par 60 et la valeur 95 tu la modifie par 100 🙂 ( ou tu laisse 95 ou tu met moins si tu veux qu’elle s’ouvre moins fort , c’est a toi a ajuster selon ton envie et ton montage )

    • This reply was modified 2 years, 12 months ago by  ╔ Jack ╗.
  • #5066

    Pierrick
    Participant

    Super çà fonctionne, me reste à jouer avec la plage des 630-680 pour voir ce que celà impacte!
    Merci

  • #5067

    ╔ Jack ╗
    Moderator

    en fait , cette plage donne les valeurs entre lequel se situe le niveau de ton HP quand il n’y a pas de sons , quand un son est detecté cela te fait sortir de cette plage et c’est à ce moment précis et que cela fait déclencher ton servo. plus tu resserres la plage , plus ce sera précis au niveau de la detection du son mais plus ce sera sujet aux ” faux sons ” , selon ton HP et la source qui envoie le son ces valeurs peuvent être un chouilla différente d’une personne a l’autre 🙂

  • #5107

    sylvain
    Participant

    Bonjour

    Vraiment intéressant et bravo pour la synchro
    J’en suis pas encore arrivé au stade de la tête loin de la mais je me pose une question
    Le servo qui fait bouger la mâchoire fait du bruit et je trouve ça très agaçant, je l’ai remarqué dans différente vidéo.
    N’y a-t-il pas un ou des servos moins bruyant ou existe-t-il d’autres possibilités pour faire fonctionner la mächoire
    Est ce que le bruit du servo ne pose pas de soucis avec la détection du son

    Merci,

  • #5112

    anthony
    Moderator

    En effet il y a du boulot chez quai-lab . Ce sont des informations très intéressantes !
    Justement pour la réactivité des servos ainsi que le bruit généré, je pensais à un truc : Un système d’électro aiment pour faire bouger la mâchoire, en lieu et place du servo. Une fois bien calibré cela pourrait s’avérer plus réactif et surtout sans bruit. Qu en pensez vous

  • #5116

    Sebastien
    Participant

    Merci.
    Pour le bruit comme l’indique Antony, à part remplacer le servo moteur par un moteur pas à pas ou bien des electro aimant je ne vois pas d’autres options.
    Je n’ai pas vérifié sur Internet, mais sur un stock d’electro aimant issu de démontage de photocopieurs et autres matériels que nous avons au Lab, je ne tombe que sur des tensions > = à 24 volts.
    Je ne sais pas s’il existe des modèles en 6V avec assez de couple et 10 à 15 mm de course.
    A creuser en tout cas…
    Tu as raison, le bruit des moteurs parasite le micro d’InMoov. Cela peut doit pouvoir s’arranger en filtrant le signal issu du micro pour le nettoyer de ce bruit spécifique, et en isolant le micro, les alimentations avec des capacités etc…
    Dans la pratique, les ordres sont souvent donnés avec InMoov en mode attente.

  • #5117

    Gael Langevin
    Keymaster

    Que de belles approches! Nous avons donc maintenant trois façon de pouvoir activer la mâchoire avec la voix. L’amplitude d’ouverture est un peu plus restreinte sur vos systeme que sur le principe du script de Joel Hacket, c’est lié je pense à la rapidité nécessaire pour formuler les mots. Par contre la précision des mouvements est franchement mieux.

    J’ai une question qui n’a rien à voir avec la voix mise à part l’amplificateur. J’aurais pu ouvrir un post sur le forum général, mais cela vient un peu dans votre topic.

    Sur InMoov02, j’ai un retour du bruit des servo moteurs qui arrive dans l’amplificateur, ce qui fait que lorsqu’InMoov parle, on entends également les servo moteurs qui sont amplifiés.
    Étrangement, j’ai le même circuit sur InMoov01 sans ce phénomène.
    L’ampli utilise la même source(batterie 6V) que les servos. Je passe le son sortie du PC par une clef SoundCard USB qui va directement à l’input de l’ampli. Mes HPs sont ensuite connectés aux output de l’ampli.
    Une idée?

  • #5118

    Dominique
    Participant

    Gael,

    Je pense qu’il serait préférable de séparer l’alimentation de l’électronique et des servomoteurs.

    Essaie d’utiliser une batterie 6V pour les servo moteurs et une autre pour l’électronique.

    A+
    Dom.

  • #5121

    Gael Langevin
    Keymaster

    Lors de mes tests, j’ai effectivement séparé les deux, servo et électronique, en utilisant deux batteries. Dans ce cas pas de souci.
    Sauf qu’InMoov fonctionne avec une batterie qui alimente l’électronique de la NervoBoard, qui elle même alimente les Arduino et les servomoteurs. L’amplificateur a sa propre ligne d’alimentation directement à la batterie.
    Quel type de diode puis-je utiliser pour éviter un effet loop du courant?
    diode inmoov

  • #5128

    Sebastien
    Participant

    Gaël, as tu essayé d’alimenter l’ampli avec une “power bank” de tél portable. J’ai été obligé d’en passer par là car j’amplifiais plus de parasite que de son… ça à bien améliorer les choses (config : sortie en direct du son de la tablette vers ampli, et ampli sur power banque 5v).

    Sinon peut être aussi faire des tests en débranchant un par un les servos moteurs au cas ou le bruit viennent particulièrement d’un modèle mal isolé…

    Pour les diodes je ne savait pas qu’on pouvait les utiliser dans ce but (filtrage : capacités ou inductances).

  • #5132

    sylvain
    Participant

    Bonjour

    ne peut-on pas déplacer le servomoteur de la mâchoire dans un autre endroit par exemple le corps et utiliser un système de câblage du style des doigts ou bien des tiges qui passeraient dans le cou, pour éviter de parasiter le micro
    Je ne suis pas encore arrivé au stade du cou et de la tête mais il me semble que la pièce qui sert de trachée est creuse ne peut-on pas passer par là.
    Et je pensais aussi au lieu d’avoir tout la mâchoire à ouvrir ne peut-on pas faire une sorte de bouche
    Ça serait moins dur à bouger et utiliser un servomoteur plus petit qui pourrait faire moins de bruit
    Le problème c’est que dans la doc technique des servos le bruit n’est pas indiqué.

  • #5133

    Dominique
    Participant

    Bonjour,

    Gael, je crée ce soir un nouveau poste avec schémas.

    Personnellement, je compte faire une isolation galvanique entre l’alimentation des servomoteurs et l’électronique en utilisant des opto-coupleurs.

    De cette façon, ils n’y aura plus de parasites ou de pointe de courant dans la masse électronique (cela peut créer des reboots intempestif des arduinos par exemple…).

    A+
    Dom

  • #5137

    Dominique
    Participant

    Pour répondre à ta question concernant les diodes, des 1N4007 feront très bien l’affaire, à mettre en série avec l’alimentation de ton ampli, anode coté positif de l’alimentation, cathode sur le positif de l’ampli. Tu devrait aussi mettre une capa d’au moins 100µF entre + et – de l’ampli.

    PS: je ne trouve pas le moyen d’insérer des images sur ce forum. Si quelqu’un à un tuto…

    A+

  • #5283

    Peut être qqs idées ici:
    https://openclassrooms.com/courses/programmez-vos-premiers-montages-avec-arduino/le-moteur-a-courant-continu-partie-1-transistors-et-sorties-pwm

    Dominique je serai aussi intéressé par ce schéma.
    Sinon 100µF entre + et – de l’ampli ce n’est pas assez. Je choisirai plutôt des condos de 1000 µF miniatures câblés physiquement tt près de l’étage de puissance et pour les diodes il faut quelque chose de plus rapide que les 1NXXXXX et mettre en parallèle des diodes Schottky rapides type D2-PAK. Pourquoi en parallèle, pour réduire la résistance interne de ces diodes.
    Excepté de renvoyer du courant, est-ce que les moteurs induisent des parasites ou une baisse de tension ?
    Amicalement.
    Sy.
    J’espère avoir bien compris, sinon zappez.

  • #14014

    Pierrot59
    Participant

    Bonjour,
    Je suis tout nouveau sur InMoov et le lien du schéma de connexion entre l’arduino et le Haut Parleur n’est plus visible, pouvez-vous le poster à nouveau s’il vous plait ?
    Il est à connecter sur la pin D3 mais avant ou après l’ampli ? à travers condensateur ? Diode ?
    Merci d’avance

    • This reply was modified 1 month ago by  Pierrot59.
    • This reply was modified 1 month ago by  Pierrot59.

You must be logged in to reply to this topic.