BorrowBits
connection serial spi i2c arduino uno nodemcu esp8266
Portada » Blog » Telecomunicaciones » ¿Cómo conectar NodeMCU con Arduino? Conexión serie UART, i2C y SPI

¿Cómo conectar NodeMCU con Arduino? Conexión serie UART, i2C y SPI

¿Cómo hacer que NodeMCU hable con Arduino? Hoy continuamos con la serie (y nunca mejor dicho) de artículos sobre IoT. En esta ocasión describimos las alternativas de las que disponemos: UART, SPI, i2C…

Como ya se introdujo en el artículo anterior, NodeMCU es un módulo Wi-Fi basado en el chip ESP8266. Su gran funcionalidad lo hace idóneo para proyectos IoT. Y aunque puede funcionar perfectamente como una placa «standalone», puede surgir la necesidad de ampliarlo con Arduino o de conectarlo a otros proyectos.

Para poder establecer una comunicación completamente bidireccional o full-duplex, necesitaríamos un camino independiente para enviar los datos y otro para recibirlo. Esto ha dado lugar a diversos protocolos de interconexión.

Tanto NodeMCU como Arduino nos ofrecen los siguientes:

UART/USART

También llamado simplemente Serie o Serial. Se trata de uno de los protocolos serie más antiguos y más utilizados. Una comunicación serie se llama así porque la transmisión es realizada bit a bit. Arduino y NodeMCU ofrecen puertos especiales etiquetados como Rx/Tx, y que están conectados internamente a un chip llamado UART (Universal Asynchronous Receiver-Transmiter). La UART permite tomar bytes de datos y convertirlos a una secuencia «serie» de bits. De forma inversa, en el receptor se encarga de tomar una secuencia entrante de bits y convertirlos en el bloque de bytes completo.

Los datos serían transmitidos de la siguiente forma: primero se envía un bit de inicio, a nivel bajo,  luego 8 bits de datos y un bit de parada a nivel alto.

En Arduino y NodeMCU, la comunicación serie UART se puede implementar mediante la librería Serial. Usa una línea de datos simple para transmitir y otra para recibir datos.

Placa Puertos UART
ESP8266 (NodeMCU)
  • Serial: GPIO3,GPIO1 (Rx,Tx) – Puede ser «remapeado» a GPIO15,GPIO13
  • Serial1: GPIO2 (Tx) – Sólo para transmitir
Arduino UNO
  • Serial: 0,1 (Rx,Tx)
Arduino MEGA/DUE
  • Serial: 0,1 (Rx,Tx)
  • Serial1: 19,18 (Rx,Tx)
  • Serial2: 17,16 (Rx,Tx)
  • Serial3: 15,14 (Rx,Tx)
Arduino Leonardo
  • Serial1: 0,1 (Rx,Tx)
  • Serial: reservado para USB CDC

Es importante destacar que, tanto en Arduino como en NodeMCU, los puertos UART correspondientes a Serial también se utilizan para la conexión USB cuando conectamos las placas a nuestro ordenador. Por tanto, este puerto no podrá usarse simultáneamente como Serial Monitor e interconexión con otras placas.

Por otro lado, los niveles TTL usados en la transmisión serán de 3.3V (o 5V, según la placa). No conectéis los pines directamente a un puerto serie RS232, ya que estos operan a 12V y pueden freíros la placa. Otra recomendación que nunca está de más: para evitar el olor a churrasco: interconectad las tierras (GND) de las placas entre sí.

Bus SPI

Bus SPI (serial peripheral interface) se trata de un estándar serie síncrono. Un maestro envía la señal de reloj (SCK), y tras cada pulso de reloj envía un bit al esclavo (SS). También se necesitan sendos puertos para la conexión MOSI para el Maestro Out Esclavo In, y MISO para Maestro In Esclavo Out. El bus SPI puede ofrecer un amplio ancho de banda, lo que lo hace óptimo para aplicaciones que requieren un gran intercambio de datos, como módulos de memoria y tarjetas microSD.

Placa MOSI MISO SCK SS (slave) SS (master) Level
ESP8266/NodeMCU GPIO13 ó SD1 GPIO12 ó SD0 GPIO14 ó CLK GPIO0 5V
Uno or Duemilanove 11 ó ICSP-4 12 ó ICSP-1 13 ó ICSP-3 10 5V
Mega1280 or Mega2560 51 ó ICSP-4 50 ó ICSP-1 52 ó ICSP-3 53 5V
Leonardo ICSP-4 ICSP-1 ICSP-3 5V
Due ICSP-4 ICSP-1 ICSP-3 4, 10, 52 3,3V
Zero ICSP-4 ICSP-1 ICSP-3 3,3V
101 11 or ICSP-4 12 or ICSP-1 13 or ICSP-3 10 10 3,3V
MKR1000 8 10 9 3,3V

Algunas cuestiones técnicas:

Los puertos ICSP en caso de Arduino están ubicados en un bunch de pines separado:

