Mehrere I2C-Devices am RPi?

  • Ich möchte einen RPi mit verschiedenen Sensoren ausstatten, u.a. mit einigen Lichtsensoren. Ich habe bereits einen Adafruit TSL2561 per I2C angebunden. Das klappt mit einem Sensor auch sehr gut, aber aufgrund der maximal drei möglichen Slave-Adressen dieses Boards ist nach drei Sensoren Schluss.


    Einen Proximity-Sensor (VCNL4000) werde ich ebenfalls noch anschließen, aber da dieser überhaupt keine Möglichkeit zur Änderung der Slave-Adresse hat, wird er wohl ohne weitere Hardware auch allein bleiben.


    Ich habe bereits versucht, auszugooglen, was allgemein als best practice angesehen wird, eine größere Anzahl gleichartiger I2C-Sensoren mit dem RPi zu verbinden, aber scheinbar hat kaum jemand einen Bedarf daran oder ich suche falsch.


    Kann mich vielleicht jemand von euch auf die richtige Spur bringen? Gibt es vielleicht ein Stück Hardware o.ä., mit dem ich den RPi um weitere I2C-Ports erweitern kann? Oder etwas in der Art eines NAT, mit dem ich die Slave-Adresse eines I2C-Devices ändern kann?


    Oder sollte ich in meinem Fall eher nicht auf I2C setzen?


    Ich habe auch fünf 1Wire Temperatursensoren an dem RPi hängen. 1Wire ist mir in der Hinsicht sehr sympatisch, da es praktisch nicht zu Adresskonflikten kommen kann. Jedes Device hat eine einmalige ID und alle Sensoren müssen einfach nur über drei Leitungen elektrisch miteinander verbunden werden. Langsam aber ziemlich robust. Nachteil bei 1wire ist die begrenzte Auswahl an verschiedenen Sensoren bzw. vor allem deren softwareseitige Unterstützung seitens des RPi.


    Also: Habt ihr vielleicht Ideen, wie ich mehrere gleichartige I2C-Sensoren an den RPi bekomme?

  • Bausteine wie der MCP23017 kann ja mehrere Adressen haben, damit gibt es keine Probleme.


    Wenn du merhere ICs mit der gleichen Addresse benutzen willst, sollte es genügen wenn du nur den IC mit Spannung versorgst den du nutzen willst.


    Die aktuellen Versionen des Pi haben auch 2 Hardware I2C Schnittstellen.

  • Bei meinen Recherchen ist der MCP23017 zwar desöfteren aufgetaucht, aber ich habe noch nicht verstanden, wie ich über diesen dann die weiteren I2C-Sensoren einbinden würde.


    Werden einfach die Datenleitungen der Sensoren an die GPIO-Pins des ICs geschaltet? Der MCP23017 ist doch "nur" ein Allzweck-GPIO Extender, dem man erst einmal beibringen müsste, I2C-Master für weitere Sensoren zu spielen, oder?


    Und falls ich die Sensoren dazu bekomme, mit dem MCP23017 zu kommunizieren, wie geht es dann weiter? Ich habe verstanden, dass der MCP23017 als einzelnes Device am I2C-Bus des RPi auftaucht, aber wie kommuniziere ich dann mit den eigentlichen Sensoren dahinter?


    Oder habe ich einfach nur noch nicht das grundlegende Prinzip dieses ICs verstanden? :)

  • Bei I2C hat jedes Gerät eine Adresse. Solange sich die Adressen unterscheiden kann man am I2C Bus viele (bis 127 Geräte) betreiben. Beim MCP23017 kann man durch Beschaltung 3 Bits der Adresse verändern. So kann man 8 MCP23017s an einem I2C Bus betreiben. Einige andere I2C-Chips haben ebenfalls Pins mit denen die Addresse geändert werden kann.

  • Tut mir leid, aber entweder ich verstehe nicht, worauf du hinaus willst oder ich konnte meine Frage bisher nicht verständlich genug formulieren.


    Mir ist bewusst, dass beim MCP23017 die Slave-Adresse geändert werden kann. Aber was dann? Ich möchte mehrere Helligkeitssensoren an den RPi bringen, von denen ich an einem I2C-Master nur drei betreiben kann, weil die Slave-Adresse des Sensors nur auf 0x29, 0x39 oder 0x49 gesetzt werden kann (per Lötbrücke). Und ich möchte mehrere Entfernungssensoren einbinden, deren Slave-Adresse fest auf 0x20 eingestellt ist und nicht änderbar ist.


    Ich brauche also vermutlich mehrere I2C-Master. Hilft mir der MCP23017 dabei weiter? Und wenn ja, wie?

  • Googe mal nach I2C Hub bzw. Expander, alternativ könntest Du dir auch ein USB zu I2C Adapder, so etwas wie diesen hier ( http://www.harbaum.org/till/i2c_tiny_usb/ ), bauen.
    [hr]


    Ich möchte mehrere Helligkeitssensoren an den RPi bringen, von denen ich an einem I2C-Master nur drei betreiben kann, weil die Slave-Adresse des Sensors nur auf 0x29, 0x39 oder 0x49 gesetzt werden kann (per Lötbrücke).


    Dir ist hoffendlich auch bewußt, daß man nicht nur eine Lötbrücke als Adresse pro Sensor setzen kann, oder?


  • von denen ich an einem I2C-Master nur dreibetreiben kann, weil die Slave-Adresse des Sensors nur auf 0x29, 0x39 oder 0x49 gesetzt werden kann (per Lötbrücke).


    du meinst 3 Lötbrücken ? = 2 ^ 3 gibt 8, jede Lötbrücke kann offen oder zu sein
    Wahrheitstabelle


    2^2 2^1 2^0 die drei Bit
    0 0 0 = 0
    0 0 1 = 1
    0 1 0 = 2
    0 1 1 = 3
    1 0 0 = 4
    1 0 1 = 5
    1 1 0 = 6
    1 1 1 = 7



    Und ich möchte mehrere Entfernungssensoren einbinden, deren Slave-Adresse fest auf 0x20 eingestellt ist und nicht änderbar ist.


    Ich brauche also vermutlich mehrere I2C-Master. Hilft mir der MCP23017 dabei weiter? Und wenn ja, wie?


    Addressänderung gilt für (fast) alle I2C, zeig mir deine Wahl und ich schau mal

    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)


  • Dir ist hoffendlich auch bewußt, daß man nicht nur eine Lötbrücke als Adresse pro Sensor setzen kann, oder?


    Was meinst du damit? Das Adafruit TSL2561 Board hat drei Lötpunkte für die Wahl der Slave-Adresse. Lässt man sie offen, meldet sich der Sensor auf Adresse 0x39, verbindet man den mittleren mit einem der beiden anderen (Masse oder 3,3V), meldet sich der Sensor auf Adresse 0x29 bzw. 0x49. Mehr geht bei dem Board m.W. nicht.
    [hr]


    du meinst 3 Lötbrücken ? = 2 ^ 3 gibt 8, jede Lötbrücke kann offen oder zu sein


    [...]


    Addressänderung gilt für (fast) alle I2C, zeig mir deine Wahl und ich schau mal


    Nein, leider keine drei "Bits" - wirklich nur drei Zustände :)


    Es geht um folgende zwei Boards:


    https://www.adafruit.com/products/439 (TSL2561)
    http://www.adafruit.com/products/466 (VCNL4000)


    Das TSL2561 Board hat einen ADDR Pin, der entweder offen gelassen werden kann, oder gegen Masse bzw. 3,3V verbunden werden kann. Also maximal drei mögliche Zustände.


    Und das VCNL4000 Board hat überhaupt keine Möglichkeit zur Wahl der Slave-Adresse. :(

    Edited once, last by jeas ().

  • Mein Fehler, hab von drei Lötpunkten auf 3 Bit geschlossen. Dann wirst Du wohl doch einen I2C HUB oder etwas Ähnliches brauchen. Benötigst Du denn einen genauen Helligkeitswert oder würde eine hell / dunkel Info reichen?


  • Was mir grad noch einfällt, einfacher wäre es wohl die SDA Leitung zu multiplexen, z.B. mit dem hier http://www.watterott.com/de/Analog/Digital-MUX-Breakout


    jau :thumbs1: geile Idee, hatte ich auch mal zur Portvervielfachung gemacht vor allem weil sie bi-direktional sind also alle Richtungen in/out können
    74HC4051 ginge auch (8-Kanal) als DIL besser zu handhaben und kleiner, billiger auch

    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)

    Edited once, last by jar ().


  • Mein Fehler, hab von drei Lötpunkten auf 3 Bit geschlossen. Dann wirst Du wohl doch einen I2C HUB oder etwas Ähnliches brauchen. Benötigst Du denn einen genauen Helligkeitswert oder würde eine hell / dunkel Info reichen?


    Ich brauche nicht für jeden Sensor zwingend genaue Werte, für mehr als drei aber mittelfristig schon.


    Simple analoge Sensoren (wo ich jetzt grob vereinfachend auch alles hinzuzähle, was lediglich "high" oder "low" liefert) sind mir natürlich auch schon in den Sinn gekommen, aber das ist dann immer so ein Gefrickel, die vernünftig abzufragen bzw. anzusteuern.


    Ich will da, wo es geht, Sensoren einsetzen, die ein (serielles) Protokoll mit einer gewissen Transaktionssicherheit zur Datenübertragung verwenden. In den allermeisten Fällen funktionieren die entweder oder sie tun es nicht. Die Grauzone dazwischen ist im Vergleich zur Anbindung analoger Sensoren extrem klein. Und da sind dann wohl aktuell 1wire oder I2C die Protokolle der Wahl.


    Zum Stichwort I2C Hub habe ich allerdings bisher immer nur passive Elemente gefunden, die einfach die vier Leitungen für den I2C-Bus duplizieren. Sowas hilft mir nicht weiter - Leitungen zusammenstecken kann ich auch auf dem Breadboard. :) Hast du da evtl. noch einen konkreten Tipp für einen "aktiven" I2C Hub, der I2C-Clients tatsächlich unabhängig und separat behandeln und weiterreichen kann?
    [hr]


    Was mir grad noch einfällt, einfacher wäre es wohl die SDA Leitung zu multiplexen, z.B. mit dem hier http://www.watterott.com/de/Analog/Digital-MUX-Breakout


    Über diese Idee bin ich bei meiner Recherche auch schon gestolpert. Ich habe nur noch nicht ganz verstanden, wie das praktisch funktioniert.


    Was ich mir zusammengeraten habe: Ich verbinde ich GND, 3,3V und SCL bei allen I2C-Clients direkt durch bis zum RPi. Die SDA-Leitungen aller Clients kommen auf C0 bis C15 des Multiplexers (bzw. in meinem Fall bis zu drei Sensoren auf einen Pin). Die SIG-Leitung des Multiplexers kommt als SDA-Leitung an den RPi. Und dann steuere ich über vier GPIO-Pins des RPi, welche der 16 Signalleitungen "durchverbunden" wird und kann dann jeweils immer die gerade verbundenen Sensoren abfragen. Ist das soweit richtig gedacht?


    Ich kann mich in diesem Zusammenhang erinnern, irgendwo gelesen zu haben, dass SCL ggf. ebenfalls über einen Multiplexer gehen sollte, weil es sonst nicht funktioniert. An eine Begründung dafür kann ich mich allerdings nicht erinnern. Was meint ihr?

    Edited once, last by jeas ().

  • Alternativ könntest Du dir deine eigenen I2C Sensoren basteln. Falls die hell / dunkel Info reicht könntest Du einen PCF8574 verwenden, an den Du dann den Status von bis zu 8 Photodioden bzw. Transistoren auswertest. Brauchst Du genauere Werte könntest Du einen I2C A/D Wandler benutzen, an dem Du dann mit einem Spannungsteiler wiederum die Helligkeit der Photodiode(n) auswertest. Denkbar wäre für mich auch, jeden I2C Helligkeitssensor mit einem PCF8574 zum Messen, an bzw. auszuschalten. Oder Du nutzt halt noch den 2. I2C Bus des RPi bzw. baust Dir ein USB-I2C Adapter.

  • Quote


    [font="Tahoma, Verdana, Arial, sans-serif"]Ich kann mich in diesem Zusammenhang erinnern, irgendwo gelesen zu haben, dass SCL ggf. ebenfalls über einen Multiplexer gehen sollte, weil es sonst nicht funktioniert. An eine Begründung dafür kann ich mich allerdings nicht erinnern. Was meint ihr?[/font]


    SCL ist ja der Takt. Es sollte eigentlich egal ob ein Baustein immer den Takt mitbekommt.


    Beispiel zu hast 2 Bausteine (A,B) an einem Bus, und sprichst nur A an. Dann bekommt B auch immer den Takt mit.


    Wenn es dennoch zu Problemen kommt, kannst du ja immer noch mit einen zweiten Multiplexer nachrüsten.


    Es würde mich auch interessieren wie gut das mit dem Multiplexer klappt. Hatte mir den Multiplexer auch mal für I2C gekauft, allerdings hatte ich noch keine Notwendigkeit ihn einsetzen zu müssen. Freue mich schon auf deinen Erfahrungsbericht ;)

  • Du könntest statt einer festen Lötbrücke den Pin mit je einem Transistor schalten, oder mit dem Ausgang eines Schieberegisters. Dann reagiert der ausgewählte Chip auf eine andere Adresse als alle nicht gewählten Chips. Schieberegister kannst du kaskadieren und somit fast beliebig viele Chip-Select-Signale aus 4 Steuerleitungen generieren.


  • Es würde mich auch interessieren wie gut das mit dem Multiplexer klappt. Hatte mir den Multiplexer auch mal für I2C gekauft, allerdings hatte ich noch keine Notwendigkeit ihn einsetzen zu müssen. Freue mich schon auf deinen Erfahrungsbericht ;)


    Der Mulitplexer könnte ja wirklich eine "billige" Lösung des Problems werden. Ich werde das auf jeden Fall ausprobieren. Mit dem Erfahrungsbericht könnte es aber noch ein paar Wochen dauern. Ich muss erst einmal wieder Zeit finden für umfangreichere Installationen. :) Und außerdem muss ich erstmal wieder eine etwas längere Teileliste für eine Bestellung zusammenbekommen, damit sich die Versandkosten wenigstens lohnen. :)
    [hr]


    Du könntest statt einer festen Lötbrücke den Pin mit je einem Transistor schalten, oder mit dem Ausgang eines Schieberegisters. Dann reagiert der ausgewählte Chip auf eine andere Adresse als alle nicht gewählten Chips. Schieberegister kannst du kaskadieren und somit fast beliebig viele Chip-Select-Signale aus 4 Steuerleitungen generieren.


    Auch noch eine gute Idee. Für meine Zwecke werde ich dann aber mit 16x3 Sensoren tatsächlich auskommen. Ggf. kann ich den zweiten I2C-Port ja auch noch aktivieren und vermutlich geht ein einzelner RPi bei einer solchen Bestückung plus Nagios dann ohnehin langsam in die Knie. :D


    Wenn ich das Prinzip richtig verstehe, ließen sich die Multiplexer im Ernstfall wohl auch noch kaskadieren. (?) Wahrscheinlich wird das Signal bei zu vielen Stufen irgendwann zu "unsauber" oder bekommt eine zu große Latenz bei durchgezogener SCL-Leitung, aber mit zwei Multiplexer-Stufen könnte man ja fast schon eine ganzes Bürogebäude (wenn man mal die erforderlichen Leitungslängen ignoriert) überwachen. :)

    Edited once, last by jeas ().