Probleme mit Beschleunigungssensor

Hallo Zusammen.

Ich benutze für ein Projekt den Beschleunigungsensor FXLS8967AF-2999230 mit dem Aufbau "Figure 19" auf Seite 81 des Datenblattes.

Des weiteren benutze ich die Bibliothek FXLS89xx_Arduino um diesen Sensor mit Arduino zu verwenden.

Ich möchte ein Programm erstellen, das es mir ermöglicht beim Überschreiten eines bestimmten Beschleunigungswertes, d.h. wenn das Teil stark geschüttelt wird, eine Melodie über einen Buzzer abzuspielen.

Der Aufbau dazu sieht Aktuell so aus(+eine LED an Pin D4; zum testen ist der Aufbau nicht an die Batterie, sondern an meinen PC angeschlossen, um die Werte auf dem Seriellen Plotter sehen zu können) :

Und mein Programm so:
Programm.ino (2,3 KB) (Code ist auch in der 2. Antwort wie gewünscht angehängt)
Das Programm ist hauptsächlich ein Beispielcode der Bibliothek, um die Beschleunigung der Z -Achse auszulesen. Der Timer mit den Millis ist aktuell dazu da, um zu verhindern, dass nach einem Reset das Teil sofort wieder auslöst, weil der Letzte gesendete Wert über dem Grenzwert liegt.

Soweit funktioniert es auch erstmal, allerdings habe ich noch ein paar Fragen:

  1. Wofür ist die Verbindung D2 zu INT1, die im Beispielcode als Kommentar angegeben wird? Wenn ich diese Verbindung so schalte, passiert nichts mehr, auch wenn ich das Teil schüttle. Ist diese Verbindung nicht vorhanden, funktioniert es wie ich es erwarten würde.

  2. Die eigentlich wichtigere Frage. Für meinen Anwendungsfall ist es wichtig, dass ich das Teil in die Hand nehmen und schütteln kann und sobald der Grenzwert überschritten wird, wird der Buzzer ausgelöst. Wenn ich das auf meinem Breadboard mit oben gezeigtem Aufbau versuche, spuckt der Serielle Plotter nach Abheben des Breadboards vom Tisch keine neuen Werte mehr aus. Liegt das Breadboard allerdings flach auf dem Tisch und ich schüttle es dort hin und her, ist die Funktion so wie gewünscht.

Noch als Nachtrag: So sieht es auf dem Seriellen Plotter aus wenn ich das auf dem Tisch liegende Teil hin und her Bewege:


Hebe Ich das Teil dann an schreibt der Plotter keine neuen Werte mehr. Auch ein Reset in der Luft behebt das Problem nicht.

Ich habe im Internet leider nicht wirklich viel mit diesem Sensor in Verbindung mit Arduino gefunden, vielleicht hatte ja einer von euch schonmal damit zu tun und kann mir helfen.

Im Vorraus schonmal vielen Dank für eure Hilfe!

Setze Deinen Code bitte in Codetags. Wie das geht, steht hier.

Gruß Tommy

War mir zu lang, um das so zu machen, deswegen hatte ich den Code als Datei hochgeladen, aber wenn dir das was hilft gerne:


#include "FXLS89xx_Arduino.h"


// *********************Variabeln und Setup der Bibliothek**************************
FXLS89xx fxls89xx;
float upper_threshold=100;
float lower_threshold=-100;
float previousZ;
int LedPin = 4;
int delayTime = 500;
int buzzerPin = 3;

int i=2;
int j=5;
int timer;
/*
 * Functions
 */
