PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mpu 6050 mit Bascom auswerten



Der Einsteiger
29.08.2013, 19:00
Hallo Leute,
habe mir eine mpu gekauft: http://www.amazon.de/SainSmart-MPU-6050-Gyroscope-Accelerometer-Arduino/dp/B009C4TR0E/ref=sr_1_2?ie=UTF8&qid=1377782796&sr=8-2&keywords=mpu+6050#productDescription

und möchte diese nun mit Bascom auswerten. Doch bin ich im I2C noch nicht so erfahren und brauche deshalb eure Hilfe.

Doch erst mal eine Hardware Frage: meine Rn-Control hat ja 5v. Die MPU arbeitet ja mit 3,3v. Wie kann ich die dann über I2C verbinden ? (Pegelwandler)
http://www.sainsmart.com/zen/documents/20-011-926/MPU-6050/GY521mpu-6050/MPU6050-V1-SCH.jpg


Zum Programm: nach längerem suchen habe ich das gefunden: https://www.roboternetz.de/community/threads/61632-MPU6050-mit-Atmega32?highlight=mpu6050

Doch verstehe ich manche Befehle nicht so ganz. ( Ich könnte das auch noch mal Morgen genauer sagen,was ich nicht verstehe)

Muss ich das Modul erst konfigurieren ?

Ich würde mich über Antworten sehr freuen.

Der Einsteiger

Der Einsteiger
30.08.2013, 11:18
Kann mir keiner die Fragen beantworten ??
Ich würde mich über Antworten freuen :)

BastelWastel
30.08.2013, 15:12
Schau dir mal die ApplicatonNote AN10441 von NXP an wegen den I2C leveln.
Ja, du musst das Modul erst initialisieren und konfigurieren.

Gruss, Andreas

malthy
30.08.2013, 15:53
zu I2C:

SDA und SCL sind bei I2C open drain, du kannst sie einfach per Pull-up auf 3.3V ziehen. Ich glaube dein MPU6050 Modul hat die Pull-ups eh drauf. Der AVR erkennt lt. Datenblatt alles ab 3 V als logisch high. Habe selber einen MPU6050 auf diese Art mit einem 5 V AVR verbunden, hatte bisher keine Probleme damit.

Gruß
Malte

Der Einsteiger
30.08.2013, 16:59
Hallo, danke für die Antworten :)


SDA und SCL sind bei I2C open drain, du kannst sie einfach per Pull-up auf 3.3V ziehen. Ich glaube dein MPU6050 Modul hat die Pull-ups eh drauf. Der AVR erkennt lt. Datenblatt alles ab 3 V als logisch high. Habe selber einen MPU6050 auf diese Art mit einem 5 V AVR verbunden, hatte bisher keine Probleme damit.

Meinst du also, dass ich direkt die Mpu jetzt mit meiner Rn-Control verbinden kann (ohne Pegelanpassung) . Würde es dann nicht so sein, dass wenn ich ein high Befehl vom MC schicke (5V) den Eingang der MPU (3,3V) schrotte ?? Würrden dann Widerstände dazwischen reichen ??


Schau dir mal die ApplicatonNote AN10441 von NXP an wegen den I2C leveln.
Das habe ich schon gesehen. Doch wollte ich mir die extra Spannungsregler eigentlich sparen. Aber danke trotzdem. (ich weiß ja gar nicht ob es überhaupt anders geht )

Der Einsteiger
01.09.2013, 08:44
Meinst du also, dass ich direkt die Mpu jetzt mit meiner Rn-Control verbinden kann (ohne Pegelanpassung) . Würde es dann nicht so sein, dass wenn ich ein high Befehl vom MC schicke (5V) den Eingang der MPU (3,3V) schrotte ?? Würrden dann Widerstände dazwischen reichen ??
Gibt es darauf eine Antwort ?

Und zu dem Appli Note: kann ich für die Versorgung der Mosfets auch eine externe Versorgung mit 3,3v nutzen, die nichts mit den am Bus hängenden zu tun hat ?
Welcher Mosfet ist dafür zu verwenden ?

Ich würde mich freuen, wenn ihr darauf noch mal antworten könnt.
Der Einsteiger

malthy
01.09.2013, 09:12
Meinst du also, dass ich direkt die Mpu jetzt mit meiner Rn-Control verbinden kann (ohne Pegelanpassung) . Würde es dann nicht so sein, dass wenn ich ein high Befehl vom MC schicke (5V) den Eingang der MPU (3,3V) schrotte ?? Würrden dann Widerstände dazwischen reichen ??

