Go Down

Topic: entrée analogue trop changeante (Read 3020 times) previous topic - next topic

karistouf

hum... je suppose qu'il s agit ici encore d un truc très simple... et que je fais le tour des grands classiques  du newbie ;D

mon souci est le suivant:
j ai des potentiomètres de 10kohms.

je fais un envoi de leur valeur depuis arduino vers le pc quand il y a un changement de valeur, en comparant la valeur précédemment envoyée et la valeur actuelle.
hors, celle ci fluctue tout le temps, saturant l envoi vers le port série sur usb.
j ai bien vu l exemple ici présent: http://www.arduino.cc/en/Tutorial/Smoothing
seulement il consomme beaucoup de ressources dès que généralisé à plus d'un analogue.

j ai un peu plus de stabilité en divisant les valeurs par 8 ( échelle 0-127), mais j aurais préféré rester sur une base 0-255 au minimum ( /4), à défaut de bénéficier du 0-1023  :(.

Y a t il un moyen de nettoyer ou filtrer ou atténuer électroniquement la sortie des valeurs des ces potentiomètres ?
bref, d'arrondir et lisser leur réponse électrique ?

Certaines positions sur les potentiomètres fluctuent tout le temps ( pb de contact ou de qualité ?)

voilà pour la nouvelle question du jour !

Gozaki

un petit filtrage RC avec la frequence de coupure qui va bien....

Gozaki
-----------------------------
www.laboelectronique.be

karistouf

#2
Sep 01, 2010, 03:34 pm Last Edit: Sep 01, 2010, 03:37 pm by karistouf Reason: 1
oh grand gozaki, tout celà est très ésotérique: je suis une bille total en électronique ... un petit schéma ou un tuto quelque part ? un lien ? ;D

j ai bien rajouté des variables pour rafraichir l envoi uniquement au bout de X millisecondes, mais c est pas très glop. du coup oui, une solution électronique simple qui permette de garder la plage de valeurs en 0-1024 serait hachement bien ;-)

B@tto

C'est pas normal que cela fluctu autant ... au pire ça varie de +/- 1 sur la la plage 0-1023. Peux-tu nous donner ton code et ton montage ?
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

ant.b

Slt,
le plus simple serait peut-être de mettre en place un paramètre x=10 par ex.

Si ta nouvelle valeur est supérieure à [ancienne valeur] +x ou inférieure à [ancienne valeur] - x alors tu la prends en compte et tu mets à jour [ancienne valeur],
sinon tu ne fais rien.

karistouf

oui je suis d accord que ce n est pas tres normal.
sous d autres softs ces fluctuations arrivent mais c est généralement des problèmes quand on fait du tracking sur une image vidéo.
où les pixels fluctuent beaucoup.
mais avec un potentiometre !

voilà le code sous arduino.
Actuellement je demande la lecture de l entrée analo 0 uniquement.
Sa variation est de +1 à +2 parfois.
j ai retiré du code la partie hand-shaking avec le byte d ammorcage d une réponse. dans le moniteur le potentiomètre varie tout le temps.

coté montage c est vraiment ce qu il y a de plus simple: Le Gnd à la patte basse du potentiometre, le 5v à la patte haute et l analogue pour la lecture à la patte du milieu.


Code: [Select]

//definitions
const int BAUDRATE=9600;
const int NBR_ANALOG=6;
const int NBR_DIGITAL=13;//(les deux premieres pins associées au tx rx en serie)
//communication
int inByte=0;

//création d'un tableau de définition pour les I/O
bool digital_is_output[NBR_DIGITAL];
bool allow_analog_read[NBR_ANALOG];
//tableaux de stockage des valeurs reçues en input
int buffer_analog[NBR_ANALOG];
int old_buffer_analog[NBR_ANALOG];
bool buffer_digital[NBR_DIGITAL];
bool old_buffer_digital[NBR_DIGITAL];

