LSM303DLH an Arudino Pro mini 5V

Hallo zusammen,

ich möchte gerne einen Headtracker für den FPV Flug bauen und habe mir den LSM303DLH zugelegt. Leider bekomme ich keine Ausgaben bei dem Beispiel von GitHub - ryantm/LSM303DLH: This library is no longer recommended. It has been superseded by https://github.com/pololu/lsm303-arduino (Serial). Es hängt wohl bei compass.enable();

Jemand eine Idee?

Ich habe den: http://www.hobbytronics.co.uk/tilt-compensated-compass brauche ich noch den dafür http://www.hobbytronics.co.uk/logic-level-converter?

Wie muss ich den Converter dazwischenlöten?

Ok, man muss wohl mit dem Konverter arbeiten. Wie muss er denn drann?

So???

Arduino A5->TXO->RXI->SCL ?? Kanal1
Arduino VCC>HV->LV->VIN kanal2
Arduino GND->GND->GND->GND Kanal2
Arduino A4->TXO->RXI->SDA ?? Kanal3

  • das Sparkfun board für dem LSM303 kommt, wie Du gesehen hast, leider ohne die Levelconverter. Deshalb macht es Sinn, das Sparkfun breakout mit so etwas wie einem 3.3V Arduino zu betreiben.

Ein deutlich leichter einsetzbares Design für den LSM303 gibt es übrigens von Pololu, siehe etwa hier http://www.lipoly.de/index.php?main_page=product_info&products_id=165628. Dort findet sich auch ein Schaltplan, der Dir zeigt, wie so ein Teil via Levelconverter angeschlossen wird (und was es sonst noch braucht, um zu funktionieren).