Open Drain (http://de.wikipedia.org/wiki/Open-Collector-Ausgang) bedeutet, dass du die Pins selber auf ein gewünschtes Potential ziehen kannst. Du kannst dir den Pin vorstellen wie einen offenen oder geschlossenen Schalter. Wenn er offen ist, zieht der externe Pull-up den Pin hoch - in deinem Falle dann eben auf 3.3V - im geschlossenen Zustand liegt der Pin auf Masse. Damit nimmt er nur Zustände zwischen 0 C (low) und 3.3 V (high) an. Die entsprechenden Pull-ups befinden sich meines Wissens ohnehin schon auf deiner Sensor-Platine.

- - - Aktualisiert - - -

Vermutlich ist das der Schaltplan für dein Modul (überprüfen!):

26293

(Quelle (http://www.electrodragon.com/w/index.php?title=File:MPU6050-V1-SCH.jpg))

Du siehst dass R4 und R5 SCL und SDA nach 3.3V ziehen. Das sind die o.g. Pull-up-Widerstände.

Der Einsteiger
01.09.2013, 10:56
Danke für die Antwort.
Doch weiß ich nicht, was das jetzt für mich bedeutet. Meinst du damit, dass ich keinen Pegelwandler mehr brauche ?
Oder brauche ich einen ?


Vermutlich ist das der Schaltplan für dein Modul (überprüfen!):
Ja, das ist er.

malthy
01.09.2013, 11:30
Ja, das ist er.

Dann brauchst du mMn keinen Pegelwandler. Du musst nur darauf achten, dass du den internen Pull-up für den Eingang nicht aktivierst.

Der Einsteiger
01.09.2013, 12:01
Meinst du damit, dass ich den Hardwareseitigen Pullup auf der Rn-Control auslöten muss, damit der Bus nicht noch zusätzlich auf 5V gezogen wird ?

malthy
01.09.2013, 13:04
Ich kenne das RN-Control-Ding nicht, wenn das noch externe Pull-Ups nach 5V hat, müssten die weg. Ich meinte die Pull-Ups im AVR (http://www.mikrocontroller.net/articles/AVR-Tutorial:_IO-Grundlagen#Pullup-Widerstand) die mit dem PORT-Register gesteuert werden.

Der Einsteiger
01.09.2013, 13:14
Ich meinte die Pull-Ups im AVR die mit dem PORT-Register gesteuert werden.
Und wie mache ich das mit Bascom ?

malthy
01.09.2013, 13:32
Sei mir nicht böse, aber ein klein wenig Eigeninitiative ist doch nicht zu viel verlangt. Du kannst es zB hier (http://www.rn-wissen.de/index.php/Bascom#Einen_I.2FO_Port_umschalten) ff. nachlesen.

Der Einsteiger
01.09.2013, 13:46
Mit der Eigeninitiative hast du ja recht :)
Das mit dem Port register war mir schon bekannt, doch hatte ich bis eben nicht verstanden, was du damit gemeint hattest...

Kann ich also jetzt ja loslegen und den Sensor anschließen. Kann ich dafür das Programm nutzen ?? : https://www.roboternetz.de/community/threads/61632-MPU6050-mit-Atmega32?highlight=mpu6050

Der Einsteiger
01.09.2013, 16:05
Hat einer von euch mal ein kleines Testprogramm für Bascom ??

Der Einsteiger
01.09.2013, 18:33
Leute ,ich habe keine Ahnung, wie das Programm aussehen soll...
Hier habe ich einfach alles zusammengeschrieben, was ich in dem Link gefunden hatte : Da sind aber einige Fehler drin: Es wäre sehr schön, wenn einer von euch ein fertiges Prog zum testen hätte, anhand ich dann weiterentwickeln kann ...


$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 200
$swstack = 200
$framesize = 400


Config Portd.7 = Output

Config Sda = Portc.1
Config Scl = Portc.0
Config Twi = 100000

Declare Sub Init_mpu
Declare Sub Read_gyro
Declare Sub Read_acc

Dim Tmp_gyrox(2) As Byte
Dim Tmp_gyroy(2) As Byte
Dim Tmp_gyroz(2) As Byte

Dim Tmp_accx(2) As Byte
Dim Tmp_accy(2) As Byte
Dim Tmp_accz(2) As Byte


Sound Portd.7 , 400 , 450
Sound Portd.7 , 400 , 250
Sound Portd.7 , 400 , 450
Wait 2

I2cinit


Call Init_mpu


Do
Call Read_gyro
Print "Tmp_gyrox(2) :" ; Tmp_gyrox(2)
Print "Tmp_gyrox(1) :" ; Tmp_gyrox(1)

Waitms 20

Print "Tmp_gyroy(2) :" ; Tmp_gyroy(2)
Print "Tmp_gyroy(1) :" ; Tmp_gyroy(1)

Waitms 20

Print "Tmp_gyroz(2) :" ; Tmp_gyroz(2)
Print "Tmp_gyroz(1) :" ; Tmp_gyroz(1)

Waitms 100




Call Read_acc

Print "Tmp_accx(2) :" ; Tmp_accx(2)
Print "Tmp_accx(1) :" ; Tmp_accx(1)

Waitms 20

Print "Tmp_accy(2) :" ; Tmp_accy(2)
Print "Tmp_accy(1) :" ; Tmp_accy(1)

Waitms 20

Print "Tmp_accz(2) :" ; Tmp_accz(2)
Print "Tmp_accz(1) :" ; Tmp_accz(1)

Wait 1

Loop

End


Sub Init_mpu()

'--- (25) Sample Rate Divider = 1 ---
I2cstart #2 'start condition
I2cwbyte &HD0 , #2 'write adress of MPU-6050
I2cwbyte 25 , #2 'Register 25 Sample Rate Divider (1..8 kHz)
I2cwbyte &B00000000 , #2 'Divider set to 1 (soll)
I2cstop #2 'stop condition

'--- (26) DLPF = 42/44 Hz ---
I2cstart #2 'start condition
I2cwbyte &HD0 , #2 'write adress of MPU-6050
I2cwbyte 26 , #2 'Register 26 DLPF_CFG (digital lowpass filter) Configuration
I2cwbyte &B00000011 , #2 'Bits 0..2 = 011 (3) - ACC:44Hz, 4.9ms; Gyro:42Hz, 4.8ms
I2cstop #2 'stop condition

'--- (27) Gyro Full Range = +-2000°/s ---
I2cstart #2 'start condition
I2cwbyte &HD0 , #2 'write adress of MPU-6050
I2cwbyte 27 , #2 'Register 27 Gyro Configuration
I2cwbyte &B00011000 , #2 'Bits 3+4 = 11 - Full Scale Range: +/-2000°/s
I2cstop #2 'stop condition

'--- (28) ACC Full Range = +-2g ---
I2cstart #2 'start condition
I2cwbyte &HD0 , #2 'write adress of MPU-6050
I2cwbyte 28 , #2 'Register 28 ACC Configuration
I2cwbyte &B00000000 , #2 'Bits 3+4 = 00 - Full Scale Range: +/-2g / No High Pass Filter
I2cstop #2 'stop condition

'--- (107) Power Management 1 ---
I2cstart #2 'start condition
I2cwbyte &HD0 , #2 'write adress of MPU-6050
I2cwbyte 107 , #2 'Register 107 Power Management 1
I2cwbyte &B00001011 , #2 'No Reset / No Sleep / No Cycle / Temp_Sens: Dis / Clock Source: Z-Gyro
I2cstop #2

End Sub


Sub Read_gyro()

I2cstart #2
I2cwbyte &HD0 , #2
I2cwbyte 67 , #2
I2crepstart #2
I2cwbyte &HD1 , #2

I2crbyte Tmp_gyrox(2) , Ack , #2
I2crbyte Tmp_gyrox(1) , Ack , #2

I2crbyte Tmp_gyroy(2) , Ack , #2
I2crbyte Tmp_gyroy(1) , Ack , #2

I2crbyte Tmp_gyroz(2) , Ack , #2
I2crbyte Tmp_gyroz(1) , Nack , #2

I2cstop #2


'Gyrox = Gx
'Gyroy = 0 - Gy
'Gyroz = 0 - Gz

End Sub


Sub Read_acc()


I2cstart #2
I2cwbyte &HD0 , #2
I2cwbyte 59 , #2
I2crepstart #2
I2cwbyte &HD1 , #2

I2crbyte Tmp_accx(2) , Ack , #2
I2crbyte Tmp_accx(1) , Ack , #2

I2crbyte Tmp_accy(2) , Ack , #2
I2crbyte Tmp_accy(1) , Ack , #2

I2crbyte Tmp_accz(2) , Ack , #2
I2crbyte Tmp_accz(1) , Nack , #2

I2cstop #2

'Accx = Ax
'Accy = Ay
'Accz = Az


End Sub

Che Guevara
01.09.2013, 19:02
Hi,

also der Code ist, soweit ich das sehen kann zumindest teilweise von mir ;)
Leider kannst du ihn nicht verwenden, weil du einen ATMega32 hast, d.h. es gibt nur eine TWI-Schnittstelle. Außerdem hast du die Tmp-Variablen falsch definiert.
Niemand wird dir hier einen fertigen Code präsentieren, wir sind hier in einem Forum wo es um Hilfestellung geht. Außer natürlich du postet dein Anliegen im Suche Serviceleistung Forum und hoffst, dass dir jemand da weiterhilft.
Aber wenn du dich nur mal ne Std. einlesen würdest, hättest du wohl schon ein funktionsfähiges Programm (zumindest in Bascom).

Gruß
Chris

Der Einsteiger
01.09.2013, 20:18
Hallo Che Guevara,

Danke dass du dich gemeldet hast :) (darauf habe ich schon gehofft, weil ja das Prog von dir ist )


also der Code ist, soweit ich das sehen kann zumindest teilweise von mir
Ja, darauf habe ich ja in Post 14 hingewiesen (Link)


Leider kannst du ihn nicht verwenden, weil du einen ATMega32 hast, d.h. es gibt nur eine TWI-Schnittstelle. Außerdem hast du die Tmp-Variablen falsch definiert.
Warum kann ich ihn nicht verwenden ?? Es reicht doch auch ein TWI, oder nicht ??


Niemand wird dir hier einen fertigen Code präsentieren, wir sind hier in einem Forum wo es um Hilfestellung geht. Außer natürlich du postet dein Anliegen im Suche Serviceleistung Forum und hoffst, dass dir jemand da weiterhilft.
Aber wenn du dich nur mal ne Std. einlesen würdest, hättest du wohl schon ein funktionsfähiges Programm (zumindest in Bascom).

Mit dem ersten Teil hast du recht. Mit dem zweiten (1Stunde ) nicht !! Dafür bräuchte ich Wochen....

So, da du ja sagtest dies ist ein Hilfeforum stell ich gleich mal zwei Fragen an dich : 1: was sollen die #2 bedeuten (dzu konnt ich nichts in der Bascom-Hilfe finden)
1: Ist das Grundprogramm schon mal richtig oder fehlt noch was wichtiges ??

malthy
01.09.2013, 21:09
Guck doch einfach mal in die Bascom Hilfe! http://avrhelp.mcselec.com/index.html?i2start_i2cstop__i2crbyte__i2cwbyte.htm


Syntax

I2CSTART
I2CREPSTART
I2CSTOP
I2CRBYTE var, ack/nack
I2CWBYTE val


Syntax Xmega
I2CSTART #const
I2CREPSTART #const
I2CSTOP #const
I2CRBYTE var, ack/nack , #const

I2CWBYTE val , #const


Remarks


Var

A variable that receives the value from the I2C-device.



ack/nack

Specify ACK if there are more bytes to read.

Specify NACK if it is the last byte to read.



Val

A variable or constant to write to the I2C-device.



#const

For the Xmega, a channel constant that was specified with OPEN.

Der Einsteiger
01.09.2013, 21:29
Ich habe in die Bascom Hilfe geschaut, doch habe ich nach # gesucht und nicht in i2cwbyte gesucht.

Dann werde ich mal morgen ein kleines Prog schreiben....
Vielen Dank für eure Hilfe. Entschuldigung, dass ich euch mit meinen dummen Fragen nerve.

Che Guevara
02.09.2013, 00:39
Hi,

also die #2 bedeutet, dass die Peripherie verwendet wird, die als #2 deklariert wurde. Das ist allerdings nur für XMega-AVRs gültig (im Hinblick auf TWI), weil normale Megas nur eine TWI haben und somit die #2 komplett entfällt.
Das Grundprogramm ist weder richtig noch falsch, es passt einfach nicht zu deiner Aufgabenstellung. Du müsstest TMP_Gyro... als Overlay definieren.
Außerdem weiß ich nicht, ob die Slave-Adressen richtig sind, aber da du diese ja schon angepasst hast, gehe ich davon aus, dass du das DB gelesen hast und entsprechend deiner Anschlussbelegung die Adresse richtig gewählt hast.
Deine Print-Ausgabe ist auch falsch bzw. unsinnig, da du als Mensch wohl nur schlecht die zwei Bytes (high & low) in sekundenschnelle zu einem int16 zusammensetzen kannst... Außerdem ist die Syntax falsch, aber da wird Bascom wohl sowieso meckern.
Am besten schreibst du erstmal ein compilierfähiges Grundprogramm (Controller-Def, Quarz, Mainloop) und fügst dann die relevaten Codeteile (zum Auslesen & Initialiseren des MPU) hinzu.
Und du solltest noch die passende Lib für die I2C Kommunikation einfügen.

Gruß
Chris

Der Einsteiger
02.09.2013, 17:09
also die #2 bedeutet, dass die Peripherie verwendet wird, die als #2 deklariert wurde. Das ist allerdings nur für XMega-AVRs gültig (im Hinblick auf TWI), weil normale Megas nur eine TWI haben und somit die #2 komplett entfällt.
Dann lösche ich die einfach :)


Das Grundprogramm ist weder richtig noch falsch, es passt einfach nicht zu deiner Aufgabenstellung.
Warum ? Ich mit diesem Prog erst einmal nur sehen, ob ich der mpu überhaupt richtig Daten entnehmen kann (ob ich mit i2c alles richtig gemacht habe usw. )


Du müsstest TMP_Gyro... als Overlay definieren.
Warum ?


Außerdem weiß ich nicht, ob die Slave-Adressen richtig sind, aber da du diese ja schon angepasst hast, gehe ich davon aus, dass du das DB gelesen hast und entsprechend deiner Anschlussbelegung die Adresse richtig gewählt hast.

Also im Datenblatt steht bei AD0 = 0 (gnd) Adresse : 1101000 Das macht fürs schreiben also &HD0 und fürs lesen &HD1 ,oder ??


Deine Print-Ausgabe ist auch falsch bzw. unsinnig, da du als Mensch wohl nur schlecht die zwei Bytes (high & low) in sekundenschnelle zu einem int16 zusammensetzen kannst...
Naja, dass soll ja nur zum testen sein :)


