Arduino

ESP8266: I2C Poort and Adres Scanner

Laatst bijgewerkt: 11/02/2021

De i2c_port_address_scanner.ino zal niet alleen het adres van uw I2C apparaat ontdekken, maar ook de PORT nummers waaraan SLA en SLC zijn gekoppeld.
Voor een beginneling kan het toevoegen van een I2C apparaat frustrerend zijn. Verschillende dingen moeten goed worden uitgelijnd om dingen te laten werken. Verschillende kaarten hebben verschillende toewijzingen tussen poortnummer en GPIO nummer. Bovendien moeten de opgegeven poorten in het programma overeenkomen met de verbonden poorten op het bord. Bovendien moeten de SLA en het SLC paar goed aansluiten bij wat in de code staat.
Om een deel van dat mysterie uit te testen, is er een i2c_scanner.ino programma op Arduino.cc en Github. Maar om het te laten werken, moet de bedrading overeenkomen met de definities in een programma. Dat programma is alleen om het I2C adres te ontdekken.

Stap 1: Wat is de I2C bus?

I2C bus is een middel om meerdere randinvoer en uitvoerapparaten aan te sluiten die I2C op twee draden ondersteunen. Een van die draden is de DATA regel die de SDA wordt genoemd, terwijl de andere de CLOCK regel is die de SCL wordt genoemd. De informatie wordt op deze twee regels verzonden met behulp van het zogenaamde I2C communicatieprotocol. Ik zal niet ingaan op de details van I2C, maar voor duidelijkheid kan je hier en hier extra informatie krijgen.

Stap 2: dingen die je nodig hebt

U hebt een ESP8266 NodeMCU, ESP8266 nodig WeMos of ESP8266MOD module op een adapterkaart en een USB UART dongle.
Daarnaast zul je ook een paar I2C apparaten nodig hebben om te testen. Ik had een real time klokmodule DS1307 en een 0.96 inch OLED SSD1306 die ik zal gebruiken voor de test en demonstratie.
Een set aansluitdraden.

Stap 3: Setup

Twee verschillende setups voor demonstratie van de werking van i2c_port_address_scanner.ino.

Setup 1:
In deze opstelling verbinden we twee I2C apparaten op dezelfde bus. De i2c_port_address_scanner.ino zal ontdekken op welke poort de SDA en de SCL lijnen zijn aangesloten. Bovendien zal het ook het I2C adres van de twee apparaten ontdekken.

Setup 2:
In deze opstelling verbinden we de twee I2C apparaten op twee afzonderlijke bussen. De i2c_port_address_scanner.ino zal de twee bussen en het I2C adres van elk apparaat op hun respectievelijke bus ontdekken.

Stap 4: SETUP 1 Details

In deze opstelling verbinden we twee I2C apparaten op dezelfde bus. De i2c_port_address_scanner.ino zal ontdekken op welke poort de SDA en de SCL lijnen zijn aangesloten. Bovendien zal het ook het I2C adres van de twee apparaten ontdekken.
Ik heb een NodeMCU bord gebruikt omdat dat beschikbaar was, je kunt elk ander bord gebruiken.

Ik koos voor D1 (GPIO5) en D2 (GPIO4) als mijn buspoorten.

De verbindingen waren als volgt:

NodeMCU GPIO0 -> SCL (RTC) -> SCL (OLED)
NodeMCU GPIO4 -> SDA (RTC) -> SDA (OLED)
NodeMCU +3.3 -> VCC (RTC) -> VCC (OLED)
NodeMCU GND -> GND (RTC) -> GND (OLED)

Stap 5: Resultaat van SETUP 1

De afbeelding hierboven is vanzelfsprekend. Er zijn drie adressen op SDA: SCL paar GPIO4: GPIO0; 0x3C, 0x50 en 0x68. Je ziet drie adressen terwijl je twee apparaten hebt verbonden omdat het RTC bord een EEPROM heeft op adres 0x50. Het is toegankelijk voor het programma voor lezen en schrijven.

Stap 6: SETUP 2 Details

In deze opstelling verbinden we de twee I2C apparaten op twee afzonderlijke bussen. De i2c_port_address_scanner.ino zal de twee bussen en het I2C adres van elk apparaat op hun respectievelijke bus ontdekken.

De verbindingen waren als volgt:

NodeMCU D1 GPIO0 -> SCL (RTC)
NodeMCU GPIO4 -> SDA (RTC)
NodeMCU +3.3 -> VCC (RTC)
NodeMCU GND -> GND (RTC)
NodeMCU GPIO13 -> SCL (OLED)
NodeMCU GPIO5 -> SDA (OLED)
RTC (tegenovergestelde kop) +3.3 -> VCC (OLED)
RTC (tegenovergestelde kop) GND -> GND (OLED)

Stap 7: Resultaat van SETUP 2

De afbeelding hierboven is vanzelfsprekend.
Er zijn twee adressen op SDA: SCL paar GPIO4: GPIO0; ze zijn 0x50 en 0x68. Je ziet drie adressen terwijl je twee apparaten hebt verbonden omdat het RT bord een EEPROM heeft op adres 0x50. Het is toegankelijk voor het programma voor lezen en schrijven.
Er is één adres op de GPIO5: GPIO13; het is 0x3C.

Stap 8: De code van I2c_post_address_scanner.ino

De hoofdcode van de i2c_port_address_scanner.ino bestaat uit twee functies. De void scanPorts () heeft twee for lussen die de SDA en SCL paren selecteren en roept de functie void check_if_exist_I2C () op om de 127 mogelijke I2C adressen te scannen. Als er een wordt gevonden, wordt deze gepubliceerd op de seriële monitor.

void scanPorts() { 
for (uint8_t i = 0; i < sizeof(portArray); i++) {
	for (uint8_t j = 0; j < sizeof(portArray); j++) {
		if (i != j){
			Serial.print("Scanning (SDA : SCL) - " + portMap[i] + " : " + portMap[j] + " - ");
			Wire.begin(portArray[i], portArray[j]);
			check_if_exist_I2C();
		}
	}
}
}

Deze code is een aangepaste versie van de code die op het Arduino forum en op andere plaatsen is geplaatst

void check_if_exist_I2C() {
  byte error, address;
  int nDevices;
  nDevices = 0;
  for (address = 1; address < 127; address++ )  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0){
      Serial.print("I2C device found at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.print(address, HEX);
      Serial.println("  !");
      nDevices++;
    } else if (error == 4) {
      Serial.print("Unknow error at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.println(address, HEX);
    }
  } //for loop
  if (nDevices == 0)
    Serial.println("No I2C devices found");
  else
    Serial.println("**********************************\n");
  //delay(1000);           // wait 1 seconds for next scan, did not find it necessary
}

Arduino files

De code van dit project kan je hier downloaden.