Interférences entré analogic

Bonjour a tous !

Tout d'abord j'explique un peut mon projet cela permettra de cerné un peut mieux ce que je veut faire.

C'est donc ce que l'on appelle un "shifter", que j'ai déjà partiellement conçu, cela permet de passer les rapport d'une moto sans débrayé ni même coupé les gazes grâce a une coupure de l'allumage pendant un temps donné en millisecondes provoqué par ce dit système par l’intermédiaire du coupe circuit.

J'ai déjà une bonne partie de faite surtout en ce qui concerne le montage et les essaies dans la pratique qui sont concluent.

Je préscise que j'utilise un Arduino uno ch328 (a en croire le modèle fonctionnant avec mon telephone sur arduinodroid).

Ce que je cherche a faire c'est faire varier le temps de coupure via un potentiomètre en divisant la valeur de 0/1023 en quelques parties correspondant chacune a un temps de coupure respectif.

Je donne mon code pour illustrer :

int ledPin = 13 ;     
int pot = A0;  


void setup() {
 pinMode (ledPin, OUTPUT);
 pinMode (pot,INPUT);
}

void loop() {

if (analogRead(pot)>= 200 && analogRead(pot) < 500)   //ici le premier bloc corespondant a un temps de coupure.
{
 digitalWrite (ledPin, HIGH); 
  delay(100);                 //ici le délais a appliqué provoquant la coupure.
 digitalWrite(ledPin, LOW);
            delay(100);       
            
if (analogRead(pot)>= 500 && analogRead(pot) < 1023)  //ici le deuxième bloc pour un temp différent.
{
 digitalWrite (ledPin, HIGH);
  delay(1000);
 digitalWrite(ledPin, LOW);
            delay(100);
}
}

Le problème que je rencontre, je pense, intervient au niveau du potentiomètre et de la valeur analogique reçu par l'arduino.

Ce qui ce passe c'est que ma led de test passe d'un temps de coupure a un autre anarchiquement ou presque (quand je pose les doigts sur le potentiomètre cela change), j'ai beau tourner le potar dans tout les sens rien ni fait.

J'ai essayer de mettre une résistance 10k entre la borne A0 et la GND comme sur mon premier montage simple qui n’intègre pas de potentiomètre, avec le quel je précise j'avait un problème semblable (mon dispositif ce déclenchait anarchiquement rien qu'en touchant les files), cette action avait donc résolu le problème.

Seulement sur mon nouveau montage même en changeant la valeur de la résistance (10k, 100k, 4.7k) na rien fait si ce n'est arrêter le loop qui fait bliké la led.

C'est ici que mes compétences et recherches sur le net trouvent leur limites.

Si toute fois il advient que ce sujet fut déjà traité sur le forum et ai échapper a mes recherches merci de me l'indiquer, je supprimerait alors mon poste.

Bonne soirée/journée a tous !

orionwayfarer:
de cerné un peut mieux ce que je veut faire.

C'est donc ce que l'on appelle un "shifter", que j'ai déjà partiellement conçu, cela permet de passer les rapport d'une moto sans débrayé ni même coupé les gazes grâce a une coupure de l'allumage pendant un temps donné en millisecondes provoqué par ce dit système par l’intermédiaire du coupe circuit.
...

Je préscise que j'utilise un Arduino uno ch328 (a en croire le modèle fonctionnant avec mon telephone sur arduinodroid).

Bonsoir
Il y a eu une discussion concernant les shifters ici
c'est peut être à lire pour toi .

Arduino uno ch328 , je ne vois pas bien ce que c'est exactement , photos ?

Bonjour Artouste, effectivement le sujet dont tu ma communiqué le lien parle bien de shifter moto, seulement ils n'ont abordé que de loin le sujet et parlent principalement de capteur "piedzo", ce capteur étant absent de mon montage car le type de sélection sur mon 50cc a boite est différent de celui d'une moto de piste (comme dans ce sujet), de plus l'usage que j'en fait ne nécessite pas un tel montage montage.

Mon questionnement est comment passer outre ce problème d'interférence d'ordre "électrostatique où autre" au niveau de mon entré analogique.

J'ai comme l'impression que c'est un problème que tout débutant rencontre et que c'est tellement simple et évident que personne n'en parle.

Artouste:
Arduino uno ch328 , je ne vois pas bien ce que c'est exactement , photos ?

Je joint une photo de l'Aduino que j'utilise ce sera plus simple, je pense que c'est un "UNO" mais une copie chinoise que j'ai trouver a 9€ sur Amazon.

"Edit" ma photo ne marche pas je met donc le lien ici.

  • expliquez comment vous avez câblé le potentiomètre sur A0?

normalement vous avez 3 pins, un côté sur 5V, l'autre côté sur GND et le milieu sur A0

  • Votre code est mal fichu - faites un ctrl-T dans l'IDE et vous verrez que le premier if ne se ferme pas là où il devrait. Indenter proprement son code aide à trouver ce genre de pbs. Vous pouvez aussi utiliser un else pour ne pas faire le second test si le premier test était vrai

  • sur le code vous devriez lire qu'une seule fois analogRead(pot) et mettre le résultat dans une variable [color=blue]potVal[/color] pour faire ensuite vos tests d'intervalle

  • pinMode (pot, INPUT); n'est pas nécessaire, c'est déjà le cas par défaut

  • pour des raisons de cohérence pot devrait s'appeler potPin

  • (&& [color=blue]potVal[/color] < 1023) n'est pas nécessaire dans le second test puisque votre analogRead sera toujours inférieur à 1023

essayez comme cela

const byte ledPin = 13 ;
const byte potPin = A0;

void setup()
{
  pinMode (ledPin, OUTPUT);
}

void loop()
{
  int potVal = analogRead(potPin); // entre 0 et 1023

  if (potVal >= 200 && potVal < 500) { //ici le premier bloc corespondant à un temps de coupure.
    digitalWrite (ledPin, HIGH);
    delay(100);                 //ici le délai à appliquer provoquant la coupure.
    digitalWrite(ledPin, LOW);
    delay(100);
  } else if (potVal >= 500) { //ici le deuxième bloc pour un temps différent.
    digitalWrite (ledPin, HIGH);
    delay(1000);
    digitalWrite(ledPin, LOW);
    delay(100);
  } else {
    // éventuellement faire quelque chose si < 200
  }
}

Merci beaucoup J-M-L pour cette réponse complète et précise, ainsi que le travail sur le code !

Après avoir téléversé le code que vous m'avez donner j'ai vérifier le montage de mon potentiomètre, la seul différence avec le schéma ci-dessus est que la masse et le +5v sont inversé.

Dans cette configuration la sélection du délai est toujours aléatoire et influençable lors ce que je touche le potentiomètre ou que j'en approche ma main.

J'ai donc essayé d'inversé les polarités du potentiomètre de façon a reproduire le montage du schéma ci-dessus, j'obtient l'extinction total de la led et ce indépendamment de la plage du potentiomètre choisit.

Le même phénomène ce produit lors ce que je soude une résistance 10k directement a la board entre la pine GND et A0.

J'avait utilisé ce type de montage sur la première version du shifter (plus simple car ne contenait pas de fonction de modification de delay), cela avait eu pour effet de solutionné le problème similaire d'interférences que j'avais rencontrer.

Pour finir j'ai finalement essayé de débrancher totalement le potentiomètre, malgré cela le phénomène persiste et ne cesse qu'avec la résistance 10k soudé a la board.

Bonne journée et bonnes fêtes à tous !

Valeur du potentiomètre?
Les perturbations, c'est sur table ou une fois monté sur la moto?

fdufnews:
Valeur du potentiomètre?
Les perturbations, c'est sur table ou une fois monté sur la moto?

Mon potentiomètre est un 10k.

Je fait mes essaies sur table devant mon pc, certes c'est pas très adapté.

Je n'est pas encore essayé sur la machine mais je doute que cela change quelque chose le problème risque d'être amplifier avec la longueur des fils, de plus j'ai rencontrer le même problème lors de mon premier montage :

orionwayfarer:
J'avait utilisé ce type de montage sur la première version du shifter (plus simple car ne contenait pas de fonction de modification de delay), cela avait eu pour effet de solutionné le problème similaire d'interférences que j'avais rencontrer.

Je vais essayé avec un potentiomètre plus gros voir ce que cela donne !

Merci pour l'idée fdufnews !

hello
es tu sur de ton potar? en inversant le 5V et GND aux bornes de la résistance de 10 K que constitue ton potar, il n'y a pas de raison que le comportement change.

c'est bien le point milieu( curseur) du potar que tu raccordes à A0?

je testerai un filtre passe bas en ajoutant un condo entre GND et A0.

Essayez un bête code d'affichage de la valeur lue :

void setup() {
  Serial.begin(115200);  //  serial communication à 15200 bauds
}

void loop() {
  int potVal = analogRead(A0);
  Serial.println(potVal);
  delay(1);
}

Tant que ça ne fonctionne pas, pas la peine d'aller plus loin

orionwayfarer:
Je vais essayé avec un potentiomètre plus gros voir ce que cela donne !

Euh!! je ne pensais pas à un potentiomètre plus gros. Au contraire. Plus tu vas augmenter la valeur du potentiomètre plus tu seras sensible aux perturbations.
Maintenant, il y a des précautions à prendre:

  • filtrer l'alimentation aux bornes du potentiomètre
  • tiliser un câble blindé pour passer le signal mesuré
  • filtrer le signal à l'entrée de l'arduino

hello
il n'y a pas une histoire de condo à rajouter sur Aref?

Bonjour a tous ! Après un petit temps d'absence je suis de retour !

Je vient d’essayer la lecture du signal seulement cela me donne quelque chose de très différent de la belle courbe obtenue lors d'une expérimentation ultérieur. Ce que m'affiche le traceur série me semble bizarre, voici un extrait : ÿÿÿþüûÿøøûúýüþüýÿþþÿ

J-M-L:
Essayez un bête code d'affichage de la valeur lue :

void setup() {

Serial.begin(115200);  //  serial communication à 15200 bauds
}

void loop() {
  int potVal = analogRead(A0);
  Serial.println(potVal);
  delay(1);
}



Tant que ça ne fonctionne pas, pas la peine d'aller plus loin

Mon potentiomètre est brancher correctement la pin du milieu sur A0. J'avais mal observer lorsque je disait qu'en inversant les alimentation la led cessait de s'allumer (sans doute due au caractère aléatoire du phénomène).

J'ai aussi essayer le condo (0.47uf/50v) entre GND et A0 et le changement de fréquence est toujours aléatoire et la led a plus tendance a s’éteindre quand je ne touche pas le potard avec mes doigts.

dfgh:
hello
es tu sur de ton potar? en inversant le 5V et GND aux bornes de la résistance de 10 K que contitue ton potar, il n'y a pas de raison que le comportement change.

c'est bien le point milieu( curseur) du potar que tu raccordes à A0?

je testerai un filtre passe bas en ajoutant un condo entre GND et A0.

La solution du filtre passe bas a l'alim et entre A0 et le potard n'a pas fonctionner non plus, montage réalisé tel que :5V > R4.7 >condo 0.47uf/50v > pot100k > R4.7 > condo 0.47uf/50v.

Malheureusement je n'est pas de câble blindé sous la main pour tester, je pense que cela pourrait diminuer le phénomène, seulement il resterait tout les autres composants qui ne sont pas protégé qui ferai antenne.

fdufnews:
Euh!! je ne pensais pas à un potentiomètre plus gros. Au contraire. Plus tu vas augmenter la valeur du potentiomètre plus tu seras sensible aux perturbations.
Maintenant, il y a des précautions à prendre:

  • filtrer l'alimentation aux bornes du potentiomètre
  • tiliser un câble blindé pour passer le signal mesuré
  • filtrer le signal à l'entrée de l'arduino

Ce qui me vient sur l'instant est :

Pour quoi dans mon premier montage sans mesure d'un potentiomètre j'ai réussit à solutionner le problème avec cette résistance 10k entre GND et A0 ?

Je donne pour exemple le code (certes surement très aléatoire dans son écriture) présent dans la carte monté et fonctionnant sur ma machine dans les disposition cité ci dessus.

int inputPin = A0;
int outputPin = 13;
int inputState;
int previousState =  (0.0 / 1023.0);

void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);
}

