INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Schräglagen- u. Kipppunktanzeige Motorrad mit Mpu 6050
12.08.2018, 15:40
Beitrag #1
Schräglagen- u. Kipppunktanzeige Motorrad mit Mpu 6050
Guten Tag,

bin noch nicht lange dabei aber ich habe mir jetzt vorgenommen für mein Motorrad einen kleine Anzeige zu machen die mir die Schräglage und den Grad vom Wheelie anzeigt.

Bin jetzt schon so weit das ich die Winkelgeschwindigkeit und die Beschleunigung in x y und z achse auslesen kann.

Zum Verständnis: Der Pfeil meiner x-Achse zeigt quasi auf den Vorderreifen meine Y-Achse ist dann quer zur Fahrtrichtung und die z-Achse zeigt in den Himmel.

Es geht also "nur" noch um die Umrechnung der Winkelgeschwindigkeit und das aufaddieren der Winkeländerung sowie das Rücksetzten auf 0.

Winkelgeschwindigkeit:

Dafür muss ich jetzt ja die Winkelgeschwindigkeit in einen Winkel umrechen.

Dazu muss ich ja eigentlich nur meine Winkelgeschwindigkeit mit der Dauer multiplizieren für die dieser Wert besteht. Und die Winkelgeschwindigkeit wird ja mit jeden Loop ausggegeben. Also => Winkelgeschwindigkeit*Dauerzwischen den Loops. Nur wie finde ich die dauer raus?

Durch die Umrechnung habe ich ja dann immer wieder einen Fehler der ja so länger der Wert aufgerechnet wird immer großer wird.

Ist diese Auswirkung des Fehlers der Drift von dem immer alle Sprechen oder ist das noch was anderes?

Also muss ich ihm in gewissen Abständen ja immer wieder sagen das sich das Motorrad jetzt in 0 grad um die Befindet.

Rücksetzung und Bezugspunkt

Wenn ich stehe kann ich die Winkel ja immer wieder über meinen Beschleunigungssensor berechnen und den wert dann wieder als aktuellen Wert verwenden.

Und ob ich stehe oder nicht kann ich mir dann ja wieder über meinen Beschleunigungssensor bestimmen.

Wirklich schwierig wird das ganze eig nur wenn man nachher in Bewegung ist.

Um die x-Achse also für das 0 setzten des Schräglagenwinkels kann ich ja einfach sagen das das ganze 0 ist wenn ich keine Kraft in x Richtung habe dann habe ich ja eig 0 Grad Schräglage.

Die frage ist nur wie ich das für die Y-Achse mache. Da hätte ich ja 0 Grad wenn die gesamte Erdbeschleunigung auf meine Y-Achse wirkt. Allerdings habe ich ein wenig Angst das das ganze z.B. durch Schlaglöcher fälschlicherweise auf 0 gesetzt wird.

Vielen Dank!
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.08.2018, 15:59
Beitrag #2
RE: Schräglagen- u. Kipppunktanzeige Motorrad mit Mpu 6050
Ich habe jetzt mal ein wenig angefangen und glaube bin bis auf ein zwei "kleine" Probleme bezüglich der Ausgabe und der Signalisierung ganz gut vorangekommen.....

Ich habe euch die Probleme direkt in den Kommentar über den Betreffenden Abschnitt geschrieben und durch " -------------------- "eingegrenzt.

Habe versucht das das Ganze so übersichtlich ist wie es nur geht.

Code:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

long accelX, accelY, accelZ;
float gForceX, gForceY, gForceZ;

long gyroX, gyroY, gyroZ;
float rotX, rotY, rotZ;

float AngleX, AngleY;
float WinkelaenderungX, WinkelaenderungY;

float UmrechnungRad = 57.29577951;

int AnzahlDurchlauf=0;
int ZeitProLoop;
int LED_Stand= 7;
int LED_Bewegung= 6;

void setup() {
  Serial.begin(9600);
  Wire.begin();
  setupLCD();
  setupMPU();
  
  pinMode(LED_Stand,OUTPUT);

}


void loop() {
  recordAccelRegisters();  
  recordGyroRegisters();
  Winkelbestimmung();
  //printData();
  printDataLCD();
  

  //Messung der Zeit Pro Loop
  ++AnzahlDurchlauf;
  ZeitProLoop = millis()/AnzahlDurchlauf;
  

}

void setupLCD(){
  lcd.begin();
  lcd.backlight();
  
}

void setupMPU(){
  Wire.beginTransmission(0b1101000);
  Wire.write(0x6B);
  Wire.write(0b00000000);
  Wire.endTransmission();  
  Wire.beginTransmission(0b1101000);
  Wire.write(0x1B);
  Wire.write(0x00000000);
  Wire.endTransmission();
  Wire.beginTransmission(0b1101000);
  Wire.write(0x1C);
  Wire.write(0b00000000);
  Wire.endTransmission();
}