void setup() 
{
  // put your setup code here, to run once:
  // Initialize the device and take the WHO_AM_I parameter
  pinMode(buzzerPin, OUTPUT);
  pinMode(LedPin, OUTPUT);
  Serial.begin(115200);
 // while (!Serial);
  pinMode(A0, INPUT);
  Wire.begin();
  
  uint8_t whoami = fxls89xx.init();
  Serial.print("WHO_AM_I: ");
  Serial.println(whoami, HEX);
  fxls89xx.wake_odr = FXLS89xx::_12_5HZ;
  fxls89xx.wake_pm  = FXLS89xx::_HPM;
  fxls89xx.sleep_odr = FXLS89xx::_1_563HZ;
  fxls89xx.sleep_pm  = FXLS89xx::_LPM;
  fxls89xx.sensor_range = FXLS89xx::_4G;
  fxls89xx.sdcd_wt = false;
  fxls89xx.sdcd(FXLS89xx::_DIFFPREV, FXLS89xx::___Z, upper_threshold, lower_threshold);
  fxls89xx.enable_sleep(5);
  fxls89xx.run();
}

//**************************Auslesen Accelerometer*********************************
void loop() {

  while (!digitalRead(2));      // Wait until D2 (INT1) rises                                    
  float float_output[3];        
  fxls89xx.read_XYZ(float_output); // Read and calculate XYZ G Data
  Serial.print(",Z:");
  Serial.print(float_output[2]);
  Serial.print(",Upper_Threshold:");
  Serial.print(previousZ+upper_threshold);
  Serial.print(",Lower_Threshold:");
  Serial.print(previousZ+lower_threshold);
  Serial.print(",SDCD_INT(Z):");
  Serial.println(digitalRead(A0)?1000:0);
  previousZ=float_output[2];


  //********************************Auslöser Buzzer/LED*******************************
  
  if(i>1)
  {
    timer=millis();
    i=i-1;
  }
  if(millis()-timer>3000)
  {
  if ((previousZ+upper_threshold)>1500 | (previousZ+upper_threshold)<-1500)
  {
    if (i>0)
    {
      digitalWrite(LedPin, HIGH);
   
    while (j>0)
     {
      tone(buzzerPin,1800);
      delay(delayTime);
      tone(buzzerPin,3500);
      delay(delayTime);
      j=j-1;
     }
    noTone(buzzerPin); 
    digitalWrite(LedPin, LOW);
    i=i-1;
    }
  }
  else
  {
    digitalWrite (LedPin, LOW);
    noTone(buzzerPin);
  } 
}
}

Das hilft vor allem denen, die mit Touch-Geräten lesen, denn für die ist ein ZIP zusätzlicher und unnötiger Aufwand, den sie sich nicht antun und schon hast Du eine Reihe möglicher Helfer ausgeschlossen und damit hilft es auch Dir.

Gruß Tommy

1 Like

Welchen Arduino hast Du genau? einen NANO oder einen NANO ESP32
Was bedeuter Batterie ca 3,3V. Wieviel ist da Abweichung möglich?

Grüße Uwe

Ich benutze einen Nano. Die Batterie hat 3,3V, aber das kann erstmal nicht das Problem sein, da ich ja aktuell mit dem Laptop teste und diesen als Spannungsquelle benutze.

Dein Bild in Post#1 zeigt aber etwas anderes !
Das ist ein Arduino Nano ESP32.

Welche Batterie hat genau 3,3V?

Der Beschleunigungssensor funktioniert mit 3,3V. Auch der I2C Bus Funktioniert mit 3,3V (höhere Spannung macht das IC kaputt).

Darum brauchst Du einen Controller der mit 3,3V funktioniert oder wenn Du einen NANO (keinen NANO ESP32) nimmst, dann Levelshifter für I2C Bus.

Grüße Uwe

Wie gesagt geht es gerade überhaupt nicht um die Batterie. Das ist ein Thema für wenn alles am PC funktioniert.

Ich habe auf die schnelle in diesem schematic-Programm nichts anderes gefunden und deshalb auch nochmal daneben geschrieben, dass es ein NANO ist.

Dir ist bekannt das die 3,3V aus UART kommen, und haben nichts mit der MCU zu tun, die funktioniert nämlich mit 5V.
Wenn du irgend wann deine 3.3V Batterie wilst nutzen funktioniert das nicht.

