Pages: [1] 2   Go Down
Author Topic: entrée analogue trop changeante  (Read 2760 times)
0 Members and 1 Guest are viewing this topic.
FRANCE
Offline Offline
Sr. Member
****
Karma: 0
Posts: 338
Arduino rocks .... oulalalalala
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-sad.

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 !
Logged

Belgium
Offline Offline
Jr. Member
**
Karma: 1
Posts: 80
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

FRANCE
Offline Offline
Sr. Member
****
Karma: 0
Posts: 338
Arduino rocks .... oulalalalala
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ;-)
« Last Edit: September 01, 2010, 08:37:04 am by karistouf » Logged

Ales
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3735
Do or DIY
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged


France
Offline Offline
Newbie
*
Karma: 3
Posts: 13
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

FRANCE
Offline Offline
Sr. Member
****
Karma: 0
Posts: 338
Arduino rocks .... oulalalalala
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
//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  smiley
Logged

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3612
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

FRANCE
Offline Offline
Sr. Member
****
Karma: 0
Posts: 338
Arduino rocks .... oulalalalala
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Belgium
Offline Offline
Jr. Member
**
Karma: 1
Posts: 80
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

FRANCE
Offline Offline
Sr. Member
****
Karma: 0
Posts: 338
Arduino rocks .... oulalalalala
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
« Last Edit: September 01, 2010, 04:00:28 pm by karistouf » Logged

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3612
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

FRANCE
Offline Offline
Sr. Member
****
Karma: 0
Posts: 338
Arduino rocks .... oulalalalala
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Newbie
*
Karma: 0
Posts: 22
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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é???

@+ smiley-wink
Logged

FRANCE
Offline Offline
Sr. Member
****
Karma: 0
Posts: 338
Arduino rocks .... oulalalalala
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Sophia-Antipolis (06)
Offline Offline
God Member
*****
Karma: 4
Posts: 618
Rejoignez le club !
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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)
Logged

Pages: [1] 2   Go Up
Jump to: