Accordeur de guitare automatique

Bonjour à tous, je suis un élève de Terminale S SI et je dois faire pour mon projet pluri disciplinaire un accordeur de guitare automatique ( dans l'idéal on joue sur la corde et pouf avec un moteur la corde s'accorde sur la bonne fréquence)
Je dois m'occuper de la partie programmation, le problème est que je ne suis pas vraiment expérimenté du tout et je ne sais pas de quelles informations j'ai possiblement besoin.
Nous avons une caisse de résonance qui fait office de guitare avec un corde dessus ainsi qu'une clé.

Mon professeur m'a conseillé de prendre un micro de contact à mettre sur la caisse de résonance ainsi qu'un ampli, j'ai une carte arduino uno ainsi qu'un servomoteur "Smart Servo MS-12A" de Makeblock, le problème étant que le documentation sur ce servo est très limité, j'ai quand bien même réussi à trouver un bibliothèque pour mieux l'utiliser

Dans l'idéal de ce que je voudrais faire ce serait : Demander une fréquence --> Jouer sur la corde -> Acquérir la fréquence par je ne sais pas quel moyen --> Si c'est trop bas "tourner moteur dans un sens"/ Si c'est trop haut " tourner moteur dans l'autre" --> rejouer sur la corde et répété jusqu'à la fréquence voulu

Je ne sais absolument comment faire pour programmer ce genre de chose c'est pourquoi je demande votre aide
Merci d'avance et désolé pour le pavé

Bonjour et Bienvenue sur le Forum !!

  1. Tu arrives ... une bonne chose serait de commencer à prendre connaissance des Règles de fonctionnement du Forum.... dont la n°2 ..où tu trouveras un lien vers un site de tutoriels où les Servos sont traités

2°) Divises ton travail . les parties peuvent êtres bien avancées séparément

acquérir un son / mesurer la fréquence de la fondementale / comparer avec la fréquence voulue / gestion du moteur

Mesure de la fréquence fondementale : Vu que le son émis par la corde vibrante est composé de plusieurs fréquences renseignes toi sur l'utilisation d'une FFT (on peut utiliser sans nécessairement comprendre la théorie !!)
Un librairie FFT existe pour Arduino. Elle comporte une fonction peak donant la fréquence de plus grande amplitude.

Pour une bonne résolution de la FFT (il faut pouvoir distinguer les demi-tons , voire le quart de ton!!!) il faut pas mal de mémoire RAM. -> Si possible prendre une carte Aduino bien dotée en RAM

Ensuite renseigne toi sur l'algorithme PID pour savoir comment optimiser la tension de la corde

Tout d'abord merci pour l'accueil sur le Forum je prendrais connaissances de ces tutos ^^

Mais si ce n'était qu'un simple servomoteur je n'aurai pas eu de soucis, le problème étant que celui-ci n'a pas 3 fils mais 4 qui doivent se brancher sur les ports TX/RX/GND/Vin.
Il a aussi la particularité d'avoir des fonctionnalité différentes comme une rotation à 360° ainsi que pouvoir analyser de soi même le couple exercer par un composant du système
C'est cet excès d'information qui me dérange car je ne vois pas forcément comment programmer sur ce type de servomoteur (je lirai quand même les tutos au cas où il soit traité malgré sont énorme manque de documentation disponible)

J'avoue ne pas voir en quoi diviser mon travail me permettrai de mieux faire mon programme car je souhaitais tout enchainer mais je suivrais volontiers ton conseil

J'avais aussi commencé à faire des recherches sur la FFT ( Fast fourier transform si je ne m'abuse ?) mais mon professeur d’électronique m'en a dissuadé car apparemment trop compliqué à prendre en main et à comprendre ( dans le TPE on essaie plus de comprendre que d'avoir un objet finis pour la fin d'année)

