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 und mehrere
Slaves
Der Master steuert die komplette Kommunikation und versorgt auch den Bus mit Energie während die Slaves passiv sind - Daten und Takt-Leitung sind
bidirektional und halbduplex
Eine Leitung gibt den Takt vor während die andere Leitung die Bits überträgt. - 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. - 5 Volt / 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 - 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
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 - Raspberry Pi I2C clock-stretching bug
http://www.advamation.com/knowhow/raspberrypi/rpi-i2c-bug.html
I2C Client mit ATTiny85 u.a.
Dass Mikrocontroller oder PCs als I2C-Master agieren und die verschiedenen Sensoren als Client angebunden ist, kennen Sie nun. Aber vielleicht möchten Sie I2C in Projekten nutzen, in denen Sie auch Sensoren selbst bauen wollen, weil es vielleicht keine geeigneten Geräte gibt. So kann ein Sensor mit einer gewissen Intelligenz ausgestattet werden und ein Master sammelt nur die Daten ein. Gerade mit dem ATTINY85 gibt es einen super kleinen Chip, der sich mit wenig Beschaltung dazu eignet. Allerdings brauchn Sie eine Client-Library und das Timing ist nicht immer trivial, wie das folgende Video gut beschreibt.
How to make DIY I2C slave devices with ease - ATtiny Device
https://www.youtube.com/watch?v=6BXPm6O2VaI
- ATTiny85
- Arduino TinyWire Slave Library
https://github.com/rambo/TinyWire - I2C (master and slave) on the ATtiny85
https://playground.arduino.cc/Code/USIi2c/ - Introducing the ATtiny Device PCB - I2C slave devices
https://www.tastethecode.com/introducing-the-attiny-device-pcb-i2c-slave-devices - https://www.instructables.com/I2C-Relay-Timer/
- ATtiny-device-examples
https://github.com/bkolicoski/ATtiny-device-examples - ATtiny85 I2C protocol tutorial
https://www.gadgetronicx.com/attiny85-i2c-protocol-tutorial/ - Python: bsc_i2c(i2c_address, data)
http://abyz.me.uk/rpi/pigpio/python.html#bsc_i2c
This function allows the Pi to act as a slave I2C device.
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.
- 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 guter Artikel über lange Leitungen und die Probleme mit I2C - WHAT COULD GO WRONG? I2C EDITION
https://hackaday.com/2016/07/19/what-could-go-wrong-i2c-edition/ - RPI I2C INTERFACE TO MICROCHIP EMBEDDED
UP – CLOCK STRETCHING
https://www.extremeelectronics.co.uk/rpi-i2c-interface-embedded-clock-stretching/
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 - 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 guter Artikel über lange Leitungen und die Probleme mit I2C - WHAT COULD GO
WRONG? I2C EDITION
https://hackaday.com/2016/07/19/what-could-go-wrong-i2c-edition/ - Advamation
RS-485-/I2C-Protokoll
https://www.advamation.de/produkte/automatisierungsbaukasten/advamation_protokoll.html