Außerdem ist die Syntax falsch, aber da wird Bascom wohl sowieso meckern.
Warum falsch ? Bei mir hat Bascom nicht gemeckert ...


Am besten schreibst du erstmal ein compilierfähiges Grundprogramm (Controller-Def, Quarz, Mainloop) und fügst dann die relevaten Codeteile (zum Auslesen & Initialiseren des MPU) hinzu.
Ok. Hier:


$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 200
$swstack = 200
$framesize = 400


Config Portd.7 = Output

Config Sda = Portc.1
Config Scl = Portc.0
Config Twi = 100000

Declare Sub Read_gyro
Declare Sub Read_acc

Dim Tmp_gyrox(2) As Byte
Dim Tmp_gyroy(2) As Byte
Dim Tmp_gyroz(2) As Byte

Dim Tmp_accx(2) As Byte
Dim Tmp_accy(2) As Byte
Dim Tmp_accz(2) As Byte


Sound Portd.7 , 400 , 450
Sound Portd.7 , 400 , 250
Sound Portd.7 , 400 , 450
Wait 2


I2cinit


'--- (25) Sample Rate Divider = 1 ---
I2cstart 'start condition
I2cwbyte &HD0 'write adress of MPU-6050
I2cwbyte 25 'Register 25 Sample Rate Divider (1..8 kHz)
I2cwbyte &B00000000 'Divider set to 1 (soll)
I2cstop 'stop condition

