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 :)

En el segundo artículo de esta serie se describirá este protocolo con más detalle y se ofrecerá un ejemplo de implementación con Arduino/NodeMCU (¿te avisamos?).

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)

Hablaremos de este bus y de la conexión NodeMCU/Arduino en el artículo número tres de la serie (¿te avisamos?).

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. También estamos abiertos a tratar cualquier caso particular que nos propongáis.

¡Seguimos charlando en los comentarios!


Más referencias:

¿Te gustaría que escribamos más sobre Arduino y NodeMCU? Tu opinión es importante, háznoslo saber en los comentarios.

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 169 posts

Siempre quise ser inventor y escritor. Pero mientras tanto trabajo en Alemania como Ingeniero de Telecomunicaciones, y de vez en cuando escribo aquí sobre Ciencia y Tecnología. Me gustan los robots y los libros (analógicos).

You might also like

Tecnologia & Ciencia 2 Comments

Emprender desde cero con un perfil técnico, entrevista a Alberto López de Idintel

Hoy tenemos en BBits una entrevista. El elegido ha sido Alberto López, un ingeniero de Telecomunicación que, al contrario que la mayoría de los egresados, decidió apostar por su propia

Tecnologia & Ciencia 0 Comments

¿Y si pudieras pagar en el supermercado utilizando tu smartphone?

Imagínense que fuera posible pagar la compra de la semana sólo con acercar el móvil al datáfono del supermercado. Bueno, pues en esta coyuntura tecnológica ya se puede. ¿Sorprendido? Seguro

HerramientasPFC 0 Comments

Nueva serie: Herramientas imprescindibles para un proyecto de TIC

La semana pasada empecé por fin a trabajar en mi PFC y he pasado varios días instalando aplicaciones y librerías. Un trabajo nada despreciable y que requiere una buena inversión

Tecnologia & Ciencia 2 Comments

Wizzo, una aplicación innovadora para agilizar los pagos sociales

Aunque aún se encuentra en fase beta y únicamente cuenta con versión para navegador, ya podemos ver el potencial de una aplicación que cambiará la forma de pagar diariamente ya

Tecnologia & Ciencia 7 Comments

Radioenlaces: ¿En qué consiste la técnica XPIC?

Hay muchos ingenieros de Telecomunicación que aún no saben en qué consiste la técnica XPIC (Cross Polarization Interference Cancellation). ¡Pero no pasa nada! Para eso estamos nosotros aquí. En términos profanos

Tecnologia & Ciencia 0 Comments

Grafeno, el material que revolucionará el futuro

Quédate con este nombre porque lo verás hasta en la sopa. ¿No sabes lo que es? Tranquilo, hasta hace poco no gozaba de gran popularidad, pero desde que el Premio Nobel

Tecnologia & Ciencia 1Comments

Diseñan transistores “comprimibles” para reducir el consumo de energía

¿Alguna vez te has preguntado por qué la batería de un smartphone dura tan poco? ¿Cómo es posible que con la que está cayendo aún no hayamos logrado una solución?

E-conomía 19 Comments

Confesiones de un estudiante de ingeniería desengañado (y cabreado)

Nos prometieron El Dorado. Nos convencieron de que nuestro trabajo como Señores Ingenieros (a.k.a Masters del Universo), consistiría en arrugar nuestros elegantes culos tras una lujosa mesa de caoba. Que sólo

Noticias 9 Comments

DreamSpark: Software de Microsoft gratuito para estudiantes.

Estudiar tiene muchos beneficios, desde aumentar nuestros conocimientos hasta conseguir un premio académico. Pero el hecho de tener software de primera gama, como Windows 8 ©, totalmente gratuito suena bastante

0 Comments

No Comments Yet!

You can be first to comment this post!

Leave a Reply