void recordAccelRegisters() {
  Wire.beginTransmission(0b1101000);
  Wire.write(0x3B);
  Wire.endTransmission();
  Wire.requestFrom(0b1101000,6);
  while(Wire.available() < 6);
  accelX = Wire.read()<<8|Wire.read();
accelY = Wire.read()<<8|Wire.read(); //Store middle two bytes into accelY
  accelZ = Wire.read()<<8|Wire.read(); //Store last two bytes into accelZ
  processAccelData();
}

void processAccelData(){
  gForceX = accelX / 16384.0;
  gForceY = accelY / 16384.0;
  gForceZ = accelZ / 16384.0;
}

void recordGyroRegisters() {
  Wire.beginTransmission(0b1101000);
  Wire.write(0x43);
  Wire.endTransmission();
  Wire.requestFrom(0b1101000,6);
  while(Wire.available() < 6);
  gyroX = Wire.read()<<8|Wire.read(); //Store first two bytes into accelX
  gyroY = Wire.read()<<8|Wire.read(); //Store middle two bytes into accelY
  gyroZ = Wire.read()<<8|Wire.read(); //Store last two bytes into accelZ
  processGyroData();
}

void processGyroData() {
  rotX = gyroX / 131.0/1000; // durch 1000 damit zeit in ms
  rotY = gyroY / 131.0/1000;
  rotZ = gyroZ / 131.0/1000;

  WinkelaenderungX=rotX*ZeitProLoop;
  WinkelaenderungY=rotY*ZeitProLoop;
}

/*--------------------------------------------------------------------PROBLEM: ----------------------------------------------------------------------------------------------
*
*
* 1. LED_Stand flackert obwohl die Bedinung permanent erfüllt ist            
*         2. Würde gerne für das zurücksetzen der X und Y Achse auch noch ein Optisches Signal einfügen das eine LED 1 Sekunde leuchtet wenn die Achse zurück gesetzt wurde
*            aber das ganze Soll mein Programm ja nicht verlangsamen ist also der gleiche Fehler wie für die LED_Stand
*            
*            --------------------------------------------------------------------------------------------------------------------------------------------------------
*/

void Winkelbestimmung(){

if(abs(sqrt(sq(gForceX)+sq(gForceY)+sq(gForceZ))-1)<=0.07){ //Betrag der Beschleunigung 1 +-0.1 = Stillstand weil keine andere Kraft zur Erdbeschleunigung hinzukommt

  //=> STILLSTAND => dann Winkel über Beschleunigungssensor berechnen

  digitalWrite(LED_Stand,HIGH); //PROBLEM: Obwohl der Betrag der Beschleunigung -1 Permanent unter 0.07 liegt flackert meine Lampe für den Stillstand
  
  AngleX = atan(gForceY/gForceZ)*UmrechnungRad; //Winkelberechnung in X Achse durch aufteilung der G Kraft
  AngleY = atan(gForceX/gForceZ)*UmrechnungRad; //Winkelberechnung in Y Achse durch Aufteilung der G Kraft

  digitalWrite(LED_Bewegung,LOW);
}
  
      else // => BEWEGUNG => Wenn sich der Betrag nicht in dem Bereich befindet bewege ich mich und ich muss den Winkel über die Winkelgeschwidigkeit anpassen
      
        digitalWrite(LED_Bewegung,HIGH);
        digitalWrite(LED_Stand,LOW);

      if(abs(gForceY) < 0.02){ // NUR WENN KEINE KRAFT IN Y => dann ist man gerade => Winkel =0
         AngleX=0;
      }
  
      AngleX=AngleX + WinkelaenderungX;

      if(abs(gForceZ-1) <0.02 && abs(gForceX)<0.02){ // NUR WENN KEINE KRAFT IN X UND IN Z ca. 1G wirkt wird 0 gesetzt ansonsten berechnet
        AngleY=0;
      }
      
      AngleY=AngleY+WinkelaenderungY;
      }
      

/*      ---------------------------------PROBLEM-------------------------------------------------------------------------------------------------------------------
*      
*      
*       1. Der Display aktualisiert sich so schnell das man die Zahlen kaum lesen kann wenn ich aber ein Delay einfüge wird ja die gesamte auswertung langsamer?!

                 2. Nach dem : habe ich ein Zeichen das sich quasi als zwei Gleichheitszeichen übereinander beschreiben lässt

                 3 Durch das Clearen wird das ganze noch schlimmer aber wenn ich nicht cleare bleiben manche stellen einfach stehen
                
      -----------------------------------------------------------------------------------------------------------------------------------------------------------*/


void printDataLCD(){      
  lcd.setCursor(0,0);
  lcd.println("X:");
  lcd.print(AngleX);
  lcd.setCursor(0,1);
  lcd.println("Y:");
  lcd.print(AngleY );
  lcd.setCursor(10,1);
  lcd.print(abs(sqrt(sq(gForceX)+sq(gForceY)+sq(gForceZ))-1));
  delay(10);      
  lcd.clear();  
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Big Grin GY-521/MPU-6050 von Beschleunigung auf Winkel [Grad] konek 1 2.858 25.09.2014 20:20
Letzter Beitrag: konek

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste