RasPi und HDMM01

Hi,

Ich bin seit einigen Tagen stolzer Eigentümer eines Raspberry Pi.

Damit das Teil mehr ist als ein kleiner Rechner wollte ich mal ein Gerät an den I²C-Bus hängen und da lag dieser HDMM01 von Pollin, ein Kompaß-Modul. Flugs das Teil an den Stecker adaptiert:

3.3V, SDA, SDC und Gnd keine Pull-Ups oder -Downs, denn lt. gibt es da schon Pull-Ups.

Wenn ich das Modul 'draufstecken habe, erkennt "i2cdetect 1" ein Gerät auf Adresse 0x30, ziehe ich es ab, ist das Gerät fort, also vermute ich, daß das Modul tatsächlich antwortet, obwohl der lt. Handbuch die Adresse

0x60 haben sollte ...

Auch wenn ich ein kleines Testprogramm mit dieser Adresse verwende, bekomme ich Fehlermeldungen, wenn das Modul nicht steckt (mal ohne Fehlerbehandlung).

Das Testprogramm macht i.W.

fd = open("/dev/i2c-1", O_RDWR); ioctl(i2c, I2C_SLAVE, 0x30UL);

und schickt dann mit "write(i2c, cmd, 1)" Kommandos wie

04 RESET 02 SET 01 TM Aber, egal was ich mache, ich bekomme nach eine TM nie irgendetwas, was sich ändert, wenn ich den RasPi mit dem Modul aufnehme und drehe.

Hat jemand das schon mal gemacht? Die Beschreibung von Pollin ist ja alles andere als lesbar. Vermutlich, wenn man es versteht, ergibt es einen Sinn, aber wenn man, wie ich, nicht so richtig weiß, wie's geht, hilft die Beschreibung auch nicht wirklich.

Das ist so frustig!

Josef

Reply to
Josef Moellers
Loading thread data ...

Das klingt schonmal nicht so gut, wie wenn ein Bit zuviel gesendet wird, was aber auch wieder merkwürdig wäre, da dann das Acknowledge nicht funktionieren würde. Ist das Kabel zu lang? Hast du ein Link zu einem Datenblatt?

Was für ein Datentyp ist cmd? Wenn das z.B. ein char ist (was ich wegen der 1 annehme), dann musst du natürlich &cmd schreiben. Generell immer mit "-Wall" compilieren und versuchen alle Warnungen zu beheben.

Wenn du mehr als ein Byte zwischen Start/Stop schicken willst, musst du ein Array nehmen. Auf meiner Webseite für meinen IO-Expander habe ich verschiedene Beispiele, u.a. in C, was auf dem Raspberry Pi läuft (klar, denn am Linux-Treiber habe ich ja mitentwickelt, bin jetzt sogar im Linux-Kernel verewigt :-)

formatting link
) , ebenso wie das Python-Beispiel, um einen PCA9555 anzusprechen:

formatting link

--
Frank Buss, http://www.frank-buss.de
electronics and more: http://www.youtube.com/user/frankbuss
Reply to
Frank Buss

Was noch eine einfache Erklärung sein könnte: manchmal nehmen es die Hersteller nicht so genau mit der I2C-Spezifikation und basteln das write-Bit mit ins erste Byte rein, was dann zur Adresse 0x60 in der Beschreibung führt, obwohl es vom I2C-Standard her gesehen Adresse 0x30 ist, gefolgt von einem 0-Bit für Write.

--
Frank Buss, http://www.frank-buss.de
electronics and more: http://www.youtube.com/user/frankbuss
Reply to
Frank Buss

Am 24.09.2012 21:34, schrieb Josef Moellers:

Der I²C-Bus bietet einen 7-Bit-Adressbereich an. Wenn Du also das Gerät auf Adresse 0x30 ansprechen willst, musst Du nach der Startbedingung

0x60 oder 0x61 senden. M.W. hat sich die kurze Adresse (0x30) im Linuxumfeld durchgesetzt. Also passt das so.

Gruß Gunther

Reply to
Gunther Mannigel

Das Kabel kann nicht zu lang sein, weil das ganze direkt auf dem Pfostenstecker des RasPi sitzt.

