Probléme d'accélérométre

salut ! j'utilise dans mon code arduino l'accélérométre ADXL335 pour la detection d'un accident
j'ai définit la valeur minimale acceptable pour les lectures d'accélération sur chaque axe (#define minVal -120
) càd Si les valeurs lues sont inférieures à cette limite, elles seront considérées comme anormales et indiqueront la détection d'un accident. et la valeur maximale acceptable (#define MaxVal 120)
le probléme c'est quand je marche a une vitesse constante et sans changer de direction, l'accélération change


alors que le capteur n'indiquera pas la vitesse de marche, quels que soient les calculs mais dans ma situation il indique .c'est quoi le probléme ??
voici le code complet

#include<SoftwareSerial.h>
#include<LiquidCrystal_I2C.h>
#include<TinyGPS.h>

SoftwareSerial gsm(11,12); //make RX arduino line is pin 2, make TX arduino line is pin 3.
SoftwareSerial gps(2,3);

LiquidCrystal_I2C lcd(0x27,16,2);
TinyGPS inf;
#define x A0
#define y A1
#define z A2

const int ENA = 10;   // Broche de vitesse moteur 1
const int IN1 = 8;   // Broche de direction moteur 1
const int IN2 = 7;   // Broche de direction moteur 1
const int IN3 = 6;   // Broche de direction moteur 2
const int IN4 = 5;   // Broche de direction moteur 2
const int ENB = 9;   // Broche de vitesse moteur 2


int xsample=0;
int ysample=0;
int zsample=0;

#define samples 10
#define minVal -120
#define MaxVal 120


float latitude;
float longitude;                        


void initModule(String cmd, char *res, int t)
{
  while(1)
  {
    Serial.println(cmd);
    gsm.println(cmd);
    delay(100);
    while(gsm.available()>0)
    {
       if(gsm.find(res))
       {
        Serial.println(res);
        delay(t);
        return;
       }
       else
       {
        Serial.println("Error");
       }
    }
    delay(t);
  }
}
void setup()

{
  Serial.begin(9600);
  gsm.begin(9600);
   pinMode(ENA, OUTPUT);
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(ENB, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  lcd.init();  
  lcd.backlight();
  lcd.setContrast(100);
  lcd.print("Accident Alert  ");
  lcd.setCursor(0,1);
  lcd.print("     System     ");
  delay(2000);
  lcd.clear();
  lcd.print("Initializing");
  lcd.setCursor(0,1);
  lcd.print("Please Wait...");
  delay(1000);  
 
  Serial.println("Initializing....");
  initModule("AT","OK",1000);     //AT commande ,réponse,delay
  initModule("AT+CPIN?","READY",1000);   //indication que le SIM est prêt
  initModule("AT+CMGF=1","OK",1000);     //Configuration du message en mode texte
  initModule("AT+CNMI=2,2,0,0,0","OK",1000);  
  Serial.println("Initialized Successfully");
 
  lcd.clear();
  lcd.print("Initialized");
  lcd.setCursor(0,1);
  lcd.print("Successfully");
  delay(2000);
  lcd.clear();
  lcd.print("Acceleromiter");
 
  for(int i=0;i<samples;i++)
  {
    xsample+=analogRead(x);
    ysample+=analogRead(y);
    zsample+=analogRead(z);
  }

  xsample/=samples;
  ysample/=samples;
  zsample/=samples;

  Serial.println(xsample);
  Serial.println(ysample);
  Serial.println(zsample);
  delay(1000);

 
  lcd.clear();
  lcd.print("GPS DATA ");
  lcd.setCursor(0,1);
  lcd.print("   Loading..    ");
  delay(2000);
  gps.begin(9600);
  encode_gps();
  coordinate();
  delay(2000);
  lcd.clear();
  lcd.print("GPS is Ready");
  delay(1000);
  lcd.clear();
  lcd.print("System Ready");
  Serial.println("System Ready..");
  Serial.println("Mouvement vers l'avant");
}
void loop()
{
 
  moveForward();
 
    int value1=analogRead(x);
    int value2=analogRead(y);
    int value3=analogRead(z);

    int xValue=xsample-value1;
    int yValue=ysample-value2;
    int zValue=zsample-value3;

    Serial.print("x=");
    Serial.println(xValue);
    Serial.print("y=");
    Serial.println(yValue);
    Serial.print("z=");
    Serial.println(zValue);
   

    if(xValue < minVal || xValue > MaxVal  || yValue < minVal || yValue > MaxVal  || zValue < minVal || zValue > MaxVal)
    {
      stopRobot();
      coordinate();
      encode_gps();
      Serial.println("Accident detected");
      lcd.clear();
      lcd.print("Accident detected");
      delay (2000);
      lcd.clear();
      lcd.print("  Sending SMS ");
      Serial.println("Sending SMS");
      Send1();
      Serial.println("SMS Sent");
      delay(2000);
      lcd.clear();
      lcd.print("   SMS sent");
   
    }      
}

Tri utilises quelle carte Arduino ?
J'ai posté un exemple avec un ESP32 ici

Pour ton problème, il faut nous en dire plus. Il semble que soit pour un robot. Mais que veux-tu faire exactement ?

Un accéléromètre ne fournit pas une vitesse mais une accélération. Si tu veux en déduire une vitesse, il suffit a priori d'intégrer cette donnée sur le temps, mais ça amplifie le bruit et ce n'est pas facile d'obtenir une information fiable.

Pour un robot à roulettes, il est plus simple de compter des tours de roues pour calculer la vitesse.

j'utilise une carte arduino uno
et l'accéléromètre pour la detection de choc lors d'un accident d'une véhicule

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.