MinIMU-9 v2 +Python (ohne Adafruit)

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Zusammen,
    nach langer Zeit melde ich mich an dieser Stelle mal wieder (wie das halt so ist man geht nur zum Arzt wenn man ein Problem hat :D ).

    Ich habe mir ein MinIMU-9 v2 zugelegt. Und wie es kommen musste nach Wochen programmieren, testen, ausprobieren weiß ich nicht mehr weiter.
    Auf dem MinIMU-9 v2 sind: ein L3GD20 (3-Achsen Gyroskop) und ein LSM303DLHC (3 Achsen Lagesensor + 3 Achsen "Kompass").

    L3GD20 - kein großes Problem hierfür gibt es eine Bibliothek

    LSM303 - Tagelanges googeln Adafruit hat dazu eine Arduino Bibliothek die jemand "inoffiziell" "offiziell" in Python portiert hat.

    Und hier beginnen die Probleme.

    Ich will bei meinen Programmen so wenig mit andren Entwicklern in die Kiste hüpfen wie möglich :s (Mein Programm soll so eigenständig und unabhängig von anderer Läute Arbeit sein wie möglich)

    Das Adafruit Programm scheint einwandfrei zu laufen also habe ich an Hand dessen versucht meinen eigenen Fehler zu finden.

    Ich sollte an dieser Stelle erwähnen das alles funktioniert bis auf die Kleinigkeit das ich vom Lagesensor keine Lagedaten bekomme.

    den Adafruit Code gibt es hier: https://bitbucket.org/shigeru_kawagu…303_for_rpi.git

    Mein Programm poste ich später hinterher - bin komplett auf Linux umgestiegen und muss jetzt erst mal schauen das ich das Programm vom PI wieder auf meinen anderen Rechner geladen bekomme.

    Wenn jemand eine Idee dazu hat bitte melden.

    :danke_ATDE:

    Edit 15.3.14

    Hier mein Code:

    Der Code wird später auf keinen Fall so verwendet.
    :rolleyes:

    Wenn's qualmt und stinkt hast du was falsch gemacht :D

    Einmal editiert, zuletzt von Adiamus (15. März 2014 um 21:34)

  • ok Fehler gefunden ...

    binäre Werte werden nicht 00001010 ausgedrückt sondern 0b00001010 so ein Mist aber auch ...:wallbash:
    vielleicht hilft das hier ja irgendwann mal jemandem.

    Wenn ich den Code sauber gemacht habe poste ich ihn nochmal. :D

    Grüße

    Leo

    Wenn's qualmt und stinkt hast du was falsch gemacht :D

  • So jetzt sauber - vielleicht hilft es ja jemandem irgendwann.

    nicht schön aber hilfreich :D

    Wenn's qualmt und stinkt hast du was falsch gemacht :D

  • Hi Adiamus,

    vielen Dank für deinen Beitrag.
    Ich bin leider das exakte Gegenteil von dir... eher ein Hobbyscripter und nicht wirklich in der Lage ein Python-Script dieser Art zu schreiben.

    Ich habe ebenfalls ein MINIMU9V2 für mein Projekt im Einsatz und habe unter den folgenden Adressen Kontakt mit den Entwicklern aufgenommen. Leider decken beide Code-Samples jeweils nur einen Teil der Chips ab.
    http://ozzmaker.com/2013/04/29/gui…a-raspberry-pi/

    und

    http://mpolaczyk.pl/raspberry-pi-s…python-library/

    Das Problem was ich habe ist die Kalibrierung.
    Wie kalibriere ich und stelle somit sicher, dass die ausgelesenen Werte der Realität entsprechen bzw. woher weiß ich ob die angezeigten Werte auch tatsächlich korrekt sind.

    Könntest Du mir hier weiterhelfen?

    Danke und viele Grüße,
    codac

  • Was die "Echtheit" der Werte an geht kann ich dir leider nicht groß helfen.
    Dafür habe ich zu wenig Erfahrung mit Sensoren.
    Ich benutze als Orientierung immer Maximal- und Minimal- Wert des Sensors und schiebe dann die Zahlen in Python hin und her wie ich sie brauche.

    Grüße
    Leo

    Ich habe das Ganze noch mal zu einem Modul modifiziert:

    kleines Beispiel zum Werte auslesen:

    nur zum auslesen der Werte - an die Kalibrierung traue ich mich vorerst nicht dran. :D

    PS: Ich habe da so zwei Dinger, echt altmodisch, das eine ist ne Wasserwaage und das andere ein Kompass - kennt man so was Heute noch?

    Wenn's qualmt und stinkt hast du was falsch gemacht :D

    Einmal editiert, zuletzt von Adiamus (15. Mai 2014 um 20:48)

    • Offizieller Beitrag

    die "Kalibierung" ansich ist hier recht brauchbar beschrieben, Das schwerste ist es dann seinen Code anzupassen. Wenn aber aber weiss das z.B. 220-222 auf der Achse grade ist, dann gehts bei Überschreitung des 0 Wertes halt hoch und bei unterschreitung runter (oder links|rechts) usw.

    • Offizieller Beitrag

    Ich hab selber so ein Teil ("nur" ein Beuschleunigungsmesser) und hab mich durch Kopfschmerzen erzeugene doku gelesen. Am Ende hab ich das Teil auf den Tisch gelegt und geschaut welche Werte sich verändern wenn ich ihn bewege. Da mich nur Achse Interessiert, war der "Grade-Spielraum" recht schnell gefunden und grosszügig ausgedehnt xD. Ein Flugzeug möchte ich mit dieser Methode nicht steuern aber für meine Zwecke reichts ;)

  • Vielen Dank für die tollen Antworten!
    Wenn ich es richtig sehe, dann wird unter dem Link davon gesprochen den Offset Wert für:
    - X-Gyro
    - Y-Gyro
    - Z-Gyro und
    - Z-Accel
    ...zu bestimmen.

    Somit wären ja das Gyroskop und der Beschleunigungssensor abgedeckt.
    Was ist aber mit dem 3-Achsen Kompass bzw. Magnetfeldsensor?

    Adiamus: Lese ich es richtig, dass:
    val_out_x_h_m = Value Out X-Achse High Magnetometer
    val_out_x_h_a = Value Out X-Achse High Accelerometer
    .. bedeutet?
    Planst Du auch das Gyroskop noch einzubinden oder bin ich blind und habs übersehen?

  • Fangen wir am Ende an:
    für das Gyroskop gibt es eine Bibliothek
    hier:
    http://mpolaczyk.pl/raspberry-pi-s…python-library/

    als nächstes

    val_out_x_h_m = Value Out X-Achse High Magnetometer
    val_out_x_h_a = Value Out X-Achse High Accelerometer

    ist fast richtig - die Werte werden in 2 Byte vom Sensor übergeben das h steht für higher Byte also nur den oberen Teil der zwei Byte langen Zahl.

    ganz unten steht: data = [(x_data_a),(y_data_a),(z_data_a),(x_data_m),(y_data_m),(z_data_m)]

    das dürfte wesentlich interessanter für dich sein. Der größte Wert ist 4096 der kleinste 0.

    in x_data_a ist der Wert der X Achse des Lagensensors abgelegt
    in x_data_m der Wert für X Achse Kompass
    usw...

    Im älteren Code bringe ich die Werte noch nicht zusammen.

    den neuen Code kannst du einfach in eine Datei kopieren und lsm303.py nennen, dann funktioniert auch das Beispiel.

    Grüße
    Leo

    PS: tu dir keinen Zwang an und verändre den Code wie du ihn brauchst

    Wenn's qualmt und stinkt hast du was falsch gemacht :D

    Einmal editiert, zuletzt von Adiamus (16. Mai 2014 um 16:59)

  • Perfekt Leo, vielen Dank.

    Ich habe beide Dateien Modul + Auslesen der Werte mal etwas angepasst und erweitert (Habe auch die Konfiguration der Register teilweise angepasst).

    Könntest Du mal bitte schauen ob das so passt bzw. ob du halbwegs akzeptable Werte erhältst?

    LSM303DLHC.py

    minimutest.py

    aktualisiert: 27.05.2014

    Einmal editiert, zuletzt von codac (28. Mai 2014 um 08:48)

  • meine Hochachtung das ist ja richtig hübsch und hat Struktur :thumbs1:
    baue gerade den PI um, zum testen :D

    in Zeile 178 von LSM303DLHC.py ist angeblich ein Zeichen das nicht zum ASCII Code gehört:

    magnetics = [(x_data_m),(y_data_m),(z_data_m),(x_data_m_g),(y_data_m_g),(z_data_m_g),(m_heading)]

    ich sehe aber weder kyrillische- noch chinesische- oder sonst was an nicht ASCII Zeichen :huh:

    Wenn's qualmt und stinkt hast du was falsch gemacht :D

    Einmal editiert, zuletzt von Adiamus (17. Mai 2014 um 19:05)

  • Ich habe den Quellcode noch einiges erweitert und mal versucht eine automatisierte Kalibrierung für das Magnetometer zu schreiben. Die Aktualisierung findest Du wieder bei meinem Quelltext post.
    Ich muss aber sagen, die Werte sind soweit ich das beurteilen kann ziemlicher Schrott.

    Wäre sehr sehr dankbar, wenn Du mal drüber schauen könntest und nach Fehlerquellen Ausschau halten könntest. :s
    Habe ich bei der Programmierung an die folgenden Quellen gehalten (trotz des Titels =()

    Shigeru Kawaguchi

    Adafruit

    vor allem aber den Quellcode, welcher vom Hersteller bereitgestellt wird:
    Pololu

  • Ich geb mir das morgen - ich bin nicht sicher ob man tatsächlich die Werte aus dem Sensor nochmal mit den Faktoren die man eingestellt hat verrechnen muss ... aber wie gesagt morgen :)

    Wenn's qualmt und stinkt hast du was falsch gemacht :D

  • Hey!
    Ich habe gerade in den Code von Polulu rein geschaut ... sehr halbherzig das Zeug aber nagut - jedenfalls verrechnen die schon mal nicht die Sensor Konfigurationswerte mit den gelesenen Werten vom Sensor.

    Wenn ich den Adafruit Code lese könnte ich schon wieder Amok laufen - das wird aber wahrscheinlich an meinen rostigen C Grundlagen liegen... aber eine Verrechnung habe ich auch hier nicht gefunden ...
    Wenn ich das richtig lese verändern die die Werte so das man am ende Gaus oder mücro Tesla raus bekommt aber das sind nur Mathematische Tricksereien die nicht notwendig sind (meiner nicht besonders Bescheidenen Meinung nach)

    Der fähige Herr Kawaguchi ...

    Code
    def readMagneticsGauss(self):
        "Returns magnetometer readings in gauss unit"
        magData = self.readMagnetics()
    
    
        magVal3D = Obj3D()
        magVal3D.x = self.__twos_comp(magData.x, 12) * self.magFactor
        magVal3D.y = self.__twos_comp(magData.y, 12) * self.magFactor
        magVal3D.z = self.__twos_comp(magData.z, 12) * self.magFactor
        return magVal3D

    ...macht mit obiger Funktion aus seinen Sensorwerten Gaus ... 1 Tesla waren glaub ich 1000 Gaus ...

    ...was er hier macht leuchtet mir nicht so ganz ein aber das ist ja auch nur eine test Klasse also weniger von belang...


    Meine Meinung zu diesem Sensor und dem Code den wir dafür schreiben ist recht simpel:

    Ein Wert den ein sensor ausgibt muss nicht der Realität entsprechen
    (Du misst mit einem Thermometer 20°C - Dein Thermo Sensor gibt dir den Wert 150)
    [nicht weiter schlimm du weist doch das 150 vom Sensor 20°C entsprechen das lässt sich also umrechnen]

    Im Falle Dieser Sensor Kombie die wir gerade benutzen finde ich ist die Temperatur der einzige Wert von dem es Sinn ergibt ihn umzurechnen in °C oder °F oder Kelvin - Kein normaler Mensch kann was mit Magnetischer Feldstärke anfangen - also warum umrechnen in bekannte Einheiten?

    Und bei dem was wir mit dem Lagesensor anstellen brauchen wir doch garkeine bekannten Einheiten.

    Oder sieht dein Projekt vor Gravitationsschwankungen zu messen?

    Grüße
    Leo


    PS: Ich werde mich jetzt daran setzen und deinen Code testen wenn du es wirklich geschafft hast brauchbare Werte in bekannten Einheiten zu bekommen dann ist das doch gar nicht so schlecht - je nachdem was du vor hast :D

    Wenn's qualmt und stinkt hast du was falsch gemacht :D

  • Temperatur sieht gut aus
    Magnetometer Werte: sieht aus wie eine falsche Bit Verschiebung weshalb die Kommas keinen Sinn ergeben schieb die Sensorwerte 4 Bit nach rechts dann sollte das stimmen aber dann ist der Wert noch nicht in einer Realen Einheit
    Lage Sensor: sieht gut aus
    dein Programm scheint zu funktionieren (mit realitätsnahen Werten)

    Schönes Ding :thumbs1:

    Wenn's qualmt und stinkt hast du was falsch gemacht :D

  • Hi Leo,

    die Code-Version welche du getestet hast, ist von den Werten her leider durchaus noch fehlerhaft.
    Ich habe nochmal alles überarbeitet und mittlerweile auch das Gyrometer eingebunden.
    Die Werte sehen jetzt für RAW Werte ganz gut aus. Was noch fehlt ist eben die Kalibrierung.
    Das wäre der nächste Schritt für das Gyrometer, Beschleunigungsmesser und Magnetfeldsensor.

    Mir ist prinzipiell schon klar, dass die RAW Werte prinzipiell erstmal stimmen. In meinem Projekt geht es aber darum möglichst realistische Werte zu ermitteln. Um zu erkennen ob die Werte realistisch sind, muss man die RAW Werte eben in bekannte Einheiten umrechnen um eine Bezugsgröße zu haben.

    Parallel bin ich auch im Forum von Pololu tätig. Dort gibt es ein tolles Tool für den Rapsbian Pi mit dem man den Magnetfeldsensor kalibrieren kann. Ich werde den Code analysieren und versuchen mit in das Script aufzunehmen.

    Pololu Forum

    Werde in den folgenden Tagen den Code aktualisieren.

    Viele Grüße!

    Einmal editiert, zuletzt von codac (4. Juni 2014 um 10:48)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!