Nee, das paßt schon. Zwischen copy und paste ist ein Zeichen verlustig gegangen.

Ich hab' mir meine Sporen im LILO gewonnen, und jetzt setzt den keiner mehr ein :-(

formatting link

Inzwischen bin ich übrigens einen Schritt weiter: ich muß immer erst eine Adresse und dann die Daten schreiben oder lesen:

unsigned char cmd[2], response[5];

cmd[0] = 0x00; cmd[1] = 0x02; // SET write(i2c, cmd, 2); usleep(1000); cmd[1] = 0x04; // RESET write(i2c, cmd, 2); usleep(5000); cmd[1] = 0x01; // TM write(i2c, cmd, 2); usleep(5000); write(i2c, cmd, 1); // Nur Adreßbyte read(i2c, response, 5);

Die Idee bekam ich beim Lesen dieser Seite:

formatting link

Jetzt bekomme ich zwar "vernünftige" Werte, die ändern sich nur nicht wirklich, auch wenn ich den RasPI drehe (phi = atan2(y, x)):

00 08 57 07 80 x=2135 y=1920 phi=0.732 00 08 58 07 80 x=2136 y=1920 phi=0.732 00 08 57 07 80 x=2135 y=1920 phi=0.732 00 08 59 07 7f x=2137 y=1919 phi=0.732 00 08 4d 07 86 x=2125 y=1926 phi=0.736 00 08 2f 07 5c x=2095 y=1884 phi=0.732 00 07 d9 07 7e x=2009 y=1918 phi=0.762 00 08 06 07 5c x=2054 y=1884 phi=0.742 00 08 92 07 bc x=2194 y=1980 phi=0.734 00 08 8d 07 ff x=2189 y=2047 phi=0.752 00 08 90 07 d7 x=2192 y=2007 phi=0.741 00 08 5d 07 6f x=2141 y=1903 phi=0.727 (Bei den Werten habe ich das Ganze einmal um 90° hin und her gedreht)

Ich könnte mir jetzt noch vorstellen, daß die Nähe der doch recht hochfrequenten Schaltung störend wirkt, da muß ich dann doch etwas Abstand schaffen. Oder ich muß mal sehen, ob ich einem Kollegen einen LM75 aus dem Kreuz leiern kann ;-)

Danke aber trotzdem,

Josef

Reply to
Josef Moellers

Die Werte sind normal, denn solche Magnetfeldsensoren sind meist nicht allzu genau und müssen kalibriert werden. Einmal drehen, Knopf drücken für min/max-Wert Speicherung, danach dann z.B.:

xCenter = (xMax - xMin) / 2 + xMin; xDelta = xMax - xMin; float x = (xSensor - xCenter) / xDelta;

dasselbe für y und dann atan2. Ich rechne auch immer gerne das Ergebnis vom Bogenmaß in Grad um, da ich mir unter 0-360 mehr vorstellen kann.

Die Entmagnetisierungsprozedur brauchst du übrigens nur selten, am besten dann, wenn die Kalibrierungsprozedur keine sinnvollen Bereiche mehr liefert.

Wenn du es dann grafisch anzeigen willst: z.B. /opt/vc/src/hello_pi/hello_triangle als Basis nehmen.

--
Frank Buss, http://www.frank-buss.de
electronics and more: http://www.youtube.com/user/frankbuss
Reply to
Frank Buss

Ist gut, daß wir 'drüber gesprochen haben. Und ich dachte, für 6,95? bekomme ich ein hochgenaues Präzisions-Meßgerät!

Mal Deinen Tip angewandt: # define xMin 1864.0 # define xMax 2157.0 # define yMin 1921.0 # define yMax 2145.0

Und ... kaum macht man's richtig, funktioniert's! Jetzt bekomme ich tatsächlich reproduzierbare Winkel ...

... zwischen -180° und +180°.

Ich habe den RasPI erst mal nur über's Netz angeschlossen, kein Display, keine Tastatur/Maus. Ich stamme noch aus einer Zeit, wo Grafik nur 'ne Kunstrichtung war ;-)

Nochmals vielen Dank für die Hilfe!

Josef

Reply to
Josef Moellers

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.