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

<p>Creció viendo McGyver y ya de niño tenía muy claro en qué quería convertirse: inventor. Supuso que estudiar Ingeniería de Telecomunicación sería un buen camino para ello. Emprendedor y aventurero, bajo los circuitos y transistores le late un corazón de escritor.</p>

You might also like

Tutorial 1Comments

How to: Convertir varias imágenes a PDF.

Cuando escaneamos un libro o unos apuntes es muy poco práctico tener los archivos sueltos. Es por ello que os voy a mostrar dos sencillas manera de conseguir transformar varios

Tecnologia & Ciencia 1Comments

Las bases del encaminamiento MANET: en caso de emergencia avisar a BATMAN

Imaginaos que un tsunami o un huracán se lleva por medio todas las antenas y estaciones base del operador móvil (Movistar, Vodafone, Orange…) dejando toda tu ciudad incomunicada, sumida en

Generales 1Comments

¿Se queda Tumblr con tus derechos de autor?

Hace meses que utilizo Tumblr como herramienta de microblogging para publicar algunos textos – ejercicios literarios, poemas y reflexiones personales sin importancia –  y el otro día me asaltó una duda:

Desarrollo 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

Tecnologia & Ciencia 5 Comments

¿Cuál es la mejor distribución Linux para diseño gráfico y multimedia?

La respuesta es ArchLinux. Ea, ya lo he dicho. Pero antes de que os vayáis corriendo como pollos sin cabeza, oíd un viejo refrán: “Aunque la mona se vista de

Juegos 1Comments

[EN] Space Invaders based on Star Wars

This is probably the most awesome combo for any classic nerd. The original Space Invaders was released in 1978 inspired on The War of the Worlds, and on the first

Tecnologia & Ciencia 1Comments

La polémica del BYOD continúa: ¿pesadilla o evolución?

Ya es demasiado tarde, amigos. La revolución del BYOD hace años que comenzó a gestarse y a las empresas de hoy sólo les queda dos opciones: o bien adaptarse y

Tecnologia & Ciencia 1Comments

¿Los empleados roban datos? El problema de las Fugas de Información

Uno de los activos más importantes de una organización es la información. Pero, ¿estamos realmente concienciados con el problema de fugas y hurtos? Parece ser que no. En este primer

Tecnologia & Ciencia 6 Comments

Seguridad en la nube gracias a la física cuántica

Un equipo de científicos del Vienna Center for Quantum Science and Technology (VCQ) y del Institute for Quantum Optics and Quantum Information (IQOQI), han logrado combinar con éxito la potencia

0 Comments

No Comments Yet!

You can be first to comment this post!

Leave a Reply