/////////////////////////////////////////////////////////////////
void aquire_arduino()
{

//digitales///////////////////
for(int i=2;i<NBR_DIGITAL;i++)//on zappe les états de TX RX en pins 0 et 1
{
//si le digital est une entrée et pas les leds tx rx on lit et on stocke
if(digital_is_output[i]==0 )
  {
   old_buffer_digital[i]=buffer_digital[i];
   buffer_digital[i]= digitalRead(i);
   if(old_buffer_digital[i]!=buffer_digital[i])
   {
    Serial.print("DIG/");
    Serial.print(i);
    Serial.print("=");
    Serial.print(buffer_digital[i]);
    Serial.println("/");
   }
 }
}
//analogues////////////////////
for(int i=0;i<NBR_ANALOG;i++)//on zappe les états de TX RX en pins 0 et 1
 {

  if(allow_analog_read[i]==1)//si on autorise la lecture de cet analog
  {
   old_buffer_analog[i]=buffer_analog[i];
   int temp_val=analogRead(i);
   
   buffer_analog[i]=  temp_val;
    if(old_buffer_analog[i]!=buffer_analog[i])
   {
    Serial.print("ANG/");
    Serial.print(i);
    Serial.print("=");
    Serial.print(buffer_analog[i]);
    Serial.println("/");
 
   }
 }
 }
}

/////////////////////////////////////////////////////////////////
void setup()
{
Serial.begin(BAUDRATE);

//votre définition des pins à mettre en OUTPUT
digital_is_output[9]=1;
digital_is_output[10]=1;
digital_is_output[11]=1;
//autorisation de lecture des analogues
allow_analog_read[0]=1;
//INITIALISATION DES ON/OFF
for(int i=2; i<NBR_DIGITAL; i++)//on zappe les états de TX RX en pins 0 et 1
{
if(digital_is_output[i]==1){pinMode(i,OUTPUT);}
else {pinMode(i,INPUT);}
}
}
/////////////////////////////////////////////////////////////////
void loop()
{

/* if (Serial.available() > 0)
{
inByte=Serial.read();
if(inByte==147)//valeur ordre depuis white cat
{*/
   aquire_arduino();
//  }
//}

}




en tout cas merci de vos réponses  :)

fdufnews

Quote
Sa variation est de +1 à +2 parfois.

C'est plutôt standard. La doc donne de 2 à 4,5 LSB suivant la fréquence d'horloge du convertisseur analogique numérique.

karistouf

ok. donc la variation continue de son état est "normale". il suffit donc de mettre un paramètre de variation.
merci !

Gozaki

je voulais dire : une resistance entre ton potentiometre et ton entrée analogique et un condensateur entre l'entrée analogique et la masse.

La résistance et le condensateur forment un filtre passe-bas qui couperont les hautes fréquences. Plus la valeur du condensateurs et/ou de la résistances est élevée plus tu atténues les fréquences supérieures à la fréquence de coupure. La fréquence de coupure vaut 1/(2*PI*R*C).

généralement on prend un condensateur de type céramique

Gozaki
----------------------------
www.laboelectronique.be

karistouf

#9
Sep 01, 2010, 10:59 pm Last Edit: Sep 01, 2010, 11:00 pm by karistouf Reason: 1
merci gozaki de ces precisions.
generalement, on met quelle "puissance" de condensateur avec des potentiomètres en 10Kohms ?

sinon, la technique du >old_value+1 <old_value-1 fonctionne tres bien. plus de surcharge d envois sur le port serie!

j ai une question de TRES TRES newbie:
je viens de voir que arduino toournait à deux cadences ( 8 ou 16Mhz), fonction de l alim et sur batterie ou pas.
Si une config marche en 16, faut il diviser par deux la vitesse des Bauds pour avoir des reactions identiques en 8 ? ou bien ne s agit il que d une question de rapidité d execution de la boucle principale ?

fdufnews

Quote
Si une config marche en 16, faut il diviser par deux la vitesse des Bauds pour avoir des reactions identiques en 8 ?

C'est pris automatiquement en charge si tu choisis dans l'IDE un type de carte fonctionnant à 8MHz

karistouf

ok.merci et merci à tous pour le coup de palluche ;-)

flyaway

Quote
coté montage c est vraiment ce qu il y a de plus simple: Le Gnd à la patte basse du potentiometre, le 5v à la patte haute et l analogue pour la lecture à la patte du milieu.


salut,

Je me trompe ou c'est une super facon de mettre l'alim en court-circuit quand le potar est en butée d'un coté???

@+ ;)

karistouf

hello, hum.... perso je suis une bille en électronique, mais oui, là je peux l'affirmer !!!  tu te trompes  ;D  ;D ;D

Luj06

Je n'ai pas vu la réponse, donc je donne la valeur de C que j'ai utilisé : 10 µF (http://www.pobot.org/Filtrer-un-signal-analogique.html)

Go Up