'--- (26) DLPF = 42/44 Hz ---
I2cstart 'start condition
I2cwbyte &HD0 'write adress of MPU-6050
I2cwbyte 26 'Register 26 DLPF_CFG (digital lowpass filter) Configuration
I2cwbyte &B00000011 'Bits 0..2 = 011 (3) - ACC:44Hz, 4.9ms; Gyro:42Hz, 4.8ms
I2cstop 'stop condition

'--- (27) Gyro Full Range = +-2000°/s ---
I2cstart 'start condition
I2cwbyte &HD0 'write adress of MPU-6050
I2cwbyte 27 'Register 27 Gyro Configuration
I2cwbyte &B00011000 'Bits 3+4 = 11 - Full Scale Range: +/-2000°/s
I2cstop 'stop condition

'--- (28) ACC Full Range = +-2g ---
I2cstart 'start condition
I2cwbyte &HD0 'write adress of MPU-6050
I2cwbyte 28 'Register 28 ACC Configuration
I2cwbyte &B00000000 'Bits 3+4 = 00 - Full Scale Range: +/-2g / No High Pass Filter
I2cstop 'stop condition

'--- (107) Power Management 1 ---
I2cstart 'start condition
I2cwbyte &HD0 'write adress of MPU-6050
I2cwbyte 107 'Register 107 Power Management 1
I2cwbyte &B00001011 'No Reset / No Sleep / No Cycle / Temp_Sens: Dis / Clock Source: Z-Gyro
I2cstop


Do
Call Read_gyro
Print "Tmp_gyrox(2) :" ; Tmp_gyrox(2)
Print "Tmp_gyrox(1) :" ; Tmp_gyrox(1)

Waitms 20

Print "Tmp_gyroy(2) :" ; Tmp_gyroy(2)
Print "Tmp_gyroy(1) :" ; Tmp_gyroy(1)

Waitms 20

Print "Tmp_gyroz(2) :" ; Tmp_gyroz(2)
Print "Tmp_gyroz(1) :" ; Tmp_gyroz(1)

Waitms 100




Call Read_acc

Print "Tmp_accx(2) :" ; Tmp_accx(2)
Print "Tmp_accx(1) :" ; Tmp_accx(1)

Waitms 20

Print "Tmp_accy(2) :" ; Tmp_accy(2)
Print "Tmp_accy(1) :" ; Tmp_accy(1)

Waitms 20

Print "Tmp_accz(2) :" ; Tmp_accz(2)
Print "Tmp_accz(1) :" ; Tmp_accz(1)

Wait 1

Loop

End




Sub Read_gyro()

I2cstart
I2cwbyte &HD0
I2cwbyte 67
I2crepstart
I2cwbyte &HD1

I2crbyte Tmp_gyrox(2) , Ack
I2crbyte Tmp_gyrox(1) , Ack

I2crbyte Tmp_gyroy(2) , Ack
I2crbyte Tmp_gyroy(1) , Ack

I2crbyte Tmp_gyroz(2) , Ack
I2crbyte Tmp_gyroz(1) , Nack

I2cstop


'Gyrox = Gx
'Gyroy = 0 - Gy
'Gyroz = 0 - Gz

End Sub


Sub Read_acc()


I2cstart
I2cwbyte &HD0
I2cwbyte 59
I2crepstart
I2cwbyte &HD1

I2crbyte Tmp_accx(2) , Ack
I2crbyte Tmp_accx(1) , Ack

I2crbyte Tmp_accy(2) , Ack
I2crbyte Tmp_accy(1) , Ack

I2crbyte Tmp_accz(2) , Ack
I2crbyte Tmp_accz(1) , Nack

I2cstop

'Accx = Ax
'Accy = Ay
'Accz = Az


End Sub


Und du solltest noch die passende Lib für die I2C Kommunikation einfügen.
Habe ich noch nie gemacht und es hat trotzdem funktioniert. Muss ich das machen ?

Eine Frage an dich : sind die Grundeinstellungen von dir zum init für die mpu richtig ??

Der Einsteiger
02.09.2013, 20:22
Hallo, ich habe jetzt ein funktionierendes Programm:


$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600
$hwstack = 200
$swstack = 200
$framesize = 400


Config Portd.7 = Output

Config Sda = Portc.1
Config Scl = Portc.0
Config Twi = 100000

Declare Sub Read_gyro
Declare Sub Read_acc



Dim Tmp_gyrox(2) As Byte
Dim Tmp_gyroy(2) As Byte
Dim Tmp_gyroz(2) As Byte

Dim Tmp_accx(2) As Byte
Dim Tmp_accy(2) As Byte
Dim Tmp_accz(2) As Byte

Dim Gyrox As Integer
Dim Gyroy As Integer
Dim Gyroz As Integer

Dim Accx As Integer
Dim Accy As Integer
Dim Accz As Integer


Sound Portd.7 , 400 , 450
Sound Portd.7 , 400 , 250
Sound Portd.7 , 400 , 450
Wait 2


Print "Hallo"
Waitms 20


I2cinit


'--- (25) Sample Rate Divider = 1 ---
I2cstart 'start condition
I2cwbyte &HD0 'write adress of MPU-6050
I2cwbyte 25 'Register 25 Sample Rate Divider (1..8 kHz)
I2cwbyte &B00000000 'Divider set to 1 (soll)
I2cstop 'stop condition

'--- (26) DLPF = 42/44 Hz ---
I2cstart 'start condition
I2cwbyte &HD0 'write adress of MPU-6050
I2cwbyte 26 'Register 26 DLPF_CFG (digital lowpass filter) Configuration
I2cwbyte &B00000011 'Bits 0..2 = 011 (3) - ACC:44Hz, 4.9ms; Gyro:42Hz, 4.8ms
I2cstop 'stop condition