Ich nehme aber an, dass Du die Levelkonverter von Sparkfun hast, und damit jetzt Deine Schaltung aufbauen willst. Deshalb hier eine kurze Anleitung, wie diese Levelkonverter funktionieren:

  • den "HV" bezeichneten Eingang des Levelkonverters (auf der "HV"-Seite) verbindest Du mit den 5V vom Arduino.
  • an den "LV" bezeichneten Eingang des Levelkonverters (der liegt gegenüber, auf der "LV"-Seite) legst Du Deine 3.3V Versorgungsspannung.
  • Die SDA Leitung vom Arduino legst Du an einen der mit "TXO" bezeichneten Eingänge des Levelkonverters auf der "HV"-Seite.
  • Es ist noch ein "TXO" Anschluss frei (auf der "HV" (high voltage) Seite - dort kommt der SCL-Anschluß vom Arduino dran.
  • Auf der jeweils gegenüberliegenden "LV" (low voltage) Seite stehen Dir dann die entsprechenden SDA/SCL-Signale mit 3.3V an den jeweiligen "TXI"-Buchsen zur Verfügung.

Man beachte, dass der Levelkonverter selber keine GND-Verbindung braucht, um zu funktionieren! Wie der Levelkonverter funktioniert (ein wirklich kleveres Design!) kann man übrigens in einer alten Philips-Apnote nachlesen (habe leider den Link gerade nicht parat - aber Deine Standardsuch-Maschine sollte helfen).

Natürlich: es ist trotzdem noch eine GND-Verbindung zwischen dem 5V und dem 3.3V-Kreis erforderlich. Diese kann auch über die zwei mit "GND" bezeichneten Anschlüsse erfolgen, falls gewünscht, da die intern auf dem Levelkonverter direkt miteinander verbunden sind.

Ich persönlich bevorzuge allerdings eine separate gemeinsame Masseschiene, bei mir bleiben also außer den oben beschriebenen 4 Anschlüssen alle anderen Anschlüsse des Levelkonverters unbeschaltet.

Wenn ich Deine Verbindungsübersicht richtig interpretieren, sollte Deine Verdrahtung stimmen, aber überprüfe das nochmal anhand der obigen Beschreibung.

  • cpixip

Danke für deine Ausführliche Antwort. Ich habe alles genau so verbunden. In der Konsole rauschen aber bei allen Werten nur "0" durch. :frowning:

hmmm... - versuche mal, SDA und SCL miteinander zu vertauschen. Ich zumindest verkabelt das gerne mal falsch herum. Nur Nullen deutet darauf hin, dass garnichts empfangen wird. Sind die I2C-Adressen richtig?

Ich würde zudem mal einen I2C-scanner einsetzen um zu sehen, ob sich der Chip überhaupt meldet.

Hier ist einer zu finden: http://todbot.com/arduino/sketches/I2CScanner/I2CScanner.pde. Es sollten sich bei einem Scan zwei Adressen melden, jeweils eine Adresse für den Beschleunigungsmesser und eine für den Kompass.

Achtung: dieser Sketch arbeitet mit Decimalzahlen in der Anzeige, während die meisten Datenblätter die Adressen im HEX-code angeben. Also nicht wundern, wenn da "komische" Werte ausgegeben werden - man muß die halt entsprechend umrechnen....

Falls sich bei I2C-Scan nichts meldet, würde ich empfehlen, die komplette Verdrahtung, also alle Signal- und Versorgungsleitungen, genau zu überprüfen. Falls dort kein Fehler gefunden wurde, würde ich in einen zweiten Schritt einen anderen I2C-Chip an den I2C-Bus hängen, von dem Du definitiv weißt, dass er funktioniert. Dann nochmals den I2C-Scan laufen lassen. Falls dieser IC dann im Scan auftaucht, könnte dies ein erster Hinweis auf einen defekten LSM303 sein.

Falls sich hier aber immer noch nichts tut, bleibt nur nochmals, die gesamte Verdrahtung zu überprüfen, zunächst auf Korrektheit, anschließend auf Wackelkontakte. Manchmal hilft es auch, die Verdrahtung komplett neu aufzubauen.

Eine Alternative wäre natürlich, die Signale auf dem I2C-Bus mittels eines Oszilloskops zu überprüfen. Das ist die beste und schnellste Methode - setzt aber den Zugang zu einem Oszi voraus.

Viel Spass/viel Glück.

Die Ausgabe:

I2CScanner ready!
starting scanning of I2C bus from 1 to 100...
addr: 1       	addr: 2       	addr: 3       	addr: 4       
addr: 5       	addr: 6       	addr: 7       	addr: 8       
addr: 9       	addr: 10       	addr: 11       	addr: 12       
addr: 13       	addr: 14       	addr: 15       	addr: 16       
addr: 17       	addr: 18       	addr: 19       	addr: 20       
addr: 21       	addr: 22       	addr: 23       	addr: 24       
addr: 25       	addr: 26       	addr: 27       	addr: 28       
addr: 29       	addr: 30       	addr: 31       	addr: 32       
addr: 33       	addr: 34       	addr: 35       	addr: 36       
addr: 37       	addr: 38       	addr: 39       	addr: 40       
addr: 41       	addr: 42       	addr: 43       	addr: 44       
addr: 45       	addr: 46       	addr: 47       	addr: 48       
addr: 49       	addr: 50       	addr: 51       	addr: 52       
addr: 53       	addr: 54       	addr: 55       	addr: 56       
addr: 57       	addr: 58       	addr: 59       	addr: 60       
addr: 61       	addr: 62       	addr: 63       	addr: 64       
addr: 65       	addr: 66       	addr: 67       	addr: 68       
addr: 69       	addr: 70       	addr: 71       	addr: 72       
addr: 73       	addr: 74       	addr: 75       	addr: 76       
addr: 77       	addr: 78       	addr: 79       	addr: 80       
addr: 81       	addr: 82       	addr: 83       	addr: 84       
addr: 85       	addr: 86       	addr: 87       	addr: 88       
addr: 89       	addr: 90       	addr: 91       	addr: 92       
addr: 93       	addr: 94       	addr: 95       	addr: 96       
addr: 97       	addr: 98       	addr: 99       	addr: 100       

done

Bei 19200 Baud...

Sagt mir jetz aber irgendwie nichts...

wie schon befürchtet: kein einziges IC hat sich gemeldet - dann würde nämlich an einer der Adressen ein "found" auftauchen.

Also hast Du entweder:

  • die Sache nicht richtig verdrahtet,
  • den Pegelwandler falsch angeschlossen/gekillt, oder
  • oder Deinen LSM303 verbraten.

... - the choice is yours.

Zur Sicherheit, dass die Verkabelung stimmt, anbei nocheinmal ein Photo, wie so etwas aussehen sollte. Würde vorschlagen, jedes einzelne Kabel zu testen, auch mit einem Multimeter die Betriebsspannungen nicht vergessen. Eigentlich ist I2C super einfach - zumindest sollte sich der Chip melden, wenn der Scanner danach sucht....

Habe alles so wie du, nur keinen 3,3 V Regulator, dachte das macht der Pegelwandler.

Ich danke dir aber schon mal für deine Mühe. Ich werde nun alle Kabel checken und mir sonst den Sensor auf dem anderen Board bestellen.
Auf dem Pegelwandler gehen ja 5V auf HV rein. Auf der anderen Seite kann ich aber nur 0,2 bis 0,3V messen.

]:smiley: ... - nein, der Pegelwandler macht gar nichts mit der Betriebsspannung! Wie sollte er das? Schon mal das Schaltbild des Pegelwandlers (gibt's bei Sparkfun http://www.sparkfun.com/datasheets/BreakoutBoards/Level-Converter-v10.pdf) angeschaut? Der setzt nur die Logic-Level um, sonst nichts. Oder, um es deutlich zu sagen: Der Pegelwandler liefert keinerlei 3.3V Betriebsspannung!

Also, das Problem Deiner Schaltung ist: Dein Chip bekommt keine Betriebsspannung - kann also gar nicht funktionieren....

Du mußt entweder, wie ich auf dem Bild, einen 3.3V Drop-Down-Regler verwenden,um die 5V des Arduinos herunterzuregeln, oder ggf. die 3.3V Betriebsspannung des Arduino's nehmen, um Dein 3.3V IC zu betreiben.

Da Du vermutlich keinen 3.3V-Regler greifbar hast, würde ich Dir letzteres vorschlagen.

Dazu einfach von der entsprechenden Arduino-Buchse ein Kabel auf Deine 3.3V "LV"-Schiene legen. Alles andere müßtest Du so lassen können. Aber die GND-Quer-Verbindung nicht vergessen!

Der 3.3V Arduino-Ausgang kann keine hohen Ströme liefern (deshalb habe ich hier einen 3.3V-Regler verwendet), aber für einen LSM303 ist der durchaus ausreichend. Sobald Du Deinen Chip mit der richtigen Betriebsspannung versorgst, solltest Du im I2C-Scanner valide Adressen finden, und später in Deinem ursrprünglichen Programm auch nicht nur Nullen... :wink:

Und ja: beim nächsten Mal würde ich entweder einen Arduino Pro Mini 3.3V oder das bessere LSM303-Design nehmen, in dem Spannungsregler und Pegelkonverter schon integriert sind.

Mmmh, habe ich dich nun richtig verstanden, das mein 5V Ardu auch einen 3,3V Ausgang hat? Welcher Pin ist das denn?

uh, sorry. Hatte den Thread-Titel nicht mehr in Erinnerung... - der "normale" Arduino hat einen 3.3V Ausgang, direkt neben dem 5V-Ausgang. Du hast aber gar keinen normalen Arduino. Dein "Arduino Pro Mini 5V" hat leider keinen 3.3V-Ausgang. Damit funktioniert mein Vorschlag natürlich auch nicht für Dich.

Ich würde mir im Elektronikladen um die Ecke einen 3.3V-Regler besorgen, die kosten fast nichts und sind immer gut zu gebrauchen; die meisten Sensoren heutzutage funktionieren nicht mit 5V Betriebsspannung. Deswegen gibt's ja häufig die breakout-boards mit Pegelwandler und Spannungsregler, um die einfach in der Arduino-Welt, die doch eher auf 5V beruht, einzusetzen.

Ggf. würde ich mir überlegen, einen Arduino Pro Mini 3.3V einzusetzen, dann hast Du den ganzen Ärger mit Pegelwandlung und Betriebsspannung nicht beim Einsatz von 3.3V-Sensoren. Einzig Nachteil ist die reduzierte Taktfrequenz von nur 8MHz. Im praktischen Gebrauch macht sich das aber kaum bemerkbar.

Aber der http://www.sparkfun.com/products/8745 kann doch schon, so wie ich ihn verlötet habe, aus 5V 3,3V machen.

Hallo Heckmic - nein, kann er nicht. Steht auch nirgendwo, dass er das kann, wenn ich mich nicht irre. Der Levelshifter (insbesondere der von Sparkfun, den ich ja auch in meinem Aufbau verwendet habe) passt lediglich die Logikpegel auf den I2C-Signalleitungen an. Aber er versorgt nicht die am I2C-Bus angeschlossenen Geräte mit irgendeiner Betriebsspannung.

Schaue Dir mal bitte die folgende Philips-Appnote an, in der die Funktion eines Levelshifters beschrieben wird (http://www.kip.uni-heidelberg.de/lhcb/Publications/external/AN97055.pdf), insbesondere die Seite 10 unten. Damit der Levelshifter funktioniert, braucht er auf der 3.3V Seite entsprechende Pull-Up Widerstände, welche die Signalleitung gegen die 3.3V Betriebsspannung ziehen, wenn keine Aktivität auf den I2C-Leitungen ist.

Du brauchst also unbedingt eine externe Betriebsspannung von 3.3V, um den Levelshifter in Betrieb zu nehmen. Wie die angeschlossen wird, habe ich weiter oben beschrieben. Bei Deiner "Beschaltung" bekommt - das hast Du ja selbst gemessen - der Sensor gar keine Betriebsspannung, kann also nicht funktionieren.

Wie gesagt, einen 3.3V Spannungsregel gibt es für wenige Euro in jedem Elektronikladen um die Ecke.... :wink:

Schade das auf dem Foto die Kabelverläufe teilweise nur ausschnittsweise zu sehen sind !

naja, das Photo hatte ich gerade rumliegen. Aber immerhin habe ich ja die wichtigen Kabel beschriftet, sollte also kein Problem sein, die Verkabelung zu reproduzieren. Hier nochmal (vom Anfang des Threads) zusätzlich das Ganze als Textbeschreibung:

  • den "HV" bezeichneten Eingang des Levelkonverters (auf der "HV"-Seite) verbindest Du mit den 5V vom Arduino.
  • an den "LV" bezeichneten Eingang des Levelkonverters (der liegt gegenüber, auf der "LV"-Seite) legst Du Deine 3.3V Versorgungsspannung.
  • Die SDA Leitung vom Arduino legst Du an einen der mit "TXO" bezeichneten Eingänge des Levelkonverters auf der "HV"-Seite.
  • Es ist noch ein "TXO" Anschluss frei (auf der "HV" (high voltage) Seite - dort kommt der SCL-Anschluß vom Arduino dran.
  • Auf der jeweils gegenüberliegenden "LV" (low voltage) Seite stehen Dir dann die entsprechenden SDA/SCL-Signale mit 3.3V an den jeweiligen "TXI"-Buchsen zur Verfügung.

Man beachte, dass der Levelkonverter selber keine GND-Verbindung braucht, um zu funktionieren!

Hoffe, das beseitigt nun alle Unklarheiten... :wink:

Hi I Can confirm that using the sparkfun level converter works with the LSM303DLH on a Arduino Uno and stuff

https://picasaweb.google.com/lh/photo/AIiOfELj07YYfxNzte1jWfUyuJg5fbvJpQtmBljJuuk?feat=directlink

Thanks Sirion - as one can see in the image your second link is pointing to, it is really easy wiring.

  • cpixip

zum I2C-Scanner:

Setze mal in dem Sketch den Wert der zu suchenden Adressen von 100 auf 112 bzw. 126, es gibt nämlich mehr als nur 100 Adressen.
Ich habe dann bei 106 etwas gefunden.
Vielleicht klappts dann..

Gruß

Andreas

Die moeglichen Adressen gehen von 1 bis 127.
Ich weiss nicht wieso der I2C-scanner nur bis 100 sucht.
Gruesse Uwe