Una limitación a tener en cuenta es que SPI está diseñado para comunicaciones PCB y cableados muy cortos; no conviene sobrepasar los 15 cm, aunque se pueden hacer excepciones (bajando la velocidad del reloj, usando par trenzado, regeneradores de señal, etc).

La librería para implementar el bus SPI se llama SPI 🙂 A petición vuestra, hemos subido aquí un ejemplo de esta implementación.

Bus I2C/TWI

Bus I2C (algunos fabricantes lo llaman TWI) es otro protocolo serie síncrono cuyo nombre completo es circuito interintegrado. Una diferencia fundamental con SPI es que usa solo 2 cables, uno para el reloj (SCL) y otro para datos (SDA). Esto significa que el maestro y el esclavo envían datos por el mismo cable, el cuál es controlado por el maestro, que crea la señal de reloj. I2C no utiliza selección de esclavo, sino direccionamiento: cada dispositivo será identificado con una dirección única de 7 bits (es decir, de 0 a 127).

Algunos detalles técnicos a tener en cuenta:

  • Las direcciones 0-7 están reservadas: empezamos a direccionar a partir de 8.
  • Se necesitan resistencias de pull-up para conectar los pins SDA/SCL. En el caso de Arduino MEGA 2560, las resistencias de pull-up ya están integradas en la placa (on-board).
  • La comunicación está limitada hasta 450KHz por parte del ESP8266.
  • Se implementa a través de la librería Wire.
Placa Puertos I2C/TWI
ESP8266 (NodeMCU)
  • GPIO4 (SDA), GPIO5 (SCL)
Arduino UNO
  • A4 (SDA), A5 (SCL)
Arduino MEGA/DUE
  • 20 (SDA), 21 (SCL)
  • SDA1,SCL1 (sólo DUE)
Arduino Leonardo
  • 2 (SDA), 3 (SCL)

SoftwareSerial

SoftwareSerial es una librería oficial de Arduino que ha sido desarrollada para «emular» la funcionalidad de cualquier par de pin como puerto Serie-UART; de hecho se comporta como la clase estándar Serial. Aunque es una gran opción para extender los puertos UART, tienen algunas limitaciones:

  • Si usamos múltiples puertos serie, sólo podremos recibir un dato cada vez; los datos que lleguen en ese momento por otros puertos serán descartados.
  • No todos los pins de Arduino Mega y Mega 2560 soportan interrupciones, sólo los siguientes pueden ser usadas como puerto receptor RX: 10, 11, 12, 13, 14, 15, 50, 51, 52, 52, A8, A9, A10, A11, A12, A13, A14 y A15. En el caso de Leonardo y Micro, los puertos disponibles son 8,9,10,11, 14, 15 y 16. En Arduino 101, el puerto 13 no funcionará como RX, y máximo 57600bps.

No obstante, es una buena alternativa a la hora de dejar libres los puertos UART que utiliza la conexión USB para la computadora, sobretodo en el caso de Arduino UNO y en NodeMCU.

¿Qué protocolo elegir?

¿Qué protocolo elegir para una interconexión como ésta? La respuesta más obvia sería SPI o incluso i2C, ya que son los más rápidos; pero hay muchas cuestiones a tener en cuenta durante la fase de diseño: ¿qué ancho de banda necesitamos? ¿qué pines tenemos disponibles? ¿encaja la arquitectura maestro-esclavo con nuestra aplicación?

Hemos visto que UART se diferencia de SPI y I2C sobretodo en que es asíncrono y en que no requiere una jerarquía de interconexión master-slave. Sin embargo, la capacidad está muy limitada y la falta de sincronización puede introducir problemas en determinados escenarios. Por su parte, I2C es más lento que SPI, pero también es bastante más fácil de implementar y requiere menos pines.

He encontrado una tabla que pretende ilustrar las diferencias:

Para terminar…

Soy consciente de que la complejidad de estos protocolos no puede ser abarcada en un sólo artículo y que me dejo muchas cuestiones abiertas. En este artículo se ha pretendido ofrecer una visión general de las posibilidades de interconexión más estándares. Mi objetivo es tratar en próximos artículos implementaciones reales utilizando estos protocolos de comunicación, pero si mientras tanto necesitas un ejemplo escríbeme y trataré de ayudarte. También estamos abiertos a tratar cualquier caso particular que nos propongáis.


Más referencias:

En Borrowbits compartimos nuestros conocimientos de forma altruista. Si este artículo te ayudó, <a href=»https://www.buymeacoffee.com/borrowbits» target=»_blank» rel=»noopener noreferrer»>invítame a un café</a>. Con cada donación <strong>plantaremos un árbol en tu nombre</strong> en el <a href=»https://edenprojects.org/madagascar/» target=»_blank» rel=»noopener noreferrer»>Proyecto Edén</a> (Madagascar):

