Salut tout le monde,
mes excuses si j'ai manqué un topic où cette question serait déjà traitée mais je n'ai pas trouvé:
Je travaille sur un petit orchestre automatisé de marionnettes utilisant 5 arduinos.
Chaque Arduino nano pilote un servo moteur pour faire bouger la marionnette et un lecteur audio (DFPLayer mini MP3) qui envoie des sons sur certains mouvements.
Pour le côté multiâche, la fonction millis() s'est révélée beaucoup plus utile que delay().
En somme on définit un intervalle de temps et toute les X millisecondes on déclenche un mouvement et/ou un son.
La question qui coince maintenant pour moi est :
Comment synchroniser les 5 marionnettes pour qu'elles jouent ensemble ? Par le port série ?
Et si cela marche, vaut-il mieux ajouter un arduino chef d'orchestre qui ne s'occupe que de la fonction millis() et d'envoyer des GO et STOP aux autres,
ou un des 5 arduinos peut-il avoir ce rôle ?
Je ferais ça avec un bus i2C. Un des Arduino serait le chef. Il n'est pas nécessaire qu'un Arduino ne fasse "que" le chef.
Pour commander le servo, pas de problème, pour le son, quelle méthode emploies tu?
Pour l'i2C, si tu veux un exemple...
PS: je me pose la question, est-ce que les Nano sont entièrement autonomes, dans ce cas un simple TOP de synchro nécessiterai qu'une simple liaison, au quel cas le bus i2C n'est pas nécessaire.
Ou le maître envoie la position du servo ainsi que quelle son jouer?
Les 2 solutions sont possibles c'est un choix en fonction de l'architecture de ton ensemble.
Par contre, une chose à prévoir, la synchronisation doit se faire relativement souvent.
Les cartes Arduino sont fabriquée à bas coût. En conséquence de quoi l'horloge utilise un résonateur et non un quartz. Les "bons" résonateurs" ont une dispersion en fréquence de l'ordre de ±0,5%. Cela fait 0,5s de décalage au bout de 1 minute 40s de jeu. C'est juste intolérable si les instruments se décalent aussi rapidement.
Cela militerait donc pour un des éléments (ou un chef d'orchestre) qui donnerait le tempo en permanence. Ce peut être tout simplement une ligne qui envoie une impulsion pour donner le rythme aux autres.
Tout dépend du niveau de synchronisation dont tu as besoin.
Les solutions qui te sont ou te seront proposées conviendront peut-être.
Je réponds sur le principe et sur des vraies synchronisations à partir de composants extérieurs.
Même si les quartz de deux oscillateurs étaient exactement à la même fréquence (c'est une vue de l'esprit) il y aurait toujours un glissement en phase, ne serait-ce que parce qu'il y a des petites différences de température entre les différentes cartes.
Maintenir plusieurs horloges synchronisées est difficile à faire.
Piloter les microcontrôleurs avec une horloge commune est plus envisageable.
Il faut savoir que les microcontrôleurs ont trois façons de gérer une horloge :
un oscillateur interne peu précis dit souvent oscillateur "RC".
C'est la configuration en sortie de fabrication qui est modifiée par l'opération "Graver la séquence d'initialisation". Tu ne reçois jamais les micro dans cette configuration.
Un oscillateur interne plus précis qui utilise un composant externe : un quartz ou un résonateur. C'est dans cette configuration que se trouvent les micro des cartes que l'on achète.
On peut également entrer directement une fréquence sur la pin correspondant à la sortie du quartz.
Bien évidement cela oblige à avoir un oscillateur indépendant de 16 MHZ et bricoler les circuits imprimés des cartes.
S'il s'agit de piloter un servo il y a peut-être une solution.
Tout dépend du microcontroleur et du timer utilisé pour piloter les servos.
Je donne juste une piste de réflexion.
Dans un atmega328p il existe un timer qui peut accepter une horloge externe.
Je ne sais pas si c'est celui qui est utilisé par la bibliothèque "servos" et je ne sais pas si la bibliothèque servo l'accepterait.
Enfin dernière solution chercher s'il n'existe pas des circuits intégrés qui puissent piloter des servos et regarder s'ils sont synchronisables aisément.
CI spécialisés dans la commande de servo ou en PWM.
La commande de servo est de la PWM de fréquence de récurence 50 Hz et de rapport cyclique bien précis.
Merci beaucoup jpbbricole, fdufnews, 68tjs et vileroi!
Vos informations sont précieuses, claires et me mènent à une de ces deux options options:
Utiliser un arduino nano (parce que j'en ai encore un) comme chef d'orchestre pour juste envoyer une série de TOP indexée (probalemen en boucle comme un séquenceur rythmique, module de 16 ou 32 pas par exemple) et chaque Arduino-esclave sélectionne le numéro qui le concerne pour ses opérations.
Acheter ou tester un arduino méga pour faire le tout. Je n'en ai jamais essayé et ne sais pas si pour une 10ain de servo moteurs et 5 lecteurs audio ça va marcher.
Concenrnant la question de jppbricole sur le lecteur audio, c'est très imple parce que le DFPLayer min vient avec sa bibliothéque de fonctions toutes prêtes
Il faut en somme
inclure la bibliothéque dans le sketch
créer (déclarer) une instance du lecteur
puis utiliser dans le setup ou la loop les commandes très explicites comme
player.volume ( "de 0 à 30")
player.play ("n° de fichiir audio sur la carte sd du lecteur")
Donc Arduino n'est plus qu'une source d'électricité et une télécommande.
Un grand merci à vous et je peux, si ça vous intéresse, poster des mises à jour dans code quand j'aurai avancé.
Le problème va être le nombre de ports série pour commander les DFPLAYER. Avec de modules de ce type, SC5W:
on peut commander les MP3 à jouer simplement par des états logiques sur ses entrées IO0 à IO7 (Mode 0), dans cette configuration, plus de problème de nombre de pin, le Mega en as assez.
Bonjour jpbbricole et merci !
Je prends note, j'ajoute à ma liste et posterai des résultats (qui prennent un peu de temps pour tout un tas de raisons).
Encore quelques informations, pour la commande des servo, il y a le PCA9685 sur bus i2C
tu peux en avoir 64 cartes comme celle ci
ce qui te fait 16 x 64 servo. pour seulement 2 fils (SCL SDA) sur l'Arduino, ce qui te permettrai d'avoir un "petit" Arduino.
Pour la solution avec bibliothèque pour les servo, la "classique" Servo.h fonctionne en mode bloquant, c'est à dire que l'on attend qu'un servo aie terminé son déplacement pour faire fonctionner le suivant, pas le pied pour ton application. Avec la bibliothèque VarSpeedServo on peut choisir attendre ou pas. et choisir la vitesse, également.
Sur ton idée de Nano séparés, ces Nano étaient indépendants au point de vue de quel mouvement/musique il devaient faire ou ils recevaient les ordres de mouvement/musique du chef?