NodeMCU y Arduino: ¿Cómo interconectarlos? UART, i2C y SPI

NodeMCU y Arduino: ¿Cómo interconectarlos? 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 :) Escríbenos si necesitas algún 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:

¿Te gustaría que escribamos más sobre Arduino y NodeMCU? Escríbenos.

Previous Aprende a programar un NodeMCU (ESP8266) con Arduino IDE
Next ¿Qué es un Pseudowire? Una intro a PWE3 y CES

About author

Angel
Angel 171 posts

Siempre quise ser inventor y escritor: por lo primero me hice ingeniero, y en cuanto a lo segundo, escribo aquí de vez en cuando sobre telecomunicaciones y tecnología. Me gustan los robots, los perretes y los libros (analógicos).

You might also like

Tecnologia & Ciencia 0 Comentarios

Consejos para elegir tu disco duro externo

Un disco duro externo es prácticamente una moneda corriente hoy en día, pues todos estamos al corriente de que un problema con nuestro ordenador nos hace perder todos nuestros datos,

Tecnologia & Ciencia 3 Comentarios

La tecnología de juego, llevada a un nuevo nivel

Los videojuegos han recorrido ya un largo camino desde su aparición en las décadas de los setenta y los ochenta. Desde los precursores, que podían jugarse únicamente en las máquinas

Tecnologia & Ciencia 4 Comentarios

Tres extensiones para Gmail que harán que mejores tu productividad

Gmail es el servicio de correo eléctronico cuyo uso está más extendido simplemente porque es sencillo y muy potente. Usar de manera eficiente Gmail te ahorrará mucho tiempo a lo

0 Comentarios

Ningún comentario... todavía ;)

Tú puedes ser el primero en comentar este artículo!

Deja un comentario