Conectando NodeMCU(ESP12) con Arduino nano “I2C”

Introducción:

En este proyecto utilizaremos:
1- 1 NODEMCU (ESP12E).
2- 1 Arduino Nano
3- 5 LEDs
4- breadboard
5- Cables de conexion

Para configurar el Ide de arduino lee esto: Instructable to setup the Arduino IDE to program ESP 8266!
Programming ESP8266 using Arduino IDE : http://bit.ly/2hdARij
Getting started with ESP8266 : http://bit.ly/2hdARij
ESp8266 with Arduino: http://bit.ly/2hdARij
ESP8266 with Raspberry Pi : http://bit.ly/2hdARij
ESP8266 Arduino Core : http://bit.ly/2hdARij
Schematic : http://bit.ly/2hdARij
ESP8266 : http://bit.ly/2hdARij

Que es el I2C?

Un circuito interintegrado (I²C, del inglés Inter-Integrated Circuit) es un bus serie de datos desarrollado en 1982 por Philips Semiconductors (hoy NXP Semiconductors). Se utiliza principalmente internamente para la comunicación entre diferentes partes de un circuito, por ejemplo, entre un controlador y circuitos periféricos integrados.

Mas información:
Wikipedia

http://www.gammon.com.au/i2c

El I²C está diseñado como un bus maestro-esclavo. La transferencia de datos es siempre inicializada por un maestro; el esclavo reacciona. Es posible tener varios maestros mediante un modo multimaestro, en el que se pueden comunicar dos maestros entre si, de modo que uno de ellos trabaja como esclavo. El arbitraje (control de acceso en el bus) se rige por las especificaciones, de este modo los maestros pueden ir turnándose.

Protocolo I2C

Como Funciona ?

Inicio de Comunicación “Maestro Esclavo”

La imagen abajo muestra mediante un analizador lógico el carater “S”(0x53), siendo enviado desde el Maestro al esclavo con dirección 42

Analisis logico I2C

From the above graphic note the following points of interest:

  • La transmisión empieza con “Condición Especial”, etiquetada como “START”. Cuando el SDA “Serial Data” es puesto bajo mientras el SCL (serial clock) se mantiene en alto.
  • Los 7-bit de direccion son transmitidos al esclavo el bit  mas significativo primero primero. En este caso es el 42(0X2A o ob0101010). El analizador logico reporta la direccion 0x54, pero realmente 0x2A(42) movido hacia la izquierda un bit, enotoces es que la escritura “write” bit (0) es pocicionado en el ultimo bit significativo.
  • Entonces la lectura/escritura es transmitida. 0 es scritura ( de maestro a esclav0) y 1 esclavo/maestro.
  • El maestro espera por el esclavo para poner  linea SDA en estado bajo con un  ACK (acknowledge) indicando que la direccsion del esclavo existe y esta preparada para recibir datos. si el sclvo esta conectado y no tiene la misma direccion requerida por el maestro, entonces ignarara la linea SDA dejando la lina en estado alto. Esto se indicar con un NAK (negative acknowledgement).
  • Entonces el byte de datos(0x53 en este caso) es transmitido el mayor bit significativo primero.
  • Otra vez despues de los 8 bits de datos el maestro revisa que el sclavo acknowledges poniendo la linea SDA en estado bajo.
  • Mas datos son trasmitidos pero no se muestran en esta grafica.
  • La transmision termina con un “Conficion de paro” (etiquetado  Stop) soltando la linea SDA para ponerla en alto mientras la linea SCL tambien se mantiene en alto.

Primeras pruebas:

Enviar una cadena de datos

Objetivo:

Enviar una secuencia de números del 3 al 7 para configurar los pines digitales del Arduino nano del 3 al 7 y cambiar el estado del led, conectados a cada pin.

Arduino Uno Configuración de pin:

Analog port 4 (A4) = SDA (serial data)
Analog port 5 (A5) = SCL (serial clock)

NodeMCU V1 pint out:
Master

gpio 0 (D3) = SDA (serial data)
gpio 1 (D4) = SCL (serial clock)

 

Serial.begin(9600);
  //pin D3: sda,pin:D4 scl. join the I2C bus as  master
  Wire.begin(0, 2);
  Serial.println("I2C Master READY!");
Master

Este paso es importante ya que he probado con otros pines y no funcionan de momento con estos pines me ha funcionado perfectamente.

En este video explico de manera mas amplia la configuracion para transmitir datos por I2C entre el NodeMCU y el arduino nano.

En siguientes post y videos seguire haciendo mas pruebas como el de utizar una libreria para poder enviar cualquier tipo de datos, el  ejemplo sera con un sensor de temparatura.

#include <Wire.h>

const byte ARDUINO_SLAVE_ADDRESS = 42;

void setup ()
{
  Serial.begin(9600);
  //pin D3: sda,pin:D4 scl. join the I2C bus as master
  Wire.begin(0, 2);
  Serial.println("I2C Master READY!");

  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}  // end of setup

void loop ()
{
  for (byte x = 3; x <= 7; x++)
  {
    Wire.beginTransmission (ARDUINO_SLAVE_ADDRESS);
    Wire.write (x);

    if (Wire.endTransmission () == 0) {
      digitalWrite (LED_BUILTIN, HIGH);
      Serial.println(String("Data Sent:") + byte(x) + String(" OK"));

    } // end of IF loop
    else {
      digitalWrite (LED_BUILTIN, LOW);
      Serial.println(String("Data Sent:") + byte(x) + String(" NOT OK"));
    }// end of ELSE loop
    delay (200);
  }  // end of for loop
  delay(5000);
}  // end of loop
NODEMCU Master
#include <Wire.h>

const byte MY_ADDRESS = 42;

void setup ()
{
  Serial.begin(115200);
  Wire.begin (MY_ADDRESS);
  for (byte i = 2; i <= 7; i++)
    pinMode (i, OUTPUT);
  // set up receive handler
  Wire.onReceive (receiveEvent);
}  // end of setup

void loop()
{
  // nothing in main loop
}

// called by interrupt service routine when incoming data arrives
void receiveEvent (int howMany)
{
  for (int i = 0; i < howMany; i++)
  { 
    Serial.print(String("valor del howMany:") + byte(howMany));
    byte c = Wire.read ();

    // toggle requested LED

    if (digitalRead (c) == LOW) {
      Serial.println(String("Receiving Data:") + byte(c));
      Serial.println(String("Pin:")+byte(c) + String("Is now ON ..."));
      digitalWrite (c, HIGH);
    } // end of IF loop
    else {
      digitalWrite (c, LOW);
      Serial.println(String("Pin:")+byte(c) + String("Is now OFF ..."));
    } // end of else loop
  }  // end of for loop
}  // end of receiveEvent
Arduino NANO sclavo

4 opiniones en “Conectando NodeMCU(ESP12) con Arduino nano “I2C””

    1. En teoria habria que adaptarlos pero cuando hice la prueba funciono bien sabiendo que el arduino trabaja con 5v y el esp con 3.3V
      ya lo habia mirado en otros foros y les habia funcionado.
      Puede ser por la tolerancia que tengan uno y otro.
      Voy a rebuscar informacion para ver si hay alguna explicacion, pero lo cierto es que va bien.

  1. Hola,
    Soy brasileño y estoy haciendo uno circuito igual que el tuyo. Me puedes decir cuales son las especificaciones de los componentes utilizados? O sea, los valores de los resistores.

    Muchas gracias,
    Thiago.

Deja un comentario