I2C-Bus / IIC-Bus
Der 1-Wire Bus ist nur eine Möglichkeit zwei oder mehrere Geräte elektrisch miteinander zu verbinden. der I2C oder TWI (Two Wire Interface)-Bus ist eine weitere Möglichkeit. Diese Bus kann mit entsprechenden Extendern auch über etwas längere Entfernungen genutzt werden. Eine direkte EinsatzMöglichkeit bei Exchange und Lync ist natürlich nicht gegeben. Aber über I2C kann z.B. die Umgebung (Temperatur/Feuchtigkeit) überwacht werden oder Anzeigen gesteuert werden. Das Interface ist auch nicht mal zu selten anzutreffen. In vielen elektronischen Geräten kommunizieren interne Systeme damit.
- Wikiedia - I2C
https://de.wikipedia.org/wiki/I%C2%B2C
Für den I2C-Bus sind neben der Energieversorgung zwei Leitungen für Takt und Daten erforderlich. Manchmal finden Sie daher auch die Bezeichnung "TWI" für "Two Wire Interface", was den Bus dann auch zu "1-Wire Bus" abgrenzt.
I2C Grundlagen
Mein Stichwortzettel zum I2C-Bus ist:
- Es gibt genau einen Master
Der steuert die komplette Kommunikation und versorgt auch den Bus mit Energie - Ein oder mehrere Slaves werden parallel an den Bus angeschlossen
- Spannungsgesteuert mit Open Collector
Jeder Teilnehmer kann den Bus "auf Masse ziehen". Das Verfahren bedeutet natürlich, dass die Spannungen und Ströme nicht zu hoch sein dürfen, damit die Geräte nicht zu viel Verlustleistung erzeugen. Da nicht mit differenziellen Werten oder Strömen gearbeitet wird, ist der Bus recht störanfällig und sollte auf kurze Strecken beschränkt werden. - Jeder Slave muss eine eindeutige Adresse
habe
Einige Geräte haben dazu Jumper oder Pins, mit denen die Adresse verändert werden kann. - 5Vold / 3,3,Volt Pegelwandler
In der Spezifikation sind High/Low mit 0,7/0,3 von Vdd spezifiziert. Wenn der Bus mit 3,3V betrieben wird aber einige Geräte mit 5V parallel existieren, dann erkennen diese "3,3V" nicht mehr zuverlässig hals High. Mit Pegelwandlern kann dies gelöst werden
TWI/I2C mit 5/3,3V
Die klassische Arduino-Plattform nutzt 5 Volt-Pegel, während ESP8266/ESP32 und andere Bausteine schon auf 3,3V-Technik aufsetzen und damit mit LiPO-Akkus (3,7V) arbeiten können.
Da I2C ja eine "Open collector"-Schaltung nutzt und jeder Teilnehmer die Datenleitung auf "GND" ziehen kann, ist im Grund der Parallelbetrieb von 5V Geräten und 3,3V Geräten möglich. Allerdings darf die Datenleitung, die vom Master gespeist wird, natürlich nicht mehr als die 3,3V haben, um diese Geräte nicht ggfls. zu zerstören. Das bedeutet natürlich, dass Geräte mit 5V auch einen 3,3V Pegel als "High" erkennen müssen. Auf kurzen Stecken mit wenigen Geräten geht das oft sogar gut. Aber je länger die Verbindungsleitungen sind, desto instabiler wird das Verhalten.
Wer auf der sicheren Seite sein will, setzt entsprechende Bidirektionale Wandler ein
AN97055 Bidirektionaler Pegelwandler
https://cdn-shop.adafruit.com/datasheets/an97055.pdf
http://www.semiconductors.philips.com/acrobat/applicationnotes/AN97055.pdf
I2C Adressen
Alle Geräte auf dem I2C Bus werden über individuelle Adressen angesprochen. Diese können aber bei den meisten Sensoren nicht frei konfiguriert werden. Meist lassen sich über 3 Bit nur 8 unterschiedliche Adressen aus den 127 möglichen Adressen einstellen. Wenn Sie gleiche Sensoren parallel einsetzen, dann müssen Sie eindeutige Adressen herstellen.
Ich habe mehrere I2C Geräte bislang eingesetzt und folgende Adressen dabei gefunden.
Defaultadresse | Bereich | Baustein |
---|---|---|
|
0x0-0x0F |
reservierte Adressen |
0x27 |
0x27-0x37 |
HD44780 LDC mit I2C Interface |
0x29 |
0x29 |
VL6180X Time of Flight Distance Ranging Sensor |
0x76 |
0x76-0x77 |
BME 280 Temp/Barometer/Hygrometer |
|
0x78-0x7B |
Reserviert für 10bit Adressierung |
|
0x7c-0x7f |
Reserviert für zukünftige Erweiterungen |
Wenn Sie ein unbekanntes Gerät haben, dann können Sie es an einen IC2 ohne weitere Geräte hängen und danach suchen. Es sind ja maximal 127 Adressen bei einer 7-bit Adressierung
#include <Wire.h> void setup() { Wire.begin(); Serial.begin(115200); } void devicefound(int i2caddr, int errcode, String message) { Serial.print("Scanning Address:0x"); if (i2caddr<16) {Serial.print("0");} Serial.print(i2caddr,HEX);Serial.print(String(" " + message));Serial.print(" Code: ");Serial.println(errcode); } void loop() { byte error, address; int totaldevices = 0; Serial.println("--- Start Scan for I2C-Devices---"); for(address = 1; address < 127; address++ ) { Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { devicefound(address,0,"Device Found"); totaldevices++; } else if (error==4) { devicefound(address,4,"Error 4"); } else if (error==2) { // devicefound(address,2,"No Device"); } else { devicefound(address,error," Unknown Error"); } } Serial.print("Total Devices:");Serial.println(totaldevices); delay(5000); // wait 5 seconds for next scan }
Die Ausgabe erfolgt auf dem seriellen Port mit 115200 Baud:
- AdaFruit Adressen
https://learn.adafruit.com/i2c-addresses
https://learn.adafruit.com/i2c-addresses/the-list
I2C am PC
Die I2C-Schnittstelle gehört nicht zum Standardanschluss eines PCs. Wer Sensoren über diesen Bus am PC anschließen will, benötigt einen Adapter. Den gibt es mittlerweile z.B. von ELV kommerzielle. Wer mag kann aber auch einfach z.B. einen Arduino hernehmen, der problemlos ein I2C-Interface abbilden kann und per USB die Befehle annimmt und die Daten zurück meldet.
- ELV Artikel-Nr.: 68-08 41 23 USB-I2C-Interface,
Komplettbausatz inkl. Gehäuse,
bearbeitet und bedruckt, USB-Kabel, 3 Anschlusskabel 25€
https://de.elv.com/elv-usb-ic-interface-usb-i2c-092255 (34€ Fertig)
http://www.elv.de/USB-i2c-interface-komplettbausatz-inkl-gehaeuse-bearbeitet-und-bedruckt-USB-kabel-3-anschlusskabel.html (25€ Bausatz) - ELV Komplettbausatz
USB-I2C-Interface, inkl.
Gehäuse, USB-Kabel, 3
Anschlusskabel 25€
https://de.elv.com/elv-usb-i2c-interface-komplettbausatz-inkl-gehaeuse-bearbeitet-und-bedruckt-usb-kabel-3-anschlusskabel-084123
Sie können natürlich auch mit einem ESP8266, ESP32, Arduino o.ä. sich eine vergleichbare Lösung auch selbst zusammen schneiden. Wenn )sie auch ein Gehäuse suchen, dann schauen Sie sich z.B. den M5Atom Lite (M5Stack, 5 US$) an, der per USB-C am PC eine serielle Schnittstelle anbietet und über einen Grove-Stecker auch I2C spricht. Dann fehlt nur noch die passende Software oder die installieren MicroPython oder LUA als interaktiver Interpreter über ein serielles Terminal.
- I2C Module
https://nodemcu.readthedocs.io/en/release/modules/i2c/ - NodeMCU I2C with ESPlorer IDE
https://www.electronicwings.com/nodemcu/nodemcu-i2c-with-esplorer-ide
I2C auf langen Strecken
Auch wenn gegenüber 1-Wire der I2C Bus neben Stromversorgung und GND eine eigene Leitung für Daten und eine Leitung für Takt hat, und damit der Takt gedrosselt werden kann, so sind lange Leitungen durch ihre Kapazitäten immer ein "Problem" für Rechtecksignale. Die Übertragung erfolgt ja per "Pegel" und nicht als Stromschleife. Aber auch hier gibt es spezielle Chips, die auch längere Stecken überbrücken.
- P 82B96 I²C-Bus Repeater/Hubs/Extenders
- P 82B715 I²C bus extender
Es gibt aber auch einen "Differential I2C" Mode. Ein Chip setzt dabei die beiden Leitungen auf zwei Leitungspaare mit differenziellen Spannungen um.
- PCA9615
'https://www.nxp.com/products/interfaces/ic-spi-serial-interface-devices/ic-bus-repeaters-hubs-extenders/2-channel-multipoint-fast-mode-plus-differential-i2c-bus-buffer-with-hot-swap-logic:PCA9615DP - PCA9615
https://www.antratek.de/differential-i2c-breakout-pca9615-qwiic
Laut Datenblatt soll die Reichweite dann bei 1 MBit bis zu 3 Meter betragen. I2C ist ein Bus innerhalb eines Gerät.
Wer lange Leitungen bedienen will, sollte sich eher bei RS-485 / ModBus umschauen, auch wenn Sie dann vielleicht noch einen ATTiny als Umsetzer für einen I2C-Sensor dazwischen schalten müssen.
Weitere Links
- RS485 / ModBus / DMX
- RasPi und I2C
- Raspi und 1-Wire
- I2C-Baustein gibt., der
zählen kann
http://www.mikrocontroller.net/part/DS1372 - I2C 2-Kanal-Counter
http://www.cctools.eu/ext_index.php/artikel/1828 - I2C Bausteine
http://www.horter.de/i2c/index.htm - Schnittstellen Serielle Schnittstelle, USB, Feldbusse, SPI, I2C, 1-Wire etc.
http://www.netzmafia.de/skripten/hardware/Control/schnittstellen.pdf - ELV Artikel-Nr.: 68-09 92 53
I2C-BUS Displaymodul I2C-LCD,
Komplettbausatz 14€
http://www.elv.de/elv-i2c-bus-displaymodul-i2c-lcd-komplettbausatz.html - ESP32: Beide
I²C-Schnittstellen verwenden
https://www.az-delivery.de/blogs/azdelivery-blog-fur-arduino-und-raspberry-pi/esp32-beide-i-c-schnittstellen-verwenden