Accordeur automatique pour guitare?

Présentation
Bonjour à tous et à toutes!

Je me présente (par mon pseudo) je suis sonacx!

Je dois réaliser pour mon TPE un accordeur automatique mais je n'ai aucune connaissance (ou peu) sur l'électronique.

Comme le titre l'indique je dois fabriquer un accordeur automatique.

Les matériels que je pensais pour réaliser celui ci était le Arduino.

Je souhaiterais savoir de quels autre matériels j'aurais besoin pour réaliser l'accordeur, leurs branchement et comment dois-je programmer la carte.

L'accordeur doit pouvoir accorder la première corde à une fréquence de 82hz

Pour commencer:
Je pense avoir besoin:

-d'une carte Arduino

-d'un microphone

Sinon je ne vois pas comment la programmer ce qui est pour moi le problème majeur.


Je pensais mettre en place un algorithme comme celui ci:

1-acquérir note de guitare

2-Comparer à la fréquence de la corde initialement à la fréquence 82hz

3.a- Si fréquence inférieur tourner moteur à gauche
3.b- Si fréquence supérieur tourner moteur à droite

4-acquérir note

5-Comparer fréquence de la corde à 82hz

6.a si fréquence égale fin
6.b si fréquence différence revenir à l'étape 2

Merci de votre aide qui m'est précieuse !
Je vous souhaites à tous une bonne journée et soirée !

Il va falloir lui mettre un sacré réducteur à ton moteur, because: Les clés, elles sont plutôt coriaces, et le réglage il est plutôt "fin".
Pour le code: Pas de difficulté majeure, ni mineure. Juste se plier à la syntaxe Arduino ("C")
Regarde déjà des codes existants pour te familiariser avec la bestiole

