RasPi und I2C
Ein weitere Anschluss neben den generischen GPIO-Ports und dem 1Wire-Anschluss ist der I2C Anschluss
Elektrik und Adressierung
Er lässt sich am besten mit dem 1Wire-Anschluss vergleichen, nur dass diesmal Daten und Takt auf eigenständigen Verbindungen übertragen werden. Daher ist es auch ein 2-Wire-BUS und verschiedene Hersteller nutzen auch "TWI" (Two Wire Interface) als Bezeichnung. Die ebenfalls erforderliche "Masse" zählt man nicht als eigene Leitung.
Auch wenn es mehrere Master geben kann, werden die meisten I2C-Installationen mit einem Master und vielen Slaves betrieben. Dabei hängen alle Geräte auf den gleichen Leitungen, die über "PullUp"-Widerstände auf "High" gehalten werden. Jedes Gerät kann die Leitung aber auf "Low" ziehen. Durch die Wahl von Potentialen statt Strömen ist I2C störanfällig und eignet sich nicht wirklich für längere Verbindungen.
Auch hier hat jedes Endgerät eine Geräteadresse, die aber nicht wie bei 1-Wire für jedes Gerät unterschiedlich ist. In der ersten Version wurden nur 7 Bit zur Adressierung genutzt, von denen einige Nummern spezielle Aufgaben haben, so das maximal 112 Geräte angeschlossen werden konnten. Mittlerweile wurde das Schema auf 10 Bit angehoben, so dass mehr Geräte am Bus betrieben werden können. Dennoch haben erst mal die Chips des gleichen Typs auch die gleiche Adresse. Es gibt Chips, von denen man in der Regel nur einen am Bus erwartet, z.B. Echtzeituhr oder Speicher. Hier haben die Geräte dann auch eine feste ID. Andere Geräte, die mehrfach vorkommen können, haben oft Eingänge um per externer Beschaltung die Adresse abwandeln zu können. So gibt es I/O-Bausteine bei denen die ersten 4 Bits "fest" sind und drei weitere Bits z.B. per Jumper angesteuert werden. Sofern Sie selbst bestimmen, welche Geräte sie anschließen, sollten sie darauf Rücksicht nehmen. Komplexere Steuerungen sind natürlich möglich, wenn ein Ausgabemodul verschiedene Eingangsmodule "aktiviert" oder deaktiviert.
Jedes I²C-fähige IC hat eine
vom Hersteller festgelegte Adresse, von der
bisweilen die untersten drei Bits (Subadresse
genannt) über drei Steuerpins festgelegt werden können. In diesem Fall können bis zu acht
gleichartige ICs an einem I²C-Bus betrieben
werden. Wenn nicht, müssen mehrere gleiche ICs
mit getrennten I²C-Bussen angesteuert oder
abgetrennt werden können.
Quelle: Wikipedia I²C
http://de.wikipedia.org/wiki/I%C2%B2C
Wenn der I2C Slave einen "Reset"-Anschluss hat, dann sollten Sie einen 1kOhm gegen Vcc schalten, damit ein definierter Pegel anliegt.
Beim RasPI ist es so, dass er zwei I2C-Busse anbietet, von denen einer über die GPIO-Ports nach außen geführt ist und der zweite I2C-Bus am Kameraverbinder anliegt.
Hinweis
Bei der Rev-B ist der I2C-Bus 1 während auf dem
GPIO-Pin während I2C-Bus 0 am Kameraanschluss
aufliegt. Beim RasPi Version A ist es umgekehrt.
Die Beschreibung hier passt auf den I2C Bus 1,
also den neuen RasPi.
Der RasPi hat zwar einen I2C Anschluss, der auf GPIO2 (SDA auf Pin ) und GPIO3 (SCL) heraus geführt ist, aber er ist per Default nicht aktiviert. Komplett wird der Anschluss durch die Stromversorgung (Pin2) und Masse (Pin 5). Siehe auch Raspberry:GPIO.
- NXP I2 C-bus solutions 2013:
Smart, simple solutions für the
12 most common design concerns
http://www.nxp.com/documents/leaflet/75017424.pdf - I2C Chip-Übersicht
http://www.rn-wissen.de/index.php/I2C_Chip-%C3%9Cbersicht
RasPI für I2C aktivieren
Zuerst muss man aber erst I2C aktivieren, da die Module auf der "Blocklist" stehen:
#sudo nano /etc/modprobe.d/raspi-Blocklist.conf
Hier muss die Zeile "Blocklist i2c-bcm2708" z.B. mit einem "#" auskommentiert werden. Die beiden erforderlichen Module können nun mit ModProbe geladen werden.
#modprobe i2c-bcm2708 #modprobe i2c_dev
Mit "lsmod" sollte dann die neuen Module erscheinen
lsmod
Diese Änderungen sind nun natürlich nur bis zum nächsten Neustart. Wenn der Start erfolgreich war, können Sie die Einstellungen auch permanent machen, indem Sie in die beiden Module in "/etc/modules" addieren.
#sudo nano /etc/modules snd-bcm2835 i2c-dev
Ich habe dann die i2ctools installiert, damit ich per Kommandozeile schon mal die Basisfunktionen überprüfen kann.
#sudo apt-get Update && apt-get install i2c-tools
Nach der erfolgreichen Installation können Sie mit drei Programmen direkt den I2C-Bus steuern
- i2cdetect
Abfragen des Bus nach Teilnehmern und anzeigen:
#i2cdetect -y 1
- i2cdump
Anzeigen der Register eines angegebenen Geräts
#i2cdump -y 1 0xGerätenummer
- i2cGet und I2cSet
zum gezielten Lesen und Setzen von Registern.
I2C ist ein sehr flexibler Bus, für den es eine ganze Menge von Chip für unterschiedliche Aufgaben gibt. Ideal also um andere Geräte am RasPi anzuschliessen und die 3,3V GPIO-Ports zu schützen oder für andere Zwecke nutzen zu können.
- Vorbereiten des Raspberry Pi auf I2C
http://www.gsurf.de/vorbereiten-des-raspberry-pi-auf-i2c/
PCF8583 -Clock und Counter (0xA0 und 0xA2)
Dieser Baustein ist eine Uhr oder Counter, je nachdem wie man ihn verschaltet. Es ist aber keine "Echtzeituhr", da er keine eingebaute Batterie hat. Er kann aber "gestellt" werden und über einen eingebauten Taktgeber zählt er dann weiter. Genau dieser Taktgeber kann aber auch als Eingang verwendet werden, so dass man Impulse zählen kann. Er ist für unter 2€ erhältlich
- PCF 8583 P :: CLOCK-KALENDER
DIP (1,45€)
http://www.reichelt.de/?ARTICLE=14531
Der Baustein kann so verschalter werden, dass er Signale am Anschluss OCSI mit bis zu 32768 Hz zählen kann und Werte von 0-999999 annimmt. Der Anschluss ist denkbar einfach:
Der Anschluss eines einzelnen Chips am RasPi ist dann sehr einfach zu gestalten. An Pin 1 ist der Eingang
Quelle:
http://evil.hn.vc/linux/HomeServer/pdf/Raspberry%20Pi%20-%20Hardware.pdf
Seite 11
Der Chip hat eine fest "Slave"-Adresse 101000A, und nur der Wert A kann über einen Pin geschaltet werden. Sie können so auf einem I2C-Bus also maximal zwei dieser Bausteine verwenden oder müssen eine weitere Logik addieren.
- I2C-Bus Counter
http://www.umnicom.de/Elektronik/Schaltungssammlung/I2C-Bus/I2CCounter1/I2CCounter1.html
Uhr am I2C mit DS1307 (Hex D0)
Dass der RasPi keine Uhr "onBoard" hat, ist natürlich nervig, speziell wenn man Daten erfassen will. Sicher kann der RasPi mit Linux sich die Uhrzeit per NTP aus dem Internet holen, aber das geht doch nicht immer. Aber auch hier gibt es Abhilfe mit einem I2C Baustein DS 1307 :: Real Time Clock I²C für ca. 2,40 (Reichelt Okt 2013). Ein kleines Quarz dazu und eine Batterie (3Volt Lithium hält 10 Jahre) als Stütze und der RasPi hat eine echte Uhr. Nebenbei hat der Chip noch berauschende 56byte SRAM frei. Da könnte man schon den ein oder anderen Zählerstand speichern
- Datenblatt
http://datasheets.maximintegrated.com/en/ds/DS1307.pdf - DS 1307 :: Real Time Clock
I²C 56B NV SRAM, DIP-8
http://www.reichelt.de/?ARTICLE=58149 - RTC – DS1307
http://www.pgollor.de/cms/?page_id=764
LCD per I2C (Hex 24)
Wenn man nun den Anschluss schon mal hat, kann auch schnell ein LCD angeschlossen werden. Passende Software für den RasPi gibt es schon und die LCDs sind selbst als Bausatz nicht teuer
- LCD-I2C Modul (7€)
http://www.pollin.de/shop/dt/NDU4OTgxOTk-/Bausaetze_Module/Bausaetze/LCD_I2C_Modul.html
Das Gerät meldet sich mit der Adresse 24 am I2C Bus.
Digital In/Out mit PCF8574 (0x40/0x42 - 0x4E)
Für 1,10 Euro gibt es auch einen I2C Baustein (PCF8574), der 8 Ein/Ausgänge hat. Damit lassen sich dann einzelne LEDs oder über Verstärker auch größere Lasten schalten. Interessant ist aber auch die Kombination eines solchen Chips mit dem 8583, um mehr als zwei Geräte am Bus zu haben. Der Ausgang kann dann per AND-Gatter die A0-Leitung steuern und quasi immer einen von 8 PCF8583 auf A0=1 stellen. Eine Software würde dann über einen "Write" auf den PCF8574 erst den Zähler auswählen und dann abrufen. Aber auch einfache zusätzliche LED-Anzeigen sind schnell gebaut, da der Chip genug Strom für LED-Ansteuerungen liefert.
Mit den zusätzlichen Leitungen A0,A1 und A2 können sie bis zu 8 gleiche ICs am Bus betreiben. Zusätzlich gibt es mit dem PCF8574A den gleichen Chip nochmal mit einer weiteren Adresse, so dass Sie auf einem Bus direkt 16 Bausteine a 8 Ein/Ausgänge anschließen können. z.B. wie hier:
Über den PCF8574 sollten sie immer nur genau einen Ausgang auf 1 setzen uns so bei genau einem der PCF8583P die A0-Leitung hochziehen und damit auf der Adresse 0xD1 sichtbar werden lassen, während alle anderen auf 0xD0 laufen, aber nicht angesprochen werden. Das hier gezeigte Schaltbild ist natürlich nicht komplett. Wer nur zwei PCF8583 auf einem Bus betreibt, kann sich die Auswahl sparen und einen auf A0=0 und den anderen aus A0=1 stellen
Leider kann der PCF8574 nicht direkt zählen.
- PCF 8574 P :: Philips
I²C-Bus Microcontroller &
Peripherie D
http://www.reichelt.de/?ARTICLE=14527 - MCP 23017
http://ww1.microchip.com/downloads/en/devicedoc/21952b.pdf - Raspberry Pi: MCP23017 I2C
IO-Expander mit Python steuern
http://www.gsurf.de/mcp23017-i2c-mit-python-steuern/ - I2C-Bus Counter
http://www.umnicom.de/Elektronik/Schaltungssammlung/I2C-Bus/I2CCounter1/I2CCounter1.html - Tutorial: Arduino and the
I2C bus – Part Two
https://tronixstuff.com/2010/10/29/tutorial-arduino-and-the-i2c-bus-part-two/
I2C und lange Leitungen
I2C ist eigentlich ein Bus in einem Gerät. Aber vielleicht will ich im Heizungskeller nicht jeden Temperaturfühler an einen Mikroprozessor hängen sondern einfach mehrere Geräte über ein paar Meter anschließen. Das ist ja die Grundidee bei einem Bus. Dann muss ich mir aber auch Gedanken über Spannungspegel, Leitungskapazitäten, Störeinflüsse und Baudraten machen. Das hat aber NXP schon gemacht
AN10658 "Sending I2C-bus signals via long
communications cables",
www.nxp.com/documents/application_note/AN10658.pdf
Im Grund kann man es versuchen aber I2C ist als Bus mit Pegelsteuerung nicht besonders störfest. Man könnte die Baudrate reduzieren, die Pullup-Widerstände kleiner machen, damit mehr Strom fließt aber dann müssen das alle Slaves und der Master auch verkraften. Für längere Strecken ist daher eine Stromschleife (RS485) der bessere Ansatz.
Es gibt mit dem Baustein "P82B715" einen Signal/Busextenter, der laut Hersteller dann bis zu 50M überbrücken kann.
P82B715 I 2C-bus extender
https://www.nxp.com/docs/en/data-sheet/P82B715.pdf
I2C Tester
Wenn man ein I2C-Bauteil hat aber dessen Adresse nicht kennt, dann gibt es einfache Projekte, um die Adressen zu lesen-
- Ein kostengünstiger und mobiler I2C
Scanner
https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/ein-praktischer-und-kostengunstiger-i2c-scanner - m5stack / M5-ProductExampleCodes
https://GitHub.com/m5stack/M5-ProductExampleCodes/blob/master/BasicExamples/i2c_scanner/i2c_scanner.ino
Weitere Links
- Raspberry:GPIO
- I2C-Bus
- Wikipedia I²C
http://de.wikipedia.org/wiki/I%C2%B2C - I2C: MCP23008 and MCP23017
extensions
http://wiringpi.com/the-gpio-utility/i2c-mcp23008-and-mcp23017-extensions/ - Raspberry Pi and Arduino
linked via I2C
http://quick2wire.com/category/i2c/ - Upcoming board revision
http://www.raspberrypi.org/archives/1929 - Baumstrukturmodus | Linearer
Modus RasPi und I2C+SPI
http://www.forum-raspberrypi.de/Thread-raspi-und-i2c-spi - Kampis Elektroecke I²C
http://kampis-elektroecke.de/?page_id=2035 - NXP I2 C-bus solutions 2013:
Smart, simple solutions für the
12 most common design concerns
http://www.nxp.com/documents/leaflet/75017424.pdf - Hardware Installation auf
Raspberry PI
http://evil.hn.vc/linux/HomeServer/pdf/Raspberry%20Pi%20-%20Hardware.pdf - The I2C Clock Speed – Why
Accuracy Doesn’t Matter
https://www.i2c-bus.org/speed/ - TAKING THE LEAP OFF BOARD:
AN INTRODUCTION TO I2C OVER LONG
WIRES
https://hackaday.com/2017/02/08/taking-the-leap-off-board-an-introduction-to-i2c-over-long-wires/
Sehr gute Beschreibung der Länge und Kabelkapazitäten.