I2C-Module am Raspberry PI

Mit dem I2C-Repeater können 5V I2C-Slaves direkt am Raspberry PI angeschlossen werden. Der abgebildete Testaufbau zeigt in der unteren Reihe neben dem Raspberry PI unser

  • I2C Digital-Input-Modul (8 Bit 5-24V)
  • I2C Digital-Output Modul (8 Bit 5-24V)
  • I2C Analog-Input Modul (5 Kanäle 10 Bit Auflösung)
  • I2C Analog-Output Modul (4 Kanäle 10 Bit Auflösung)

In der oberen Reihe sind die neuen Simulationsbaugruppen abgebildet. Mit Ihnen kann man die digitalen Eingänge simulieren, fünf Analogwerte zwischen 0-10V vorgeben und mit dem Messgerät die Spannungen sehen, die das analoge Output-Modul ausgibt.

Raspberry-PI mit I2C-Modulen

Raspberry-PI mit I2C-Modulen

 

I2C-Adressen der Baugruppen am Raspberry PI herausfinden

Am Raspberry-können die Baugruppen dann mit folgendem Befehl am Bus detektiert werden:

i2cdetect -y 1

Als Antwort vom PI bekommt man diese Tabelle aufgelistet:

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- 08 -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: 20 -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- 38 -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- 58 -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Daraus ergeben sich folgende Adressen der Module:

  • 20hex ist das digitale Ausgabemodul (PCF 8574)
  • 38hex ist das digitale Eingabemodul (PCF 8574A)
  • 08hex ist das analoge Eingabemodul
  • 58 hex ist das analoge Ausgabemodul

Bei allen Modulen sind die Jumper auf Low (unten).

Digitale Ausgänge schalten

Zum Schalten der Ausgänge am Output-Modul muss die I2C-Adresse des Slaves und der Wert als Bitmuster  gesendet werden.

Alle Ausgänge EIN-schalten

i2cset -y 1 0x20 0x00

Alle Ausgänge AUS-schalten

i2cset -y 1 0x20 0xFF

Alle unsere digitalen Module haben eine negative Logik. Das liegt an den PCF8574 Bausteinen, die bei Spannung EIN immer high-Signale ausgeben. Damit keine unbeabsichtigten Handlungen der Steuerung ausgeführt werden haben wir die Logik gedreht. Im Programm müssen die Ein- und Ausgänge invertiert werden.

 

Digitale Eingänge einlesen

Um die Eingänge der digitalen 8bit Karte einzulesen geben Sie folgenden Befehl ein:

i2cget -y 1 0x38
0xFF

0xFF zeigt Ihnen, dass alle LEDs der Eingabekarte AUS sind.

Schalte ich alle Schalter meiner Simulationsbaugruppe EIN leuchten die Eingänge des Input-Moduls.  Frage ich die Karte erneut ab bekomme ich oxoo zurück.

i2cget -y 1 0x38
0x00

Auch hier bitte die negative Logik der Module beachten.

 

Analoge Ausgänge schreiben

Um einen Analogwert auszugeben müssen drei Bytes zum I2C-Slave geschrieben werden.

Byte 1    Kanal-Nummer
Byte 2    Analogwert Low Byte
Byte 3    Analogwert High Byte

Im mit i2cset mehrere Bytes zu senden muss der Befehl i2cset mit der Option i aufgerufen werden.
Andere begriffe sind i2cset multiple bytes oder i2cset write I2C Block Data

Spannung Dezimalwert Hexadezimalwert High-Byte Low-Byte
0 V 0 0x0000 0x00 0x00
5 V 500 0x01F4 0x01 0xF4
10 V 1000 0x03E8 0x03 0xE8

um z.B. 5 Volt auf Kanal 0 auszugeben muss folgender Befehl eingegeben werden:

i2cset -y 1 0x58 0x00 0xF4 0x01 i

Dieser Befehl stellt den Kanal 2 auf 10V ein

i2cset -y 1 0x58 0x02 0xE8 0x03 i

und damit wieder zurück auf 0V