// the loop routine runs over and over again forever:



void loop() {
  // read the input on analog pin 0:

  
  int sensorValue = analogRead(A0);

  
  
 if ( float voltage = sensorValue * (5.0 / 1023.0));
 
 digitalWrite (outputPin, HIGH);
delay(40);
   digitalWrite(outputPin, LOW);
   delay(500);
}

J'ai comme une vague impression que dans mon code avec potentiomètre ce sont les valeurs a interprété qui ne sont pas bien choisit.

Connaissez vous un moyen de filtré les infos dans l'arduino plus tôt que en amont ?

votre console est-elle réglée à 115200??

  Serial.begin(115200);  // [color=red] serial communication à 115200 bauds[/color]

Il me semble avoir lu sur ce forum que l'acquisition de valeur analogiques posait quelques problèmes.

La solution serait de lire une fois la valeur de l'entrée analogique, d'ignorer cette valeur et de relire une seconde fois la même entrée. Il est même possible de lire plusieurs fois la même entrée et de calculer la moyenne.

ci-joint un bout de code permettant de faire ça

int averageAnalogRead(int pin, bool drop_first, int n) {
  float sum=0;
  int   analog_value, i;

  if(drop_first) {
    // Lire une premiere fois et ne pas utiliser le resultat
    analog_value=analogRead(pin);
  }
  // Lire plusieurs fois, faire le total
  for(i=0; i<n; i++) {
    analog_value=analogRead(pin);
    sum+= (float) analog_value;
  }
  // Retourner la moyenne
  return((int) (sum/(float) n));
}