Concernant ce que nous avons déjà fait des mesures de fréquence selon la force que nous exercions sur la clé de la corde mais nous ne pensons pas l'utiliser vu la fiabilité de ses résultats qui sont vraiment approximatif
Nous avons une corde de Sol, nous souhaitons accorder pour un Sol2 avec 196Hz
Pour ce qui est de la fondamental mon professeur nous a commandé un micro de contact et celui-ci devrai (selon ses dires) permettre d'avoir moins d'harmoniques donc plus facilement se préoccuper de la fondamentale
Le principe serait à mon avis de mettre le micro sur la caisse de résonance, jouer et avec un ampli amplifier le son qui sera capté par le micro et transmis sur la carte. Mesurer la fondamentale sera donc une autre étapes, pour ce qui est de la rotation du moteur j'ai déjà fais ça mais avec un moteur pas à pas c'est pour cela que je ne sais absolument pas comment faire avec le servomoteur à ma disposition

J'ai lu en travers avant de répondre ce en quoi consiste grosso modo l'algorithme PID mais je me demande si celui-ci pourrait être utilisé pour la rotation du moteur et/ou obtenir une fréquence correct un peu comme le fait cette image pour montrer qu'on dépasse et qu'on peut redescendre

Merci encore de m'accorder votre temps c'est plus que gentil

Bonsoir,

Si j'ai bien compris , le principe de ce forum est de ne pas donner de solutions aux demandes liées aux examens.
Cependant le travail en groupe n'est pas malsain jusqu'à une limite;
si vous êtes conscient qu'un jour vous serez tout seul dans la jungle;
notamment si vous envisagez de passer des concours.

Au niveau Terminal S :
Les FFT ? ...... Il vous faudra assumer, expliquer, justifier. (devant un aréopage de profs expérimentés ?)
Il n'y a rien de pire que de vouloir éblouir sans maitriser.
Mais, bon : on peut tenter. Il faut oser.

Je ne sais pas vraiment ce qu'on enseigne actuellement sur les PID (numériques?) en Terminal S;
ni les travaux pratiques réalisés.
Et l'utilisation de bibliothèques m'interroge.

Mais : osez.

Cordialement,
bidouiilleelec

Merci de votre réponse, je suis bien conscient que le but n'est pas de donner une réponse directement, je ne cherche que des pistes à exploiter étant donné que les cours de Science de L'Ingénieur ne sont vraiment pas focalisé sur les techniques de programmation mais bien plus sur comment fonctionne un moteur courant continu etc...
Si je ne souhaite pas faire de FFT c'est principalement pour cette raison " Il n'y a rien de pire que de vouloir éblouir sans maitriser." Manque de chance, tout les profs d'électronique de mon lycée sont musiciens je les soupçonne donc aussi de bien maîtriser la FFT alors que moi ...Baaaah ça pourrait être plutôt confus

Mais bon si c'est vraiment une méthode simple à utiliser je l'envisagerais.

Pour les travaux pratiques réalisé nous n'en avons quasiment pas fais, on a fait quelques tp sur SolidWorks ainsi que ISIS mais rien qui touche à la programmation
Et je n'ai pour l'instant rien vu en ce qui concerne les PID
Pour les bibliothèques il me semble que cela permet d'utiliser des programmes/raccourcis (?) de manières plus simple car "arrangé" spécialement pour un tel ou tel domaine ?
Du moins c'est ce qu'il me semble...

Je vais suivre vos conseils et essayer de regarder le fonctionnement même de la FFT

Tu n'as pas forcément besoin de comprendre en détail comment marche une FFT, juste de savoir que c'est une transformation mathématique qui, sous certaines hypothèses, permet de calculer le spectre fréquentiel d'un signal temporel, c'est à dire l'amplitude des différentes fréquences qui le composent.

Dans ton cas, la corde vibre à une fréquence principale, appelée fréquence fondamentale. Si elle était infinie et parfaite, il n'y aurait pas d'autres fréquences dans le son émis. Mais comme ce n'est pas le cas, elle émet aussi des harmoniques, c'est à dire des fréquences multiples entières de la fondamentale. Par exemple si elle vibre à 440Hz (le LA), le spectre contiendra aussi du 880, du 1320, etc. Les amplitudes des harmoniques sont décroissantes avec le degré de multiplicité.

