Hallo
ich will das Thema nochmal aufgreifen. hab jetzt nach langer Zeit wieder zeit für mein Projekt gefunden.
Leider komm ich nicht so richtig vorran. Hab schon das Handbuch gewälzt aber komm einfach net weiter, daher hoffe ich, dass ihr mir helfen könnt.
Und zwar bekomm ich keine sinnvollen Werte aus dem Sensor raus. Beschleunigung geht, aber nur wenn ich das nicht direkt nach Handbuch mache.
Magnetkompass bekomm ich gar nicht hin....
hier erstmal mein Code (direkt nach Handbuch):
Code:'LSM303DLH Sensor auslesen (Funktionen) 'Einstellungen: Sub Lsm303_init() 'Einstellungen definieren Acc_writereg Ctrl_reg1_a , &H27 'normal power mode, 50 Hz data rate, all axes enabled Magnet_writerega Cra_reg_m , &H14 'Output Rate 30Hz , Normal measurement configuration Magnet_writeregb Crb_reg_m , &H20 'Gain setting 1,3 Gauss Magnet_writeregm Mr_reg_m , &H00 ' magnetic sensor into continuous mode End Sub Sub Acc_writereg(byval Breg As Byte , Byval Bval As Byte) 'Einstellungen für Beschleunigung I2cstart I2cwbyte Acc_w_addr I2cwbyte Breg I2cwbyte Bval I2cstop End Sub Sub Magnet_writerega(byval Dreg As Byte , Byval Dval As Byte) ' 1. Einstellungen für Magnet I2cstart I2cwbyte Magnet_w_addr I2cwbyte Dreg I2cwbyte Dval End Sub Sub Magnet_writeregb(byval Ereg As Byte , Byval Eval As Byte) ' 2. Einstellungen für Magnet I2cstart I2cwbyte Magnet_w_addr I2cwbyte Ereg I2cwbyte Eval End Sub Sub Magnet_writeregm(byval Mreg As Byte , Byval Mval As Byte) '3. Einstellung für Magnet I2cstart I2cwbyte Magnet_w_addr I2cwbyte Mreg I2cwbyte Mval End SubCode:'Auslesen der Daten und Auswertung: Sub Acc_readsensordata() 'Beschleunigungssensor auslesen I2cstart 'ST I2cwbyte Acc_w_addr 'SAD + W I2cwbyte &HA8 'SUB = OUT_X_L_A, SUB(7) = 1 I2cstart 'SR I2cwbyte Acc_r_addr 'SAD + R I2crbyte Abaccdata(1) , Ack I2crbyte Abaccdata(2) , Ack I2crbyte Abaccdata(3) , Ack I2crbyte Abaccdata(4) , Ack I2crbyte Abaccdata(5) , Ack I2crbyte Abaccdata(6) , Nack I2cstop Shift Iax , Right , 4 , Signed Shift Iay , Right , 4 , Signed Shift Iaz , Right , 4 , Signed Sgx = Iax Sgy = Iay Sgz = Iaz Iax = Abaccdata(1) Shift Iax , Left , 8 , Signed Iax = Iax + Abaccdata(2) Iay = Abaccdata(3) Shift Iay , Left , 8 , Signed Iay = Iay + Abaccdata(4) Iaz = Abaccdata(5) Shift Iaz , Left , 8 , Signed Imz = Iaz + Abaccdata(6) End Sub Sub Acc_calcgvalues() 'ausgelesene Beschleunigungswerte Auswerten 'Sgx = Sgx * Res_2g 'Sgy = Sgy * Res_2g 'Sgz = Sgz * Res_2g Hilfsvariable1 = Acckorrektur(1) * Iax 'Norminalisierung mit Korrekturwerten X Richtung (Formel 3 Siehe Bild) Hilfsvariable2 = Acckorrektur(2) * Iay Hilfsvariable3 = Acckorrektur(3) * Iaz Hilfsvariable = Hilfsvariable1 + Hilfsvariable2 Hilfsvariable = Hilfsvariable + Hilfsvariable3 Sgx = Hilfsvariable + Acckorrektur(4) Hilfsvariable1 = Acckorrektur(5) * Iax 'Norminalisierung mit Korrekturwerten Y Richtung Hilfsvariable2 = Acckorrektur(6) * Iay Hilfsvariable3 = Acckorrektur(7) * Iaz Hilfsvariable = Hilfsvariable1 + Hilfsvariable2 Hilfsvariable = Hilfsvariable + Hilfsvariable3 Sgy = Hilfsvariable + Acckorrektur(8) Hilfsvariable1 = Acckorrektur(9) * Iax 'Norminalisierung mit Korrekturwerten Z Richtung Hilfsvariable2 = Acckorrektur(10) * Iay Hilfsvariable3 = Acckorrektur(11) * Iaz Hilfsvariable = Hilfsvariable1 + Hilfsvariable2 Hilfsvariable = Hilfsvariable + Hilfsvariable3 Sgz = Hilfsvariable + Acckorrektur(12) Pitch = -asin(sgx) '(Formel 10 Siehe Bild) Hilfsvariable = Cos(pitch) Hilfsvariable = Sgy / Hilfsvariable Roll = Asin(hilfsvariable) End Sub Sub Magnet_readsensordata() 'Magnetsensordaten auslesen Dim Temp As Byte I2cstart I2cwbyte Magnet_w_addr I2cwbyte Out_x_h_m I2cstart I2cwbyte Magnet_r_addr 'I2cwbyte Magnet_w_addr 'I2cwbyte Mr_reg_m I2crbyte Abmagdata(1) , Ack I2crbyte Abmagdata(2) , Ack I2crbyte Abmagdata(3) , Ack I2crbyte Abmagdata(4) , Ack I2crbyte Abmagdata(5) , Ack I2crbyte Abmagdata(6) , Nack I2cstop Imx = Abaccdata(1) Shift Imx , Left , 8 , Signed Imx = Imx + Abaccdata(2) Imy = Abaccdata(3) Shift Imy , Left , 8 , Signed Imy = Imy + Abaccdata(4) Imz = Abaccdata(5) Shift Imz , Left , 8 , Signed Imz = Imz + Abaccdata(6) End Sub Sub Magnet_calcmvalues() 'ausgelesene Magnetsensorwerte Auswerten Dim Xh As Single Dim Yh As Single Dim Zh As Single Imx = Imx - Magkorrektur(4) Imy = Imy - Magkorrektur(8) Imz = Imz - Magkorrektur(12) Hilfsvariable1 = Magkorrektur(1) * Imx 'Norminalisierung mit Korrekturwerten X Richtung (Formel 4 Siehe Bild) Hilfsvariable2 = Magkorrektur(2) * Imy Hilfsvariable3 = Magkorrektur(3) * Imz Hilfsvariable = Hilfsvariable1 + Hilfsvariable2 Magnetx = Hilfsvariable + Hilfsvariable3 Hilfsvariable1 = Magkorrektur(5) * Imx 'Norminalisierung mit Korrekturwerten Y Richtung Hilfsvariable2 = Magkorrektur(6) * Imy Hilfsvariable3 = Magkorrektur(7) * Imz Hilfsvariable = Hilfsvariable1 + Hilfsvariable2 Magnety = Hilfsvariable + Hilfsvariable3 Hilfsvariable1 = Magkorrektur(8) * Imx 'Norminalisierung mit Korrekturwerten Z Richtung Hilfsvariable2 = Magkorrektur(10) * Imy Hilfsvariable3 = Magkorrektur(11) * Imz Hilfsvariable = Hilfsvariable1 + Hilfsvariable2 Magnetz = Hilfsvariable + Hilfsvariable3 Hilfsvariable1 = Magnetx * Cos(pitch) 'X-Wert ausrechnen (Formel 12 Siehe Bild) Hilfsvariable2 = Magnetz * Sin(pitch) Xh = Hilfsvariable1 + Hilfsvariable2 Hilfsvariable1 = Magnetx * Sin(pitch) 'Y-Wert ausrechnen Hilfsvariable1 = Hilfsvariable1 * Sin(roll) Hilfsvariable2 = Magnety * Cos(roll) Hilfsvariable3 = Magnetz * Sin(roll) Hilfsvariable3 = Hilfsvariable3 * Cos(pitch) Yh = Hilfsvariable1 + Hilfsvariable2 Yh = Yh - Hilfsvariable3 Hilfsvariable1 = Magnetx * Cos(roll) 'Z-Wert ausrechnen Hilfsvariable1 = Hilfsvariable1 * Sin(pitch) Hilfsvariable2 = Magnety * Sin(roll) Hilfsvariable3 = Magnetz * Cos(roll) Hilfsvariable3 = Hilfsvariable3 * Cos(pitch) Zh = Hilfsvariable2 - Hilfsvariable1 Zh = Zh + Hilfsvariable3 Richtung = Yh / Xh 'Richtung in Grad bestimmen (Formel 13 Siehe Bild) Richtung = Atn(richtung) Richtung = Rad2deg(richtung) If Xh > 0 And Yh >= 0 Then 'schauen in welchem Quadranten der Wert liegt (wegen Tangens) (Formel 13 Siehe Bild) Richtung = Richtung End If If Xh < 0 Then Richtung = 180 + Richtung End If If Xh > 0 And Yh <= 0 Then Richtung = 360 + Richtung End If If Xh = 0 And Yh < 0 Then Richtung = 90 + Richtung End If If Xh = 0 And Yh > 0 Then Richtung = 270 + Richtung End If End Sub
Mein Problem:
Es ändern sich die Werte ständig obwohl der Sensor einfach nur fest montiert ist und sich nicht bewegt. Und ich weis nicht warum.
Wenn ich den Sensor um z.B. 90 Grad drehe dann bleiben die Werte immer noch so in dem Bereich. Am Winkel und Pitch ändert sich auch so gut wie nichts...
Hoffe da kann mir jemand weiterhelfen. Wenn das läuft würd ich dann auch mal nen Tutorial hierzu ins Wiki stellen wollen.
Anbei ein paar Messdaten. (erste zwei Messungen stehender Sensor, andere Messungen Sensor in Bewegung)
Messung 1:
Messung 2:Beschleunigung: X: -4626.00 Y: -4626.00 Z: -4626.00
Magnetfeld: X: -4119.00 Y: -4119.00 Z: -4119.00
Pitch: 1.570796366 Roll: 1.570796366
Richtung: 224.999618528
Messung 3:Beschleunigung: X: -5654.00 Y: -5654.00 Z: -5654.00
Magnetfeld: X: -5147.00 Y: -5147.00 Z: -5147.00
Pitch: 1.570796366 Roll: 1.570796366
Richtung: 224.999618528
Messung 4:Beschleunigung: X: -5654.00 Y: -5654.00 Z: -5654.00
Magnetfeld: X: -5147.00 Y: -5147.00 Z: -5147.00
Pitch: 1.570796366 Roll: 1.570796366
Richtung: 224.999618528
Messung 5:Beschleunigung: X: -5397.00 Y: -5397.00 Z: -5397.00
Magnetfeld: X: -4890.00 Y: -4890.00 Z: -4890.00
Pitch: 1.570796366 Roll: 1.570796366
Richtung: 225.00036621
Messung 6:Beschleunigung: X: -6424.00 Y: -6424.00 Z: -6424.00
Magnetfeld: X: -5662.00 Y: -5662.00 Z: -5662.00
Pitch: 1.570796366 Roll: 1.570796366
Richtung: 224.999618528
Messung 7:Beschleunigung: X: -5145.00 Y: -5145.00 Z: -5145.00
Magnetfeld: X: -6169.00 Y: -6169.00 Z: -6169.00
Pitch: 1.570796366 Roll: 1.570796366
Richtung: 224.999618528
Beschleunigung: X: -5145.00 Y: -5145.00 Z: -5145.00
Magnetfeld: X: -6169.00 Y: -6169.00 Z: -6169.00
Pitch: 1.570796366 Roll: 1.570796366
Richtung: 224.999618528 Grad
Das Steht in der Bedienungsanleitung: (Siehe Bild)






Zitieren

Lesezeichen