Tumgik
#ArduinoI2CScanner
draegerit · 3 months
Text
Arduino I2C-Scanner für ESP8266 & ESP32 anpassen: Eine Schritt-für-Schritt-Anleitung
Tumblr media
In diesem Beitrag möchte ich dir eine Schritt-für-Schritt-Anleitung geben, wie du den I2C Scanner von Arduino.cc für die ESP8266 & ESP32 Mikrocontroller anpassen kannst.
Tumblr media
Arduino I2C-Scanner für ESP8266 & ESP32 anpassen: Eine Schritt-für-Schritt-Anleitung Die Idee zu diesem Beitrag kam von einem Leser meines Blogs, welcher Probleme mit dem ESP8266 speziell den von Ideaspark hatte und keine Geräte mit dem IC2 Scanner von Arduino.cc gefunden hat.
Wie funktioniert die I2C Kommunikation?
Um das Beispiel von Arduino.cc für den I2C-Scanner auf ESP8266 und ESP32 anzupassen, ist es zunächst wichtig zu verstehen, wie die I2C-Kommunikation funktioniert. Die I2C-Kommunikation ermöglicht es, verschiedene Geräte wie Sensoren und Aktoren mit einem Mikrocontroller zu verbinden. Hierbei erfolgt die Verbindung über zwei Drähte, die als Bus bezeichnet werden und an die Pins des Mikrocontrollers angeschlossen sind. Die I2C-Geräte, die an den Bus angeschlossen sind, verfügen über eindeutige Adressen. Diese Adressen bestehen aus 7 Bits und ermöglichen die eindeutige Identifikation jedes angeschlossenen Geräts. Durch diese Adressierung ist es möglich, mehrere Geräte an einer I2C-Schnittstelle anzuschließen und gleichzeitig zu betreiben. Die I2C-Schnittstelle nutzt zwei Signalleitungen: eine für die Datenübertragung (SDA) und eine für die Taktfrequenz (SCL). Die Kommunikation erfolgt über ein Master-Slave-Prinzip, wobei der Mikrocontroller als Master agiert und die angeschlossenen Geräte als Slaves. Der Master initiiert die Kommunikation, sendet Befehle und fordert Daten von den Slaves an.
Tumblr media
Master / Slave auf dem I2C-Bus Nachdem das Grundverständnis für die I2C-Kommunikation etabliert ist, können wir das Beispiel von Arduino.cc für den I2C-Scanner anpassen, um die Geräte auf ESP8266 und ESP32 Mikrocontrollern zu erkennen.
I2C Adressen der verschiedenen Mikrocontroller
Zunächst möchte ich dir eine Tabelle geben, mit den Pins SDA & SCL für die I2C Schnittstellen der verschiedenen Mikrocontroller. MikrocontrollerSDASCLArduino UNO, Arduino NanoA5A4Arduino MicroD2D3Arduino Mega 2560 R3D20D21Arduino DUED20D21Wemos D1 Mini - ESP8266D2 (GPIO04)D1 (GPIO05)ESP8266 - IdeasparkD6 (GPIO12)D5 (GPIO14)ESP32GPIO21GPIO21ESP32 S3GPIO08GPIO09 Den Mikrocontroller Raspberry Pi Pico / Pico W kannst du ebenso in der Arduino IDE programmieren, dieser hat zwei I2C Schnittstellen (I2C0 & I2C1) und diese sind an allen 26 GPIOs verfügbar.
Tumblr media
Pinout des Raspberry PI Pico
Suchen nach I2C Geräte
Nachdem wir ermittelt haben an welche Pins die I2C Schnittstellen anliegen, möchten wir nun nach Geräten an diesen Pins suchen. Dazu nutze ich zunächst wie erwähnt den I2C Scanner von Arduino.cc. #include byte error, address; int nDevices = 0; void setup() { Wire.begin(); Serial.begin(9600); while (!Serial) ; Serial.println("nI2C Scanner"); } void loop() { Serial.println("Scanning..."); nDevices = 0; for (address = 1; address < 127; address++) { Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0 || error == 4) { if (error == 0) { Serial.print("I2C device found at address 0x"); nDevices++; } else { Serial.print("Unknown error at address 0x"); } Serial.print((address < 16 ? "0" : "") + String(address, HEX) + "!"); } } if (nDevices == 0) { Serial.println("No I2C devices found"); } else { Serial.println("done"); } delay(5000); }
Tumblr media
Ausgabe der I2C Adresse eines Displays vom I2C Scanner I2C Scanner für ESP8266 & ESP32 umschreiben Um die Suche nach Geräten auf anderen Pins des I2C-Busses zu ermöglichen, ist es erforderlich, der Funktion "begin" des Wire-Objekts die entsprechenden SDA- und SCL-Pins zu übergeben. Das kann man aber nur, wenn die Implementierung es zulässt und das ist abhängig vom gewählten Mikrocontroller! Daher muss geprüft werden, welcher Mikrocontroller / welches Board in der Arduino IDE ausgewählt wurde. #if defined(ARDUINO_ESP8266_GENERIC) #define otherBoard //Boardconfiguration for Heltec HTIT-W8266 board with oboard OLED Display BoardConfiguration bc = { "Generic ESP8266 Module", 1, { { 16, 24 } } }; #endif Eine Liste an den möglichen Werten findest du in der Datei boards.txt im Ordner zum Mikrocontroller bzw. zum Boardtreiber. %user%AppDataLocalArduino15packagesesp8266hardwareesp82663.1.2 Aus dieser Datei können wir den Namen entnehmen und das Board welches dann später erkannt wird. generic.name=Generic ESP8266 Module generic.build.board=ESP8266_GENERIC Wo kommt der Präfix "ARDUINO_" her? Wenn du den Code gelesen hast, dann siehst du, dass die Bezeichnung immer den Präfix "ARDUINO_" trägt. Diese kommt daher, dass dieses als Parameter übergeben wird. Datei "platform.txt" -DARDUINO_{build.board} Prüfen des gewählten Boards In der Funktion loop wird nun geprüft, ob ein Feld "otherBoard" oder "arduinoBoard" existiert. Diese wurden zuvor abhängig vom Board erzeugt. Das funktioniert mit dem precompile Befehl #define. Danach wird dann abhängig vom Board entweder eine For-Schleife oder der default gestartet. void loop() { Serial.print("An "); Serial.print(bc.boardname); Serial.println(" was recognized!"); #if defined(otherBoard) uint8_t numI2CInterfaces = bc.numI2CInterfaces; Serial.println("The microcontroller has " + String(numI2CInterfaces, DEC) + " I2C Interfaces!"); for (int pair = 0; pair < numI2CInterfaces; pair++) { uint8_t(*i2cPins) = bc.i2cPins; uint8_t sda = i2cPins; uint8_t scl = i2cPins; Serial.println("t SDA: " + String(SDA, DEC) + ", SCL: " + String(SCL, DEC)); Wire.begin(sda, scl); Serial.println("tScanning..."); findDevices(); } #else #ifdef defined(notDeclaredBoard) Serial.println("Boardtype not found, try default!"); #endif Wire.begin(); Serial.println("tScanning..."); findDevices(); #endif Serial.println("End."); delay(10000); } Wenn die Suche ausgeführt wird, dann erhalten wir wie beim Original im seriellen Monitor die Ausgabe der gefundenen I2C Adressen.
Tumblr media
Ausgabe der gefundenen I2C Adressen im seriellen Monitor
Download vom GitHub Repository
Das Programm findest du auf meinem GitHub Repository StefanDraeger/universal-I2C-Scanner. Dort kannst du dir dieses dann als ZIP-Datei herunterladen. Es gibt derzeit sehr viele Mikrocontroller auf dem Markt, daher ist die Implementierung aller Konfigurationen sehr aufwändig. Jedoch habe ich begonnen, bereits einige einzutragen. Sollte dir ein Mikrocontroller fehlen, so schreibe mir eine Mail an [email protected]. Read the full article
0 notes