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é.
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°.
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é.
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
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);
}
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
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é.