<script type=»text/javascript» src=»https://cdnjs.buymeacoffee.com/1.0.0/button.prod.min.js» data-name=»bmc-button» data-slug=»borrowbits» data-color=»#FFDD00″ data-emoji=»» data-font=»Cookie» data-text=»Invítame a un café» data-outline-color=»#000″ data-font-color=»#000″ data-coffee-color=»#fff» ></script>

¡Un saludo!

Angel H.

Tecnófilo irreparable y lector insaciable. Emigrante e inmigrante. Además de eso, Ingeniero de Telecomunicaciones y Product Manager. +10 años de experiencia en proyectos de Software, Cloud e Ingeniería de Redes. Me apasiona el DIY, la tecnología Blockchain y las Finanzas.

9 comentarios

  • Buenas Tardes.
    Ángel excelente post y muy buena página, la información es concisa y muy fácil de entender, en estos momentos estoy realizando mi proyecto con un Arduino Mega y una Nodemcu; el Arduino guarda información de sensores de Temperatura, Humedad y Movimiento, necesito pasarlas a la node para enviarlas via Internet a cualquier aplicación y verlas en tiempo real, viendo los diferentes tipo de protocolo pienso que me sirve mas el SPI ( Si estoy mal, soy todo ojos para leer su valiosa información y consejos) por ende necesito un ejemplo acerca de esto para tener mas conocimiento al respecto.

    Un saludo, Rodolfo.

    • Hola Rodolfo, he subido para ti un ejemplo de NodeMCU y Arduino Mega con SPI a mi cuenta de GitHub: https://github.com/hita/nodemcu-arduino-spi-example

      En el ejemplo verás que Arduino ejecuta una rutina de interrupción (ISR) a la espera de una orden del ESP8266 para empezar a enviar una cadena de texto. Es decir, NodeMCU actúa de máster (diciéndole a Arduino cuándo debe empezar a enviar datos de los sensores o ejecutar una orden como encender un LED). Si lo ves necesario para tu proyecto, puedes invertir esta configuración para que sea Arduino quien parta el bacalao 😉

  • Hola amigo, muy buena información, gracias por compartirla. Estoy realizando un proyecto con el NodeMCU y Arduino UNO. Consiste en receptar informacion de 4 sensores mediante Arduino Uno, y luego enviar esa información al NodeMCU mediante comunicacion UART. Y toda esa informacion se compartirá en la base datos firebase. Todos lo valores llegan perfectamente a la base de datos cuando Arduino UNO y el NodeMCU estan conectados a mi PC, pero cuando lo alimento externamente por los pines Vin y GND. Los valores se alteran. Por sicaso tienes idea de por que sucede esto. De antemano gracias bro.

  • Hola Ángel.

    Excelente información.

    Actualmente estoy trabajando con un sensor de CO2 que se comunica con un arduino uno por el protocolo UART. La lecturas las deseo enviar a la placa NodeMCU, pero cuando habilito una segundo objeto para otra comunicación serial, el arduino no manda la información y a parte deja de recibir los datos del sensor.

    ¿Sabes que es lo que ocasiona este problema?

    Saludos

    • Hola Carlos,
      ¿es posible que tengas el MCU conectado al puerto USB en modo Serie? Si no recuerdo mal, un par de pines UART se utilizan internamente para la interfaz Serie USB y no se pueden usar simultáneamente para transmisión UART externa.
      Saludos!

  • Hola amigo, buenas tardes.
    Quisiera preguntar, estoy en un proyecto de residencia profesional y queremos que arduino nos mande datos a firebase, la solucion que encontramos es usar nodemCU pero al momento de hacer las conexiones se nos dificulta queremos conectar una lcd 16×2, sensor de nivel de agua (boya) y sensor ultrasonico, la conexión con arduino UNO ya está y genera los datos en el programa, pero no sabemos como hacerle, agradecería tu pronta respues

  • Hola.

    Yo quiero conectar un teclado inalámbrico que viene con receptor usb al nodmecu826. ¿Como hago para conectar el receptor usb al nodmecu826?

    Gracias.

  • Hola.

    Yo quiero conectar un teclado inalámbrico que viene con receptor usb al nodmecu826. ¿Como hago para conectar el receptor usb al nodmecu826?

    Gracias.

Angel H.

Tecnófilo irreparable y lector insaciable. Emigrante e inmigrante. Además de eso, Ingeniero de Telecomunicaciones y Product Manager. +10 años de experiencia en proyectos de Software, Cloud e Ingeniería de Redes. Me apasiona el DIY, la tecnología Blockchain y las Finanzas.

Suscríbete

¡Sácale el máximo partido a BorrowBits!

Apúntate para seguir recibir por email las nuevas publicaciones, noticias sobre Blockchain pre-filtradas y material exclusivo para suscriptores. De momento es gratis:

{subscription_form_1}

Categorías

Bits del pasado

Sitio patrocinado por:

JitKey rentabilización apartamentos turísticos

JITKey.- Startup enfocada en la gestión de alojamientos turísticos.