problème de carte (ou de code?).

Bonjour à tous :slight_smile: ,

voila j'ai un projet qui est de pouvoir contrôler ma souris a l'aide d'un accéléromètre sur une carte léonardo.

rien de bien compliqué en sois sauf que je tombe sur un problème. en effet dans mon programme, je demande à l'utilisateur de pointer l'accéléromètre vers le centre de l'écran afin de définir la position zéros et d'appuyer sur un bouton (ici j'avais la flemme de mettre un bouton pour le test alors j'ai mis un fils dû +5v au digital pin 5) afin de stocker la valeur, et, par la suite de pointer les coins afin de connaitre les conditions limites.

en sois rien de bien méchant sauf que dès que je réalise un contact entre +5v et pin5, l'action s’exécute en boucle plusieurs fois d'affiler (alors qu'il n'y a plus de contact) avant de s’arrêter. tout ce passe comme si le 5v était toujours maintenu sur le pin 5 alors que rien n'y est branché. de plus si je bouge un peu la carte elle lance toute seule la procédure la encore comme si elle détecter 5v sur sont pin 5.

j'ai donc changé de carte et j'ai essayé sur une uno et une mega et le problème est toujours la. personnellement je ne vois pas comment le problème peut venir du code (mais bon je ne suis pas un pro non plus) j'ai donc tenté de brancher un oscilloscope sur ce pin 5 et là, comme pour me narguer, ça fonctionne. j'en ai donc déduit qu'il devait y avoir une capacité quelque part qui stocke le 5v quand il y a contact et qui se décharge quand il n'y a plus contacte et j'ai donc mis une résistance du pin 5 au ground et ça arrange pas mal le problème.

cependant ma question est pourquoi ça agit de la sorte :roll_eyes: ? y a t-il un condensateur dans les entrées/sorties du microcontrôleur (ou plutôt des puisque j'ai utilisé plusieurs cartes) qui pourrait expliquer cela? et pourquoi quand je bouge la carte il peut se mettre à détecter du 5v alors que rien n'y est branché? je précise que je bouge la carte dans le vide (ou plutôt l'aire) il n'y a donc pas de cour circuit possible via une quelconque surface de contact.

#include "Wire.h"  // Arduino Wire library
#include "I2Cdev.h"  //Installer ces 2 librairies
#include "MPU6050.h"
//#include <Mouse.h>

MPU6050 accelgyro;

int16_t ax, ay, az;  //mesures brutes
int16_t gx, gy, gz;

int i=0;

double ax_moy, ay_moy, az_moy;  
double gx_moy, gy_moy, gzv;
double ax0, ay0, az0, ax1, ay1, az1, ax2, ay2, az2, ax3, ay3, az3, ax4, ay4, az4;

void setup() {
    Wire.begin();  //I2C bus
    Serial.begin(9600);  
     //Serial.begin(38400);

   
    Serial.println("Initialisation I2C...");
    accelgyro.initialize();
    pinMode(5, INPUT);

    // verify connection
    //Mouse.begin();
}

void loop() {
 
    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
    ax_moy = ax;
   

    
    Serial.print("pointez le centre de l'écran et appuyez sur le bouton");
    
    while(digitalRead(5)== LOW){
      
    }
    i=0;
    while(digitalRead(5) == HIGH){ //cette boucle est justement faite pour que le programme ne passe pas a l'étape suivante a cause du problème
   ax0=ax;
   ay0=ay;
   az0=az;
   Serial.print(ax0);
   Serial.print('\t');
   Serial.print(ay0);
   Serial.print('\t');
   Serial.print(az0);
   i++;
   Serial.print('\t');
   Serial.print("i= ");Serial.print(i);
    }
    //Mouse.move(0,0,0);
    Serial.print("pointez le coin haut droit de l'écran et appuyez sur le bouton");
    
    while(digitalRead(5)== LOW){
      
    }
  while(digitalRead(5) == HIGH){
   ax1=ax;
   ay1=ay;
   az1=az;
   Serial.print(ax1);
   Serial.print('\t');
   Serial.print(ay1);
   Serial.print('\t');
   Serial.print(az1);
  }
  //Mouse.move(100,100,0);
Serial.print("pointez le coin bas droit de l'écran et appuyez sur le bouton");
    
    while(digitalRead(5)== LOW){
      
    }
while(digitalRead(5) == HIGH){
   ax2=ax;
   ay2=ay;
   az2=az;
   Serial.print(ax2);
   Serial.print('\t');
   Serial.print(ay2);
   Serial.print('\t');
   Serial.print(az2);
}
   Serial.print("pointez le coin haut gauche de l'écran et appuyez sur le bouton");
    
    while(digitalRead(5)== LOW){
      
    }
while(digitalRead(5) == HIGH){
   ax3=ax;
   ay3=ay;
   az3=az;
   Serial.print(ax3);
   Serial.print('\t');
   Serial.print(ay3);
   Serial.print('\t');
   Serial.print(az3);
}
Serial.print("pointez le coin bas gauche de l'écran et appuyez sur le bouton");
    
    while(digitalRead(5)== LOW){
      
    }
while(digitalRead(5) == HIGH){
   ax4=ax;
   ay4=ay;
   az4=az;
   Serial.print(ax0);
   Serial.print('\t');
   Serial.print(ay0);
   Serial.print('\t');
   Serial.print(az0);
}

   
  
    

    

}

Bonjour,

Une entrée en l'air peut prendre n'importe quelle valeur. Il faut que tu mettes une résistance de pull down.
Ou alors utiliser le pullup interne avec INPUT_PULLUP.

ça marche merci :slight_smile: ,

en effet je ne connaissais pas INPUT_PULLUP et c'est plutôt sympa haha. mais au final comment ça ce fait que ces entrées peuvent prendre n'importe quelle valeur. je comprend bien qu'il y a du bruit électromagnétique partout mais j'imagine que si il y a un parasite, le problème vas être ponctuel alors que là, il pouvait rester plusieurs secondes sur l'état haut m'obligeant au passage à rajouter des boucles while pour être sur que le programme ne sèche pas des étapes

Ce sont des entrées cmos qui présentent une petite capacité et une résistance très élevée, donc il n'est pas anormal qu'elles gardent la charge pendant un certain temps lorsqu'elles sont en l'air.

merci de t'as réponse :slight_smile: