MK3mag mit arduino auslesen

Hallo ich möchte heading, Tilt und Roll mit den MK3Mag von mikrokopter beim Arduino über I2C auslesen, jedoch bin ich etwas am verzeifeln, da ich irgendwie keine Datasheets dazu finde, also welche Adressen ich verwenden muss für die I2C Kommunikation. ich habe herausgefunden, dass die SlaveAdresse wohl: 0x3c sein soll, kann das sein ? Hab das von dieser Info aus dem FMk Forum:

"Der in der NavCtrl 2.0 verbaute HMC5843 benutzt die gleiche I2C Slave Adresse "The default (factory) HMC5843 7-bit slave address is 0x3C for write operations, or 0x3D for read operations." http://www51.honeywell.com/aero/common/documents/myaerospacecatalog-documents/Defense_Brochures-documents/HMC5843.pdf"

Damit müsste ich schonmal den Compass ansprechen können oder ? , aber wie sieht es mit den anderen Adressen aus, z.b. für die Wire.write Operation, da finde ich nichts zu..

Ich wollte in etwa so einen Code verwenden: http://wiring.org.co/learning/libraries/hmc6343sparkfun.html

Und woher soll ich wissen wie die Packete ankommen, indem Beispiellink kommen die Pakete ja 2 geteilt an sodass man sie am Ende zusammenfügen muss, ob das beim MK3MAg auch so ist oder gar ganz anders.. diese Infos fehlen mir. Die Magnetsensoren die auf MK3Mag verbaut sind KMZ51. Habe dazu zwar Datasheets gefunden aber nichts wo Infos zu slaveadressen usw. aufgeführt sind, wie das schön bei den anderen Compassmodulen gibt.

SCL ist an Analog A5 und SDA an Analog A4 angeschlossen.

Für eure Hilfe wäre ich dankbar.

Findest Du Adressen wenn Du mit I2C Scanner suchst? Hast Du pullup-Widerstände auf SDA und SCK geschaltet? Wie viel Kabel ist zwischen Arduino und dem MK3mag?

https://github.com/MartyMacGyver/Arduino_I2C_Scanner/blob/master/I2C_Scanner/I2C_Scanner.ino

Grüße Uwe

uwefed: Findest Du Adressen wenn Du mit I2C Scanner suchst? Hast Du pullup-Widerstände auf SDA und SCK geschaltet? Wie viel Kabel ist zwischen Arduino und dem MK3mag?

https://github.com/MartyMacGyver/Arduino_I2C_Scanner/blob/master/I2C_Scanner/I2C_Scanner.ino

Grüße Uwe

Da kommt I2C device Found at address 0x28! Mehr kommt da nicht, ist das meine Adresse mit der ich den Kompass ansprechen kann ? Pullupwiederstände habe ich keine eingebaut, könnten aber schon aufm MK3mag drauf sein ? Kabellänge ist etwa 17 cm.

MKMag leuchtet durchgehend Grün (scheint also in Ordnung zu sein)

OK es hat anscheinend geklappt, durch den I2C Scann konnte ich die SlaveAddresse für das MK3Mag Kompassmodul heraus finden was 0x28 ist, ein Shifting nach rechts um 1 war dabei nicht notwendig, (klappt auch nicht).

ich hatte zwar gestern den ganzen Tag im Netz nach weiteren SlaveAdressen gesucht z.b. für die Write() Funktion um gewisse Infos abrufen zu können, konnte aber dann erst heute nochmal nach einer erneuten Suche im Internet fündig werden. Habe jetzt die komplette Liste. die MSB und LSB Datensektionen müssen jeweils seperat abgerufen werden, nicht so wie bei anderen Compass Modulen wo sie mit einem Befehl komplett abgerufen werden. Hat aber auch was parktisches glaub ich. Der Serial Monitor blieb nach kurzer Zeit stehen, hab dann die Delay Zeit von 2 auf 4 ms erhöht dann blieb nichts mehr stehen.

Vielen dank für die Hilfe, aber eine Frage hätte ich noch, was bringt der Pullupwiderstand an SCL/SDA ? stabilisiert er die Daten ?

Könnten Pull Up Widerständen schon im MK3Mag drinn evrbaut sein ? Hier der Schaltplan: http://gallery.mikrokopter.de/main.php/v/tech/MK3MAG_V1_1_SCH.jpg.html?g2_imageViewsIndex=2

Damit sich die Geräte am I2C -Bus nicht gegenseitig kaputmachen habes sie einen Open Kollektor bzw Open Drain Ausgang. Dieser kann die Signalleitung nur auf Masse ziehen. Damit man auch ein HIGH Signal hat nimmt man einen Pullupwiderstand. Werte zwischen 20kOhm und 2,2KOhm sind üblich. Der Widerstand muß umso kleiner sein je länger die Signalleitung ist und je mehr Geräte angeschlossen sind.

Grüße Uwe

Hallo, ich kann da keine Widerstände entdecken. Gruß und Spaß Andreas P.S. hier was zum lesen http://tronixstuff.com/2010/10/20/tutorial-arduino-and-the-i2c-bus/

Es kann sein, dass die Wire Klasse da die sehr schwachen internen Pullups des Atmega aktiviert hat. Damit kann auf kurze Entfernung vielleicht was gehen. Aber das Signal wird nicht gut sein: http://www.gammon.com.au/forum/?id=10896&reply=5#reply5

Normal sind 4,7k

Eine Frage hätt eich doch noch, will jetzt das Compass Programm komplett zuEnde schreibe und beim MK3Mag sind ja wie ich ich gesagt hatte die MSB und LSB jeweils unter einzelnen Addressen aufgteilit,

Beispiel:

define MAG_KOORDINATEN_X_MSB 0x03

define MAG_KOORDINATEN_X_LSB 0x04

was ist in MSB und LSB enhalten, beides musss ich ja benutzten oder zusammenfügen um die [u]vollen[/u] Werte zu haben

bishe habe z.b. die X Daten von MSb ausgegeben, um zu testen ob es überhauot geht, jetzt will ich das richtig zusammenfügen.

LSB = least significant byte (manchmal auch bit)
MSB = most significant byte

Also einfach was das höherwertigere und was das niederwertigere Byte ist. Dafür gibt es word():
http://arduino.cc/en/Reference/WordCast

Oder man machst es per Hand:

byte low = ...
byte high = ...
unsigned int value = ((unsigned int)high << 8) | low;

Was anderes macht word() auch nicht

ok danke, noch ne Frage, wenn ich

Wire.requestFrom(slaveAdresse, 3);

mache, muss ich dann wie oben angegeben 3 angeben ? also 3 für 3 byte steht das glaub oder ? so ein MSB liefert doch 3 Bytes ? oder reichen schon 1 Byte ? weil es ja 8 Bit zurück gibt ?

Heading müsste dann x achse sein, und pitch und roll ?

ich bekomm nur werte von 2-266 angezeigt hmm.. müssten es nicht 0-360 sein ?

Die willst doch zwei Bytes auslesen, oder? Das ist die Anzahl der Bytes vom Slave geschickt werden sollen. Also 2 wenn du danach zweimal read() machst.

Ist es normal dass er mir nur Werte zwischen 2-266 ausspuckt ? muss ich das ganze dann selbe auf 360 hoch scalen , also hoch mappen mit der map() Funktion ?

Hallo, "muss ich das ganze dann selbe auf 360 hoch scalen" Kommt darauf an, was Dein "Kompass" liefert. Vielleicht ist es nur ein SchleppFehler, oder er gibt GON/Artillerie-Promille aus. Mußt mal ins Datenblatt schauen.

2 bis 266 sieht mir aber eher nach einem "RechenFehler aus" Gruß und Spaß Andreas

Mhhh, das ist noch etwas komplizierter. Schau dir mal das Datenblatt genau an:

The value stored in these two registers is a 16-bit value in 2’s complement form, whose range is 0xF800 to 0x07FF

Das heißt man da sind auch negative Zahlen möglich und man sollte es eher so machen:

int value = ((unsigned int)high << 8) | low;

Also das unsigned links weglassen!

signed int ist im Zweierkomplement, dann könnte es glaube ich passen. Der Cast auf unsigned int auf der rechten Seite ist dazu dass man den Wert auch wirklich 8 Stellen nach links schieben kann. Der passt.

Wobei das deinen Fehler hier glaube ich nicht erklärt.

SkobyMobil: Hallo, "muss ich das ganze dann selbe auf 360 hoch scalen" Kommt darauf an, was Dein "Kompass" liefert. Vielleicht ist es nur ein SchleppFehler, oder er gibt GON/Artillerie-Promille aus. Mußt mal ins Datenblatt schauen.

2 bis 266 sieht mir aber eher nach einem "RechenFehler aus" Gruß und Spaß Andreas

Das ist es ja, ich habe kein Datenblatt, habe aber Stundenlang gesucht, bin Froh, dass ich überhaupt auf die Addressen gestoßen bin durch Zufall.

Ich bekomme jetzt werte sowohl im + als auch im - bereich von max 327.

ist das Normal, müssten es nicht so 360 sein ?

Das kommt wirklich darauf an was du für einen Sensor hast.

Der HMC5843 z.B. gibt nicht den Winkel in Grad aus. Sondern die magnetische Feldstärke in der Richtung. Abhängig von einer einstellbaren Verstärkung. Dann kann man die Stärke für jede Achse auslesen. Den Rest muss man selbst berechnen.

Der HCM6343 dagegen rechnet das schon intern aus und gibt die Abweichung in Zehntel-Grad aus

Hallo, das könnte der KMZ-51 sein…

http://www.produktinfo.conrad.com/datenblaetter/175000-199999/182826-da-01-en-KMZ51_Magnetfeldsensor.pdf

http://www.mikrokopter.de/ucwiki/MK3Mag_Aufbau?action=CreatePdfDocument&generate=1

http://www.mikrokopter.de/ucwiki/MK3Mag?action=CreatePdfDocument&generate=1 Gruß und Spaß Andreas

SkobyMobil:
Hallo,
das könnte der KMZ-51 sein…

http://www.produktinfo.conrad.com/datenblaetter/175000-199999/182826-da-01-en-KMZ51_Magnetfeldsensor.pdf

http://www.mikrokopter.de/ucwiki/MK3Mag_Aufbau?action=CreatePdfDocument&generate=1

http://www.mikrokopter.de/ucwiki/MK3Mag?action=CreatePdfDocument&generate=1
Gruß und Spaß
Andreas

Ja das ist der genau und es sind 3 KMZ-51 Sensoren eingebaut.

Das kommt wirklich darauf an was du für einen Sensor hast.

Der HMC5843 z.B. gibt nicht den Winkel in Grad aus. Sondern die magnetische Feldstärke in der Richtung. Abhängig von einer einstellbaren Verstärkung. Dann kann man die Stärke für jede Achse auslesen. Den Rest muss man selbst berechnen.

Der HCM6343 dagegen rechnet das schon intern aus und gibt die Abweichung in Zehntel-Grad aus

Achso, das wusste ich nicht, jetzt stellt sich die Frage woher ich diese Info für den MK3Mag/KMZ-52 Seonsor her bekomme. Die Neigungskompensatione scheint auch nicht zu gehen, (kann mich aber auch total irren) evtl wird das dann alles von der Software auf der Flightsctrl gemacht… wenn ja dann müsste ich ja evtl eine eigene Neigungskompensation mit dem Arduino basteln, oje^^