'--- (27) Gyro Full Range = +-2000°/s ---
I2cstart 'start condition
I2cwbyte &HD0 'write adress of MPU-6050
I2cwbyte 27 'Register 27 Gyro Configuration
I2cwbyte &B00011000 'Bits 3+4 = 11 - Full Scale Range: +/-2000°/s
I2cstop 'stop condition

'--- (28) ACC Full Range = +-2g ---
I2cstart 'start condition
I2cwbyte &HD0 'write adress of MPU-6050
I2cwbyte 28 'Register 28 ACC Configuration
I2cwbyte &B00000000 'Bits 3+4 = 00 - Full Scale Range: +/-2g / No High Pass Filter
I2cstop 'stop condition

'--- (107) Power Management 1 ---
I2cstart 'start condition
I2cwbyte &HD0 'write adress of MPU-6050
I2cwbyte 107 'Register 107 Power Management 1
I2cwbyte &B00001011 'No Reset / No Sleep / No Cycle / Temp_Sens: Dis / Clock Source: Z-Gyro
I2cstop


Do
Call Read_gyro

Gyrox = Tmp_gyrox(1) + Tmp_gyrox(2)
Gyroy = Tmp_gyroy(1) + Tmp_gyroy(2)
Gyroz = Tmp_gyroz(1) + Tmp_gyroz(2)

Print "Gyrox :" ; Gyrox
Waitms 20

Print "Gyroy :" ; Gyroy
Waitms 20

Print "Gyroz :" ; Gyroz
Print
Waitms 100





Call Read_acc

Accx = Tmp_accx(1) + Tmp_accx(2)
Accy = Tmp_accy(1) + Tmp_accy(2)
Accz = Tmp_accz(1) + Tmp_accz(2)

Print "Accx :" ; Accx
Waitms 20

Print "Accy :" ; Accy
Waitms 20

Print "Accz :" ; Accz
Print
Print
Print
Wait 1
Loop
End





Sub Read_gyro()

I2cstart

I2cwbyte &HD0
I2cwbyte 67
I2crepstart
I2cwbyte &HD1

I2crbyte Tmp_gyrox(2) , Ack
I2crbyte Tmp_gyrox(1) , Ack

I2crbyte Tmp_gyroy(2) , Ack
I2crbyte Tmp_gyroy(1) , Ack

I2crbyte Tmp_gyroz(2) , Ack
I2crbyte Tmp_gyroz(1) , Nack

I2cstop

End Sub






Sub Read_acc()

I2cstart

I2cwbyte &HD0
I2cwbyte 59
I2crepstart
I2cwbyte &HD1

I2crbyte Tmp_accx(2) , Ack
I2crbyte Tmp_accx(1) , Ack

I2crbyte Tmp_accy(2) , Ack
I2crbyte Tmp_accy(1) , Ack

I2crbyte Tmp_accz(2) , Ack
I2crbyte Tmp_accz(1) , Nack

I2cstop

End Sub

Doch bekomme ich nur sinnlose Werte. Wie kann ich denn richtige Ergebnisse bekommen ? Soll ich mehrere Messungen machen und diese dann mitteln oder was ?

Kennt jemand ein Programm, dass die Daten graphisch darstellen kann ??

Che Guevara
02.09.2013, 21:04
Hi,

wie gesagt, du musst die Tmp-Variablen als Overlay definieren. Alternativ könntest du auch sowas machen (nach dem auslesen der TMPs):


gyrox = tmp_gyrox(1) * 256
gyrox = gyrox + tmp_gyrox(2)

Ein Programm zum graphischen Darstellen von versch. Daten könntest du dir selbst in z.b. vb.net schreiben, da ist die Syntax sehr ähnlich zu Bascom ;)

Gruß
Chris

Der Einsteiger
02.09.2013, 21:21
Was genau soll mir das : gyrox = tmp_gyrox(1) * 256 gyrox = gyrox + tmp_gyrox(2) bringen ? (kenne mich nicht so gut aus)


Ein Programm zum graphischen Darstellen von versch. Daten könntest du dir selbst in z.b. vb.net schreiben, da ist die Syntax sehr ähnlich zu Bascom
Ja, das versuche ich schon den ganzen Abend, doch bekomme ich es nicht hin. Ich schaffe es zwar die Seriellen Danten in einem Text-Feld darzustellen, aber nicht die Daten anders z.B. graphisch (ich habe es mit Progress Bar versucht, wusste aber nicht welche Einstellungen) ....