Ton signal sonore sera acquis par ton système et échantillonné en temps (c'est à dire que tu auras des valeurs toutes les millisecondes si tu choisis d'échantillonner à 1 kHz). Comme ce signal est appelé 'signal discret' (égal "échantillonné"), la transformée de Fourier que tu appliqueras sera un TF Discrète (DFT en anglais) ou une TF rapide (FFT).

Donc pour toi, il te suffit de prendre les échantillons mesurés par ton système, les mettre dans un tableau, et appeler la fonction de calcul de la FFT pour obtenir le spectre. La valeur maximale des amplitudes du spectre te donnera l'emplacement de la fréquence fondamentale, et tu en déduiras la valeur de cette fréquence.

Une ou deux choses à savoir en plus : il faut échantillonner assez vite pour monter haut en fréquence. Typiquement si tu veux voir la fréquence de 1320 Hz (l'harmonique), il faudra échantillonner à 1/(2*1320) échantillons par seconde soit près de 0.4 ms par mesure. Autant faire un peu plus rapide pour assurer...

La durée de ton signal va imposer le pas en fréquence (donc la précision) du calcul de la FFT. Si tu mesures N échantillons pendant une durée de N fois le pas d'échantillonnage (les 0.4 ms de tout à l'heure), la précision fréquentielle sera de 1/(N * pas).
Par exemple, si tu échantillonnes ton signal toutes les 0.1 ms pendant 1 seconde, tu mesureras 10000 échantillons et les fréquences du spectre seront espacées de 1 Hz.

Les problèmes liés à l'utilisation de la TF sur un microcontrôleur sont des problèmes de mémoire. Tu dois acquérir et stocker un grand nombre de de valeurs avant de lancer le calcul. Il faut donc bien choisir les paramètres (pas d'échantillonnage et durée) pour ne pas saturer la mémoire tout en conservant les performances requises.

Bonjour
avant de choisir la méthode de mesure de fréquence il serait bon de mieux connaître le signal réel
D'après le message #3 il s'agit d'accorder une corde unique à 192Hz. le signal etant capté par un micro de contact solidaire de la caisse de résonnance.( a priori moins dnharmoniques elevées)

Observer le signal a l'oscilloscope

Il est probable qu'un oscilloscope numérique soit dispibible auquel cas il est généralement doté d'une visualisation de spectre....par FFT

(Si la compréhension intime de la FFT etait nécessaire pour l'utiliser il y aurait peu de 'clients' !! l'algorithme repose sur des permutations 'papillon' peu intuitives....)

Je vois donc grosso modo comment la FFT fonctionne maintenant ça devient de plus en plus clair dans ma tête.
Il ne me restera qu'à imaginer ce code que j'ai du coup mis sur papier et trouver comment relier mon micro à arduino, le reste devrait découler simplement ^^

Une ( probablement) dernière question, j'ai vu en cherchant sur quelques sites et sur ce forum des gens qui parlaient de la méthode "goertzel" pour détecter une fréquence, je me demande quelle méthode serait la plus logique d'utiliser entre la FFT et la méthode goertzel

Merci encore à vous tous pour vos réponses :smiley:

Bonsoir

L'algorithme de Goertzel est très bien adapté à la détection de présence d'une fréquence particulière dans un signal. Exemple : décodage DTMF

FFT parait en principe mieux convenir à ta problématique : tu as besoin de connaître l'écart par rapport à 192Hz et agir pour le réduire, le fait que le 192Hz soit présent ou pas ne te ferait pas avancer.
L'écart à 192 Hz est essentiel si tu te lances dans un asservisement.

Pour la FFT préférer une carte Méga à une carte UNO en raison de la RAM disponible
Sur une carte Uno une FFT de 128 points passe de justesse et monopolisantt la RAM.
Une FFT de 64 points risque d'être décevante en terme de résolution

Si vous avez le choix pour le hard, il faudrait peut-être vous orienter sur une carte Teensy 3.
Elle dispose de plus de RAM, elle est plus rapide et elle dispose de fonctions DSP. On peut lui adjoindre un adaptateur audio qui possède une entrée micro.
Elle dispose d'une chaine de développement dans l'IDE Arduino.

+1 pour considérer une teensy et sa carte audio pour des projets orientés musique (cf AudioAnalyzeFFT256)