Ho OUI que mettre un moteur pour agir sur les clefs d'une guitare ne me semble pas aisé du tout. As-tu pensé au problème de son immobilisation sur le manche ? Sans compter qu'il faudrait pourvoir le déplacer pour accorder les autres tonalités.
Je me demande surtout si utiliser un µP pour ajuster une corde de guitare est bien la solution technologique la plus appropriée. Un microphone, suivi d'un amplificateur opérationnel pour en augmenter le signal, suivi d'un ou deux OP pour réaliser un filtre peut déjà dégrossir le problème.
La guitare sauf erreur de ma part est un instrument de musique ... donc son utilisateur doit être capable à l'oreille de procéder à son accord. Il pourrait alors utiliser Arduino pour générer les six notes avec une forte précision. Reste que ce n'est plus conforme à "ton cahier des charges".
Quoi qu'il en soit, arguments techniques à l'appui, tu peux éventuellement renégocier ton projet avec ton professeur. Mais dans tous les cas, avant de commencer à investir de gros efforts au développement du projet, il faut impérativement en cerner la faisabilité.
Ne jamais oublier que dans un projet quel qu'il soit, c'est au tout début, (Alors que l'on a encore dépensé presque rien) que les décisions prises vont engager le maximum de couts.
Amicalement : Nulentout.
P.S : Au vue de la fréquence annoncée, je n’ai pas vérifié, mais il me semble que tu as choisi la basse. À mon avis il serait plus sage dans un premier temps de choisir la « chanterelle ». La fréquence du MI étant plus élevée elle sera, en relatif, plus facile à accorder. Tu vas forcément effectuer des tests, et le son émis sera à ton oreille un renseignement non négligeable. Dans les aigües nous avons plus de facilité que dans les graves pour différencier des écarts de tonalité.

bonjour
cela existe déjà !!!
http://www.spi0n.com/systeme-daccordage-automatique-de-guitare/

:smiley:

L'algorithme est bon. A un détail près, quand on accorde à la main certaines guitares on doit "dépasser un peu" la note, et l'élasticité de la corde fait que la fréquence retombe juste (backslash dans le mécanisme ?)

Plus simple mécaniquement, un afficheur LCD qui indique plus / moins et on tourne la clé à la main.

Je pense que le servomoteur est assez puissant pour tourner la corde.
je pense que je devrais faire une sorte qu'à chaque fois que l'on tourne elle revienne en position initial de 90°.

Sinon pour le microphone je pensais à celui ci:
SparkFun Electret Microphone Breakout - BOB-12758 - SparkFun Electronics?
Est-il bien?

Oui il a un ampli, ça doit marcher. Il faudra peut être filtrer les harmoniques du son.

Comment fait-on ce genre de chose?

A l'aide d'un filtre passe bas?

Un "passe bande" (See->Gogole) c'est encore mieux.

Voici le branchement du servo moteur ainsi que le micro

http://s27.postimg.org/obs6qlatf/branchement.png

le servomoteur je pense doit être assez puissant pour tourner une clé.
J'ai essayé de mettre des obstacles assez lourd et ça tournait donc mon choix est fait.
il faudra donc que le moteur retourne dans un position intermédiaire après avoir tourné la clé.

Le servo est il multi-tours ou à 180° ? Quel couple ?

attendez je crois avoir trouvé la solution:

MDP RC170 12V.
Vitesse nominale : 2525 tr/min
Couple nominal : 0,0084 Nm
Le réducteur est composé de 4 étages d'engrenages avec un rapport de réduction total de R = 25
Vitesse de sortie : 101 tr/min
Couple de sortie : 0,21 Nm

on l'alimentera sous 5v

pour la détection de fréquence j'ai trouvé ce code

/*
* Modified Arduino Frequency Detection
* by Nicole Grimwood
*
* For more information please visit: 
* http://www.instructables.com/id/Arduino-Guitar-Tuner/
* 
* 
* Slightly edited version of:
* Arduino Frequency Detection
* created October 7, 2012
* by Amanda Ghassaei
*
* This code is in the public domain.
*/

//clipping indicator variables
boolean clipping = 0;

//data storage variables
byte newData = 0;
byte prevData = 0;
unsigned int time = 0;//keeps time and sends vales to store in timer[] occasionally
int timer[10];//storage for timing of events
int slope[10];//storage for slope of events
unsigned int totalTimer;//used to calculate period
unsigned int period;//storage for period of wave
byte index = 0;//current storage index
float frequency;//storage for frequency calculations
int maxSlope = 0;//used to calculate max slope as trigger point
int newSlope;//storage for incoming slope data

//variables for decided whether you have a match
byte noMatch = 0;//counts how many non-matches you've received to reset variables if it's been too long
byte slopeTol = 3;//slope tolerance- adjust this if you need
int timerTol = 10;//timer tolerance- adjust this if you need

//variables for amp detection
unsigned int ampTimer = 0;
byte maxAmp = 0;
byte checkMaxAmp;
byte ampThreshold = 30;//raise if you have a very noisy signal

void setup(){
  
  Serial.begin(9600);
  
  pinMode(13,OUTPUT);//led indicator pin
  pinMode(12,OUTPUT);//output pin
  
  cli();//diable interrupts
  
  //set up continuous sampling of analog pin 0 at 38.5kHz
 
  //clear ADCSRA and ADCSRB registers
  ADCSRA = 0;
  ADCSRB = 0;
  
  ADMUX |= (1 << REFS0); //set reference voltage
  ADMUX |= (1 << ADLAR); //left align the ADC value- so we can read highest 8 bits from ADCH register only
  
  ADCSRA |= (1 << ADPS2) | (1 << ADPS0); //set ADC clock with 32 prescaler- 16mHz/32=500kHz
  ADCSRA |= (1 << ADATE); //enabble auto trigger
  ADCSRA |= (1 << ADIE); //enable interrupts when measurement complete
  ADCSRA |= (1 << ADEN); //enable ADC
  ADCSRA |= (1 << ADSC); //start ADC measurements
  
  sei();//enable interrupts
}

ISR(ADC_vect) {//when new ADC value ready
  
  PORTB &= B11101111;//set pin 12 low
  prevData = newData;//store previous value
  newData = ADCH;//get value from A0
  if (prevData < 127 && newData >=127){//if increasing and crossing midpoint
    newSlope = newData - prevData;//calculate slope
    if (abs(newSlope-maxSlope)<slopeTol){//if slopes are ==
      //record new data and reset time
      slope[index] = newSlope;
      timer[index] = time;
      time = 0;
      if (index == 0){//new max slope just reset
        PORTB |= B00010000;//set pin 12 high
        noMatch = 0;
        index++;//increment index
      }
      else if (abs(timer[0]-timer[index])<timerTol && abs(slope[0]-newSlope)<slopeTol){//if timer duration and slopes match
        //sum timer values
        totalTimer = 0;
        for (byte i=0;i<index;i++){
          totalTimer+=timer[i];
        }
        period = totalTimer;//set period
        //reset new zero index values to compare with
        timer[0] = timer[index];
        slope[0] = slope[index];
        index = 1;//set index to 1
        PORTB |= B00010000;//set pin 12 high
        noMatch = 0;
      }
      else{//crossing midpoint but not match
        index++;//increment index
        if (index > 9){
          reset();
        }
      }
    }
    else if (newSlope>maxSlope){//if new slope is much larger than max slope
      maxSlope = newSlope;
      time = 0;//reset clock
      noMatch = 0;
      index = 0;//reset index
    }
    else{//slope not steep enough
      noMatch++;//increment no match counter
      if (noMatch>9){
        reset();
      }
    }
  }
    
  if (newData == 0 || newData == 1023){//if clipping
    clipping = 1;//currently clipping
    Serial.println("clipping");
  }
  
  time++;//increment timer at rate of 38.5kHz
  
  ampTimer++;//increment amplitude timer
  if (abs(127-ADCH)>maxAmp){
    maxAmp = abs(127-ADCH);
  }
  if (ampTimer==1000){
    ampTimer = 0;
    checkMaxAmp = maxAmp;
    maxAmp = 0;
  }
  
}

void reset(){//clean out some variables
  index = 0;//reset index
  noMatch = 0;//reset match couner
  maxSlope = 0;//reset slope
}


void checkClipping(){//manage clipping indication
  if (clipping){//if currently clipping
    clipping = 0;
  }
}


void loop(){
  
  checkClipping();
  
  
  if (checkMaxAmp>ampThreshold){
    frequency = 38462/float(period);//calculate frequency timer rate/period
  
    //print results
    Serial.print(frequency);
    Serial.println(" hz");
  }
  
  delay(100);
  
}

on l'alimentera sous 5v

Si tu donne 5 V à un moteur qui en veut 12

MDP RC170 12V.

Le couple risque de ne pas être follichon; de plus la résistance interne, elle ne changeant pas, le moteur va tirer son intensité nominale.. Il est impératif d'en connaître: Soit la puissance, soit l'intensité sous 12V, pour ne pas dépasser les maximales de la carte.

J'ai mentionné dans la première page les caractéristiques du moteur

bon on reste sur le servo alors
où peut on trouver un servomoteur multi tour ou ceux qui font un tour complet

Concernant le code pour la détection de la fréquence qu'en pensez vous?

J'ai mentionné dans la première page les caractéristiques du moteur

Sur la première page, il n'y a ni puissance ni intensité (il faut l'une ou l'autre).

bon on reste sur le servo alors

L'option "servo" ne t'exonère pas d'un bilan de conso/puissance, because: Le servo devra avoir la même puissance que le moteur, puisqu'il est sensé obtenir le même résultat sur la même clé.