Was würdest du denn als Ding nehmen um es als Objekt darzustellen (auch mit Progress Bar, oder würdest du es ganz anders angehen ) ...

Ich hoffe du kannst mir weiterhelfen
Der Einsteiger

Che Guevara
02.09.2013, 21:57
Hi,

also wie gesagt, lies das DB, dann sollten keine weiteren solchen Fragen auftauchen ;) Hier gehts speziell um die Register 67 & 68 (diese beiden sollten genügen).
Ich hab mir ein Programm geschrieben, das die Daten binär empfängt und anschließend in einer Picturebox mittels drawline darstellt. Das ist wesentlich übersichtlicher als Progressbars und man kann den zeitlichen Ablauf besser einsehen.

Gruß
Chris

Der Einsteiger
03.09.2013, 20:57
So, habe jetzt mal das gemacht, was in Post 24 als Code gezeigt wurde. Doch bekomme ich nur solche Werte für den Gyrox (ich habe es bis jetzt auch nur mit dem getestet ). Dazu muss ich noch sagen: ICH habe die mpu dabei NULL bewegt..... ist doch komisch, oder ?

0
-11522
-16642
-12034
-15874
-11778
-11010
-21506
-13570
-15106
-7682
-15106
-14338
-13826
-9474
-12034
-17666

Zur graphischen Darstellung : nach einigen youtube Tutorials habe ich nun endlich herausgefunden, wie ich eine Linie in einer PictureBox mache. Doch weiß ich nicht wie ich das Feld (PictureBox) so anpasse, dass 1: x0 y0 unten links sein soll und 2: wie ich große Werte oder auch Minuswerte darstellen soll, da ja mein MC den z.B. Gyrox Wert direkt an den PC sendet ?????
Könnt ihr mir bitte helfen :)

Der Einsteiger
14.09.2013, 14:42
Habe noch mal eine Frage : Warum bekomme ich beim Acc x solche Werte :
1275
8443
-12038
251
3323
14587
-774
2299
-1798
-30469
-2822
11515

Warum sind die so unterschiedlich, obwohl ich den Sensor gar nicht bewege ??

da_miez3
05.11.2013, 00:41
Bist du weitergekommen mit dem Sensor? Hab mir jetzt den gleichen gekauft und stehe vor dem selben Problem ;)

Che Guevara
05.11.2013, 01:23
Hi,

also irgendwie komme ich mir veralbert vor, wenn ich mehrmals die Lösung poste und es immer wieder nicht umgesetzt wird und dann gefragt wird, warums nicht funktioniert...
DEFINIERE TMP_GYROX(2) ALS OVERLAY DER VARIABLE GYROX!
Wie im Post #24 geschrieben, könnte man auch SOWAS machen:


gyrox = tmp_gyrox(1) * 256
gyrox = gyrox + tmp_gyrox(2)

Das SOWAS deutet darauf hin, dass dies keine exakte Lösung darstellt, sondern lediglich einen Lösungsweg --> Evtl. mal das probieren:


gyrox = tmp_gyrox(2) * 256
gyrox = gyrox + tmp_gyrox(1)

Sollte funktionieren, wenn nicht gibts irgendwo anders noch nen Fehler.

Gruß
Chris

Der Einsteiger
06.11.2013, 20:38
also irgendwie komme ich mir veralbert vor, wenn ich mehrmals die Lösung poste und es immer wieder nicht umgesetzt wird und dann gefragt wird, warums nicht funktioniert...
He, das verstehe ich nicht ? Ich habe es doch so gemacht wie du meintest ?
Außer du meinst das :
DEFINIERE TMP_GYROX(2) ALS OVERLAY DER VARIABLE GYROX
Wie soll ich das denn schreiben ? : Dim TMP_GYROX(2) As Overlay of Gyrox ? oder wie?


Bist du weitergekommen mit dem Sensor? Hab mir jetzt den gleichen gekauft und stehe vor dem selben Problem
Das ist ja schön zu hören, dass nicht nur ich vor dem Problem stehe. Ich habe seit dem es nicht mehr versucht, da es einfach nicht funktionieren wollte und mir der Sensor dann doch nicht so wichtig war......

Che Guevara
06.11.2013, 21:18
Hi,

ja genau, das mit dem Overlay meinte ich ;)
So:


Dim Gyrox As Integer
Dim Tmp_gyrox(2) As Byte At Gyrox Overlay


So sollte es funktionieren.

Gruß
Chris