pour tester

#include <arduino.h>
int averageAnalogRead(int pin, bool drop_first, int n);

void setup() {
  Serial.begin(9600);
}

void loop() {
  int analog_value;

  analog_value=averageAnalogRead(A0, true, 3);
  Serial.print("averageAnalogRead="); Serial.println(analog_value);
}

int averageAnalogRead(int pin, bool drop_first, int n) {
  float sum=0;
  int   analog_value, i;

  if(drop_first) {
    // Lire une premiere fois et ne pas utiliser le resultat
    analog_value=analogRead(pin);
  }
  // Lire plusieurs fois, faire le total
  for(i=0; i<n; i++) {
    analog_value=analogRead(pin);
    sum+= (float) analog_value;
  }
  // Retourner la moyenne
  return((int) (sum/(float) n));
}

Note : ne pas mettre à 0 le dernier argument d'appel à la fonction averageAnalogRead, ce qui provoquerait une erreur de division par zero

Bonsoir a tous !

Après avoir essayer les solutions de J-M-L et de Alain46 sans succès, j'ai penser autrement mon système.

J'ai finalement décider de remplacer mon potentiomètre par un commutateur rotatif, ce qui me permet de déterminé quel valeur de coupure utilisé via les différentes entrées analogiques.

Un ami m'a aider a coder un sketch fonctionnel que voici :

const byte ledPin = 12;
const byte sensorPin = A0;
int delays[5] = { 100, 300, 500, 700, 1000 };

void setup()
{
  pinMode (ledPin, OUTPUT);
  pinMode (sensorPin, INPUT);
}

void loop()
{
  int pin = getPin();
  if (pin >= 0)
  {
   
    digitalWrite (ledPin, HIGH);
    delay(delays[pin]);
    
    digitalWrite(ledPin, LOW);
    delay(500);
  }
}

int getPin()
{
  for(int i = 0; i < 6; i++)
  {
    if (analogRead(i) > 1000)
      return i;
  }
  return -1;
}

N'hésitez pas a me donner vos avis !

J'attend ma commande d'arduino nano ainsi que des commutateurs pour finalisé mon montage !

J'en viendrait probablement un jour a faire une version pour gros cube avec des temps variables selon les tours/minutes.

Bonne soirée a vous et encore merci a toutes les personnes m'ayant aider a avancer dans ce projet.