Ich habe es auch schon mit der Batterie probiert und es funktioniert genauso, wie wenn ich es am Laptop anschließe. Auf dem Tisch liegend wackeln geht, wenn man es in der Hand hält und wackelt passiert nichts.

Aber wie schon gesagt muss es überhaupt erstmal funktionieren, dass das mit der Batterie überhaupt zum Problem werden kann. Das wäre wirklich die erste Prio.

Ok, aber denke dran, Nano heißen beide und Anfänger können den Unterschied evtl. nicht sehen.

Hallo,
also wenn das Ding auf dem Tisch liegend funktioniert , dann sollte es ja auch gehen wenn Du es in der Hand hälst. Kannst ja mal alles auf ein Frühstücksbrettchen legen als Gegentest. :wink:

Das macht also keinen Sinn, ich denke ehr, es handelt sich um einen Wackelkontakt auf dem Steckbrett. Lass Dir doch mal die Werte für alle drei Achsen numerisch ausgeben.

nimm mal die Zeile

ganz raus , die blockiert nur das Program wenn der Eingang nicht da ist.

Ich glaube nicht, dass es ein Wackelkontakt ist. Ich kann das hochheben und auf den Tisch zurück legen immer wieder wiederholen und es ist immer das gleiche Ergebnis: Liegt das Teil auf dem Tisch funktioniert alles. Hebe ich es hoch funktioniert es auch noch kurz, bevor die Werte sich nicht mehr ändern. Lege ich es zurück auf den Tisch (oder eine andere Ebene fläche) funktioniert es wieder.

Ich könnte mir vorstellen, dass in diesen Bibliotheksaufrufen ein Auschlusskriterium drinnen ist, dass wenn der Winkel der Vertikalen Achse (also die, die orthogonal von der Tischfläche wegzeigt) nicht annähernd gleich bleibt, keine neuen Werte erfasst werden. Warum oder ob das so ist kann ich nicht sagen, vielleicht hat da jemand von euch mehr Anhnung als ich.

Hallo,
und was ist mit der x und y Achse kommt denn da was ?
while ... ist raus ? Wird die Ausgabe immer bearbeitet oder sperrt da die while schleife was ...

ich kenne den Sensor nicht , aber wenn er die Beschleunigung von 3 Achsen messen kann das sollte das doch gehen.
Du wertest ja die Z Achse aus ist das die senkrechte zum Boden , also die Höhe. Wenn Du das Ding jetzt 90 Grad um die senkrechte drehst dann ist die Höhe ja eine der beiden anderen Achsen. Was dann ?
Also alle drei Werte mal numerisch anzeigen und mit einem Beispiel Sketch der lib anfangen.

void loop(){
float float_output[3];        
  fxls89xx.read_XYZ(float_output); // Read and calculate XYZ G Data
  Serial.print("X:");
  Serial.print(float_output[0]);
 
 Serial.print("  Y:");
  Serial.print(float_output[1]);

 Serial.print("  Z:");
  Serial.print(float_output[2]);
  Serial.println();

delay(100);
}

mach doch mal Deinen Loop nur so um zu sehen was die Messung macht, ein Schritt nach dem anderen.

Heinz

Hallo,
lies mal die Seite 5 von der Doku zum Sensor

Alles klar das werde ich nachher alles Mal versuchen. Vielen Dank schonmal.

Damit meinst du die Werte nicht mittels des Seriellen Plotters sondern mittels des seriellen Monitors in der Arduino IDE anzuzeigen?

Ja z.B
ich würde damit anfangen die Werte der 3 Achsen mir anzusehen. Ich bin mir aber jetzt nicht sicher ob mein loop Vorschlag laufen kann. Aber es muss ja ein einfaches Beispiel zu der lib geben wo das gemacht wird.

1 Like

Der auf den Ausgängen 5V ausgibt und der Beschleunigungsmesser nur 3,3V verträgt.
Grüße Uwe

1 Like

Hab gerade mit einem Voltmeter nachgemessen, es sind tatsächlich nur 3,3V :man_shrugging: