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. Y por supuesto, os invitamos a colaborar escribiendo y compartiendo conocimientos sobre cuestiones prácticas.

¡Seguimos charlando en los comentarios!


Más referencias:

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

No sé si me hice ingeniero porque soy un escritor frustrado o soy un escritor frustrado porque me hice ingeniero. En cualquier caso ahora escribo en un blog sobre ingeniería (de vez en cuando).

You might also like

Tecnologia & Ciencia 0 Comments

Big Data en acción, localización a tiempo real

A lo largo de los años me he visto envuelto en proyectos para los que he tenido que desarrollar algún que otro estudio de mercado. Para ciertos aspectos del estudio,

Tecnologia & Ciencia 4 Comments

Tecnología de corto alcance

Pensamos y tenemos interiorizado, que las comunicaciones están para acortar las distancias. Para poder hablar de una punta a otra del planeta. Para reducir el espacio físico, y sentirnos cerca

Tecnologia & Ciencia 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 0 Comments

Disrupción en el taxi y vehículos autonónomos. Presente y futuro de Uber

Si echamos la vista atrás unos cuantos años nadie había oído hablar de Uber. Es normal, es una empresa enorme a día de hoy pero cuya vida es sólo de

Tecnologia & Ciencia 3 Comments

¿Por qué VoLTE revolucionará el mundo de la telefonía móvil?

Desde hace tiempo, se ha venido implantando el estándar de alta velocidad LTE (también conocido como 4G) y las principales compañías de telefonía móvil están invirtiendo una gran cantidad de

Amazon 0 Comments

¿Cómo conseguir e-Books gratis?

¿Eres de aquellos a los que le gusta leer estén donde estén y vayan donde vayan? ¿Que aprovechas tu viaje en metro o en bus, tu rato de ocio en

Tecnologia & Ciencia 0 Comments

Aprender las Leyes de Maxwell con una sola mano

Hay un momento angustioso que todo estudiante de física o ingeniería debe afrontar: el aprendizaje (y comprensión) de las ecuaciones de Maxwell. Ninguna excusa es válida para escaquearse, es por

Internet 3 Comments

[Administra tu Servidor] ¿Cómo hacer copias periódicas en Linux? Utiliza la shell.

Tanto si eres el administrador de un servidor con Linux o simplemente tienes instalada una de sus distribuciones en tu portátil personal, seguro que te ves en la necesidad de

Tecnologia & Ciencia 4 Comments

¿Merece la pena pre-colegiarse en el COIT?

Desde hace un tiempo, el Colegio Oficial de Ingenieros de Telecomunicación (COIT) permite a los estudiantes de último curso pre-colegiarse en el mismo durante un máximo de 2 años, es

0 Comments

No Comments Yet!

You can be first to comment this post!

Leave a Reply