i2c Sensor Erkennungsproblem

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo,

    Der Sensor, den ich an meinen Pi anschliessen möchte, ist ein Infrarot Distanzsensor von Sharp mit I2C:
    https://solarbotics.com/product/35080/ (mit einer fixen Adresse programmiert)
    Er läuft mit 5V und hat eine Clock Frequenz von 100 kHz. Somit habe ich die angehängte Schaltung realisiert, um die Data und Clock leitungen von 5V auf 3.3V zu bringen. (Weil der Pi bei 5V beschädigt wird)

    Die Leitungen sollte ich richtig an den GPIOs angeschlossen haben. Die Messung zeigt, dass am Sensor bei Vcc, SDA, SCL jeweils 4.7V anliegt. Das sollte reichen, dass er funktioniert.

    Nach der i2c-Konfiguration auf dem Pi habe ich den Befehl (sudo i2cdetect -y 1) eingegeben, aber es wird kein Sensor erkannt (keine Adresse)

    Ich aktiviere i2c dabei mit:

    Code
    sudo modprobe i2c-dev
    sudo chmod o+rw /dev/i2c*

    Wo könnte der Fehler liegen? eher ein Hardware, oder ein Software problem?
    Hat schon jemand Erfahung mit diesem Sensor gemacht?

    Vielen Dank für jeden Hinweis
    Lg Lukas

  • Der I2C-Bus ist ein Open-Collector Bus. Die Spannungen richten sich nach der Spannung an den Pullup-Widerständen.
    Der Sensor hat keine Pullup-Widerstände, die vom Pi liegen an 3,3Volt, Du kannst die Pegelwandlung weglassen.

    Für die Fehlersuche währe es hilfreich wenn Du mit einem Oszilloskop nachsehen könntest ob der Pegelwandler auch wirklich funktioniert.
    Welche FETs hast Du denn für den Wandler benutzt?

    Einmal editiert, zuletzt von orb (4. Juli 2013 um 14:13)


  • ... Der Pi legt den Pegel auf den Leitungen auf 3,3Volt fest.

    Wo kommen die Pull-up Widerstände hin? Könnte es sein, dass die Pull-ups bereits im Pi drinn sind?
    Und würde es etwas bringen, wenn ich die beiden 10kOhm Widerstände auf der VDD1 Seite (Siehe Grafik oben) entferne?

    Wären die 3.3V nicht zu wenig für einen High Pegel beim Sensor? (der braucht ja ca. 0.7*5V=3.5V für einen high-Pegel). Sonst kann ja der Master gar nicht mit dem Slave kommunizieren ;)

    Einmal editiert, zuletzt von Lukasibk (4. Juli 2013 um 19:16)

  • Du kannst die SDA+SCL vom Sensor direkt an den Pi anschließen auch wenn der Sensor mit 5Volt versorgt wird. Der Pi legt den Pegel auf den Leitungen auf 3,3Volt fest.

    Hi orb ... Du wandelndes Lexikon ;) ...

    ist das mit den SDA/SCL-Anschlüssen an die Pi GIOs mit 3V3 bei allen I2C-Teilen so oder gilt das nur für einige Bausteine?
    Und wie sieht das dann bei SPI bzw. 1-wire aus? Gilt das da ebenfalls?

    ciao,
    -ds-

    [quote pid='20177' dateline='1372953230']
    Wären die 3.3V nicht zu wenig für einen High Pegel beim Sensor? (der braucht ja ca. 0.7*5V=3.3V für einen high-Pegel). Sonst kann ja der Master gar nicht mit dem Slave kommunizieren ;)
    [/quote]

    Hi, ich kenn mich jetzt zwar nicht sooo gut aus, aber wenn ich Deine Schaltung betrachte, glaube ich folgendes zu lesen:
    ist es nicht so, dass lediglich die 5V auf 3V3 heruntergefahren, nicht aber die 3V3 auf 5V angehoben werden?
    Soweit ich mich recht erinnere, brauchst Du für anheben/absenken der Spannung doch pro Kanal 2 FETs, oder?
    Also hast Du mit Deiner Schaltung dasselbe Problem .... oder sehe ich da was falsch?

    cu,
    -ds-


  • Hallo ds

    Ich habe die Schaltung des Pegelwandlers nach folgendem Dokument nachgebaut.
    (siehe Seite 10): http://www.kip.uni-heidelberg.de/lhcb/Publicati…nal/AN97055.pdf
    Das ist anscheinend Bi-directional.

    Lg Lukas

    Hi Lukas,

    also ich kenne diese level shifter nur so wie z.B. dieser hier.
    Aber wenn es eh wurscht ist ... warten wir mal, was unser personifiziertes Elektroniklabor dazu sagt ;) ...

    cu,
    -ds-

  • Das mit der Levelshifterschaltung ist schon ok. Es wäre schon nicht schlecht, wie orb bereits schon geschrieben hat, sich mit einem Oszi od. Logikanalyzer mal daß ganze Elend anzusehen. Vielleicht ist ja einer deiner Mosfet's defekt od. die 10k Pullup Widerstände sind zu überdimensioniert. Wenn Du kein Oszi od. Logikanalyzer hast, könntest Du deinen Sensor auch ohne Levelshifter mit einem alten Pc / Mainboard testen. Dort kann man auf dem Mainboard gelegendlich einen I2C ( SM Bus ) Anschluß finden, oder man lötet sich einfach an einem Ram Riegel mit SPD Eeprom zwei Paar Drähte an, um das Ganze dann am Besten mit einer Linux Live CD ( z.B. Knoppix ) zu testen.

  • ist das mit den SDA/SCL-Anschlüssen an die Pi GIOs mit 3V3 bei allen I2C-Teilen so oder gilt das nur für einige Bausteine?


    Das gilt für alle I2C Bauteile (ausgenommen einige Bustreiber), aber nicht für fertige Bausteine/Module/Schaltungen.
    I2C ist als Opencollector-Bus spezifiziert, das bedeutet, daß die Busteilnehmer nur GND auf den Bus schalten und die Spannung über Widerstände festgelegt wird, die den Bus mit einer Versorgungsspannung verbinden (PullUp-Widerstände). Ohne die funktioniert der Bus nicht weil er keine Spannung hat.
    Der Pi hat die Widerstände schon eingebaut und deshalb ist der Bus auf 3,3Volt festgelegt. Man kann alle I2C Bausteine (Bustreiber wieder ausgenommen) an den Bus anschließen, egal mit welcher Spannung die versorgt werden. Bei fertigen Bausteinen/Schaltungen muß man kontrollieren, ob PullupWiderstände eingebaut sind und die gegebenenfalls entfernen, Wenn das nicht geht oder man nicht sicher ist braucht man einen Pegelwandler wie oben beschrieben.

    Lesestoff:
    http://www.nxp.com/documents/user_manual/UM10204.pdf
    http://www.i2c-bus.org/

    Zitat

    Und wie sieht das dann bei SPI bzw. 1-wire aus? Gilt das da ebenfalls?


    Onewire ist auch ein OC-Bus, den Vorschlag die DS18s20 mit 5Volt zu versorgen und den 4k7 Widerstang gegen 3,3Volt zu legen findest Du oft.
    Der SPI-Bus ist kein OpenCollector-Bus, alle Busteilnehmer geben definierte Spannungen auf den Bus und müssen zu einander passen. Da funktioniert die hier benutzte Schaltung zur Pegelwandlung nicht gut.

    Zitat


    Wären die 3.3V nicht zu wenig für einen High Pegel beim Sensor? (der braucht ja ca. 0.7*5V=3.3V für einen high-Pegel). Sonst kann ja der Master gar nicht mit dem Slave kommunizieren ;)


    Wie Du berechnet hast sind die Pegel grenzwertig. Da es bei dem Bus aber hauptsächlich auf den Low-Pegel ankommt sind die Bauteile nicht so kritisch, ich hatte noch in keiner Schaltung Probleme damit.

    Zitat

    Hi, ich kenn mich jetzt zwar nicht sooo gut aus, aber wenn ich Deine Schaltung betrachte, glaube ich folgendes zu lesen:
    ist es nicht so, dass lediglich die 5V auf 3V3 heruntergefahren, nicht aber die 3V3 auf 5V angehoben werden?
    Soweit ich mich recht erinnere, brauchst Du für anheben/absenken der Spannung doch pro Kanal 2 FETs, oder?


    Das Anheben der Pegel machen auch hier die Widerstände, die FETs sorgen nur dafür, daß die GND-Pegel übertragen werden. In die eine Richtung weil der Fet duchschaltet, in die andere Richtung über die Diode zwischen Drain und Source.
    Die Schaltung die Lukas benutzt hat ist übrigens die von Philips (wer hat's erfunden?) vorgeschlagene Schaltung zur Pegelwandlung.

    Edith:

    Zitat

    Es wäre schon nicht schlecht, wie orb bereits schon geschrieben hat, sich mit einem Oszi od. Logikanalyzer mal daß ganze Elend anzusehen.


    In diesem Fall würde ich keinen Logicanalyser nehmen. Auf dem Oszi kann man die Pegel messen, dem LA sind 3,3 oder 5 in der Regel egal.

    Einmal editiert, zuletzt von orb (4. Juli 2013 um 19:13)

  • Stimmt orb, aber wenn's nicht gerade ein Lowcost Logicanalyzer mit einem Bustreiber IC am Parallelport ist, sollte man eigendlich bei einem vernüftigem Gerät, auch einen Trigger für den/die Pegel einstellen können. Nur vergessen darf man daß halt nicht, sonst dauert die Fehlersuche halt entsprechend länger. ;)


  • Stimmt orb, aber wenn's nicht gerade ein Lowcost Logicanalyzer mit einem Bustreiber IC am Parallelport ist, sollte man eigendlich bei einem vernüftigem Gerät, auch einen Trigger für den/die Pegel einstellen können.


    Naja, das ist ein Luxus den nichtmal ich mir privat gegönnt hab. Ok, da war ich auch etwas geizig. Ich komm mit dem Open Workbench Logic Sniffer (http://www.watterott.com/de/Open-Logic-Sniffer) aber ganz gut klar, er könnte nur etwas mehr Speicher haben. (Und er sieht neben dem FlukeOszi etwas provisorisch aus.)

    Einmal editiert, zuletzt von orb (4. Juli 2013 um 20:41)

  • Servus

    Ich habe den Sensor an die Spannungsversorgung angehängt. Dabei ist herausgekommen, dass beim Data-Pin 5V anliegen. Bei der Clock-Leitung 0.5V. Sehe ich das richtig, dass der Sensor somit einen Pull-up schon intern besitzt? Die Spannung wurde mit einem Multimeter gemessen, ein Oszilloskop habe ich derzeit nicht zur verfügung.

    Lg Lukas


  • Ich habe den Sensor an die Spannungsversorgung angehängt. Dabei ist herausgekommen, dass beim Data-Pin 5V anliegen. Bei der Clock-Leitung 0.5V. Sehe ich das richtig, dass der Sensor somit einen Pull-up schon intern besitzt?


    Das ist das Problem mit fertigen Modulen. Ich hab mich auf die Angaben im Herstellerdatenblatt verlassen, danach sind keine Pullups eingebaut, man soll 1,2-10kOhm benutzen. Kannst Du die Beschriftung den ICs auf der Rückseite lesen? Vielleicht sagt das Datenblatt dazu mehr.

    Unter den Voraussetzungen muß ich mich korrigieren, Du solltest doch einen Pegelwandler benutzen, sorry.

  • Hallo zusammen

    Ich bin heute in den Genuss gekommen, meinen Pegelwandler an einem Oszilloskop auszumessen.
    Das folgende Bild sind entstanden, wenn der Pegelwandler mit 5V, 3.3V und der Clockeingang auf der Raspberry Seite mit einer Frequenz von 100kHz versorgt wird.
    Gemessen wurde auf der Seite des Sensors.
    Die grüne Kurve beschreibt die Ausgabe des Frequenzgenerators.

    SCL (blau)

    Im zweiten Schritt wurde nun das Signal vom Clock-Pin weggenommen. Meine Absicht war herauszufinden, ob der Sensor wirklich einen internen Pull-up Widerstand hat.
    Hier habe ich einen zweiten Sensor vermessen, der nicht am Pegelwandler angeschlossen ist. Die Spannungsversorgung von 5V wurde am Sensor angelegt, und die SDA, SCL gemessen.
    Die grüne Kurve beschreibt die Ausgabe des Frequenzgenerators, was eigentlich sinnlos ist.

    SCL (blau)

    SDA (blau)

    Nun sehe ich daraus aber nicht, ob der Sensor einen internen Pull-up up hat oder nicht.
    Könnt ihr mir weiterhelfen?

  • Tach auch ...

    ich muss jetzt ein wenig in der Kristallkugel lesen, deshalb alles mal unter Vorbehalt:

    Wenn ich noch mal in die Beschreibung Deines Sensors schaue, dann steht da was von:

    Bus pull-up Resistance
    Rline
    1.2k to 10k
    ohms

    Hätte das Teil einen internen Pullup, denke ich, wäre diese Angabe nicht notwendig.
    Was mich ein wenig wundert ist, dass die Screenshots nur Spannungen von ca. 2V anzeigen ...

    Mal sehen, was unsere Cracks dazu meinen ...

    cu,
    -ds-

    PS: Kannst Du den Sensor vielleicht vesuchsweise über eine externe Spannungsversorgung mit einer Treiberschaltung anschliessen? Dann kannst Du ausmessen, ob die Ströme und Spannungen Pi-verträglich sind oder nicht ...

  • .....

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (15. Juli 2013 um 12:52)

  • I2C-Slaves haben, wenn sie sich an den Standard halten, ohne Pullup keine Spannung auf den SDL/SCL-Pins. Wenn Du da nichts angeschlossen hast und eine Spannung mißt solltest Du davon ausgehen daß da Widerstände sind. Deshalb würde mich das eingesetzte IC interessieren. Es kann ein AD-Wandler sein der sich nicht an die Normen hält oder ein kleiner Prozessor der falsch programmiert ist.

    Und da ich es zufällig gelesen hab:
    Auch wenn Du gleich wieder erzählst, ich schreib das nur weil ich dich nicht mag, Dein Vorschlag ist Unsinn, Jar. I2C ist auf beiden Leitungen bidirektional, da funktionieren keine Spannungsteiler, schon garkeine mit Schutzdioden.


  • Und da ich es zufällig gelesen hab:
    Auch wenn Du gleich wieder erzählst, ich schreib das nur weil ich dich nicht mag, Dein Vorschlag ist Unsinn, Jar. I2C ist auf beiden Leitungen bidirektional, da funktionieren keine Spannungsteiler, schon garkeine mit Schutzdioden.

    OK hast recht, war ne Schnapsidee (obwohl nüchtern, ich brauchte erst ein Schnaps um das klarer zu sehen :)

    lasst die PIs & ESPs am Leben !
    Energiesparen:
    Das Gehirn kann in Standby gehen. Abschalten spart aber noch mehr Energie, was immer mehr nutzen. Dieter Nuhr
    (ich kann leider nicht schneller fahren, vor mir fährt ein GTi)

    Einmal editiert, zuletzt von jar (6. Juli 2013 um 03:50)

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!