i2cset -y 1 0x58 0x02 0x00 0x00 i

 

 

 

Speichere in deinen Favoriten diesen permalink.

17 Kommentare

  1. Hallo, ich habe vor kurzen die Module Analog Input 8 Kanal 0-10V & Analog Output 4 Kanal 0-10V gekauft. Nun werden die Module nicht über i2cdetect -y 1 (PI 4B) erkannt.
    SCL und SDA liegen bei 3,3V & die 5V Versorgung liegt am Modul an.
    Der I2C funktioniert grundsätzlich, da ein weiterer Sensor im Test erkannt wurde.
    Haben Sie mir einen Tipp?

  2. Hallo, ich hab I2c Eingang Module vor einiger Zeit gekauft und die bis jetzt über Arduino betrieben wurden, jetzt wollte ich das ganze mit Python und Grafische Oberfläche umschreiben und auf dem Pi 3B+ laufen lassen. Das Problem ist mit i2cdetect -y 1 werden die Module nicht erkannt. Die Installation von I2C auf Pi hab ich genau so gemacht wie hier im Link auch steht. Zwischen dem Pi und dem Modul ist ein Lewelshifter geschaltet den ich auch in einem andern Projekt nochmals getestet hab und auf allen Port funktioniert. Sie haben vielleicht eine Idee oder das Problem mit dem Pi schon mal begegnet. Inzwischen hab ich auch ein Wemos als an den Pi als slave konfiguriert mit ic2 Adresse und der wird auch nicht erkannt wobei der auf 3,3v wie der Pi funktioniert und kein Levelshifter benötigt.

    • Hallo Roman,
      messen Sie mal die Pegel am PI.
      Im Ruhezustand müssen an SCL und SDA 3,3V gegen Masse anliegen.
      Wenn nicht, mal zwei Widerstände 10kOhm gegen +3,3V einbauen.

  3. Ich habe folgende Frage zum 8-Kanal-Input-Modul mit Optokopplern:
    Die Kommunikation zwischen Raspberry und Modul per I2C funktioniert soweit problemlos mit einer Ausnahme: Wenn alle 8 Eingänge auf high (in meinem Fall auf +12V) liegen:
    1) eine Veränderung der Eingänge auf 255 (in meinem Fall alle Eingänge auf +12V) wird nicht mittels der INT-LED signalisiert
    2) wenn 255 an den Eingängen anliegt, kann der Zustand per I2C nicht mehr abgefragt werden (i2cdetect findet das Modul nicht mehr)
    3) wenn ich die Eingänge von 255 auf beispielsweise 254 ändere, leuchtet die INT-LED und die Kommunikation funktioniert wieder
    Liegt hier eine Fehlfunktion vor oder ist das zu erwartendes Verhalten? Leider habe ich im Datenblatt PCF8574 keine entsprechenden Infos gefunden.

    • Hallo,
      das verhalten ist nicht normal. Bitte prüfen Sie mal, ob sich nicht irgendwo eine Brücke beim Löten gebildet hat.
      Der PCF8574 speichert sich das Bitmuster an den Pins wenn die Daten gelesen werden. Verändert sich ein Bit gegenüber der Sicherung, wird INT LOW und die LED geht an.
      Beste Grüße, JH

      • Vielen Dank für die schnelle Antwort.
        Da ich mittlerweile noch weitere Module bei Ihnen bestellt habe, konnte ich bei dem Modul mit der oben beschriebenen Fehlfunktion einfach mal den PCF8574 austauschen. Und siehe da, daran lag es. Mit einem intakten Baustein funktioniert die Kommunikation auch wenn 255 anliegt.
        LG, Jennes.

  4. Guten Tag,
    Ich habe das Problem, dass ich nach dem Befehl i2cdetect -y 1 einen Syntax Fehler bekomme. Was kann ich tun ?

  5. Hallo,
    ich habe nun den 2te I2C-Repeater am Raspberry, aber leider kann ich das Modul I2AT nicht ansprechen. Die 5 Volt liegen an. Gibt es einen Verdrahtungsplan oder haben Sie einen Tipp?

    • Hallo,
      Sie brauchen nur die vier Klemmen miteinander Verbinden
      +5V GND SDA SCL.
      Wenn am Repater die Lötbrücke LB2 nicht gesetzt ist (Standard) müssen Sie 5V an einer SPS-Karte einspeisen.
      Diese 5V können auch von einem zweiten Netzteil kommen.

      Mit der Lötbrücke LB1 wird das INT-Signal auf den GPIO17 durchgeschaltet.
      Mit der Lötbrücke LB2 können Sie die 5V-Spannung des Raspberry für die SPS-Baugruppen verwenden.

      Hier noch ein Beispiel wie die SPS-Baugruppen über den I2C-Repeater an den Raspberry-Pi angeschlossen werden.
      die graue INT-Leitung endet an der Eingabekarte. Die 5V-Versorgung, GND, SDA und SCL wird parallel durchverdrahtet.

  6. Hallo,
    ich verwende 2x AI-Karten, 2x DO-Karten, 1x AO-Karte und 1xDI-Karte die alle sehr ähnlich geschaltet sind wie oben auf dem Bild. Ebenfalls hat durch nutzen der Jumper jede Karte seine eigene Adresse. Nun zum Problem. Solbald man mit dem Finger über den PCF8574-Chip eine Digitalen Karte streicht oder auch nur in der nähe ist, wechselt diese im Millisekundentakt ihre Adresse. Sollte man sich wieder entferne braucht diese dann ca. 2 Sekunden um zu ihrer Ursprungsadresse zurückzukehren. Die Analogen Karten haben dieses Problem nicht. Allerdings wechseln alle Analogen Karten nach aus und einschalten des Netzteils dauerhaft ihre Adresse bis zum nächsten aus und einschalten. Ich vermute irgendeine Störung, allerdings habe ich keine Idee wo ich anfangen sollte zu suchen. Vielleicht haben sie ja eine Idee.

    • Hallo,

      bitte mal die Versorgungsspannung nachmessen. Die 5V sollten stabil anliegen.
      Dann ev. die Adress-Pins mal mit dem Voltmeter nachmessen und auf kalte Lötstellen prüfen.
      Wichtig auch dass die Massen der einzelnen Karten gut verbunden sind.
      I2C-Busleitungen so kurz wie möglich halten.
      Haben Sie den Repeater verwendet?
      im Ruhezustand muss zwischen SDA und GND sowie SCL und GND 5V anliegen.
      Gruß, JH

      • Danke für die schnelle Antwort.

        Versorgungspannung liegt konstant bei 5V.
        Masse ist überall verbunden und funktioniert auch.
        Die Busleitung ist maximal 5cm zwischen jeder Karte.
        Repeater wird verwendet und auch die 5V liegen zwischen SDA – GND und SCL – GND an.
        Was genau meinen Sie mit Adress Pins?
        Grundsätzlich funktioniert auch jede Karte ordnungsgemäß, außer das die Adresse nicht gleich bleiben.

        • mit den Jumpern wird der jeweilige Adress-Pin entweder auf 5V oder auf Masse geschaltet.
          Pin 1-3 beim PCF8574 links unten die ersten drei Pins bei der Nase beginnend.

  7. Hallo,
    ich habe folgendes Problem. Wenn ich i2cdetect -y 1 ausführe kommen wie oben genannt die selben Adressen. Wenn ich i2cget -y 1 0x20 ausführe spricht es bei mir die digitale Eingabekarte an. Dies ist auch bei Codesys das selbe Problem wähle ich die digitale Ausgabekarte wird über den Test die Eingabekarte geschaltet. Was mache ich falsch?

    • Prüfen Sie bitte ob der PCF8574 in der DO-Karte und der PCF8574A in der DI-Karte steckt.
      Wenn Sie auf eine DI-Karte Werte schreiben leuchten die LEDs obwohl kein Eingang ansteht.

Schreibe einen Kommentar zu JH Antworten abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert