← Índice del curso

Comunicación entre Dispositivos · Tema 39 · Comunicación inalámbrica

Otras tecnologías inalámbricas

Wi-Fi y Bluetooth resuelven muchos problemas, pero no todos. Hay sensores a cinco kilómetros de distancia, hay tarjetas que se acercan a un lector sin pila, hay controles remotos que funcionan con un rayo de luz invisible y hay redes de cien nodos que se reparan solas. Cada tecnología inalámbrica es un punto de equilibrio entre alcance, velocidad y consumo, y no existe una que gane en las tres: lo que se gana en una se paga en las otras (el mismo compromiso entre sensibilidad y velocidad que se vio en el tema 34). En este tema se recorren las que completan el panorama: el módulo nRF24L01+, LoRa, Zigbee, ESP-NOW, RFID y NFC e infrarrojo. De cada una se estudia cómo es el paquete, qué limita su alcance y cuánto cuesta en energía, y se escriben programas para ESP32 y Arduino. El objetivo es práctico: poder elegir con criterio y no por costumbre.

01 · Objetivo

Qué comparar

Antes de mirar cada tecnología conviene fijar con qué se las compara. Hay cinco ejes, y los tres primeros se contradicen entre sí:

  • Alcance. Depende de la frecuencia (las bajas atraviesan mejor los obstáculos y se propagan más lejos), de la potencia de salida, de la sensibilidad del receptor y de la antena. La sensibilidad empeora al subir la velocidad: para recibir más bits por segundo hace falta más señal.
  • Velocidad. Desde los 300 bit/s de LoRa a máximo alcance hasta los megabits de Wi-Fi. Importa la velocidad útil (con cabeceras, confirmaciones y esperas), no la que anuncia el fabricante.
  • Consumo. Lo que cuenta es la energía por mensaje y el tiempo despierto, no solo la corriente de transmisión (tema 34). Un radio de 10 mA que está activo 10 ms gasta mucho menos que uno de 35 mA activo 185 ms.
  • Topología. Punto a punto, estrella (todos hablan con una puerta de enlace) o malla (los nodos se retransmiten entre sí).
  • Costo y ecosistema. Un módulo nRF24L01+ cuesta un par de dólares y exige armar todo el protocolo; un módulo Zigbee o LoRaWAN cuesta más, pero trae red, direccionamiento y seguridad hechos. También cuenta si hay teléfonos, puertas de enlace o servicios públicos que la entiendan.
Las tecnologías de este tema, en órdenes de magnitud.
TecnologíaBandaAlcance típicoVelocidad en el aireTopologíaPara qué
nRF24L01+2,4 GHz10 a 100 m250 kbit/s, 1 y 2 Mbit/sEstrella de hasta 6 emisores por receptorControles remotos, sensores baratos, juguetes
LoRa433, 868 o 915 MHz2 a 15 km (hasta cientos de km con visión directa)0,3 a 50 kbit/sEstrella (LoRaWAN) o punto a puntoSensores remotos con pila, agricultura, medidores
Zigbee2,4 GHz (y 868/915 MHz)10 a 100 m por salto250 kbit/sMallaDomótica, iluminación, redes de muchos nodos
ESP-NOW2,4 GHz100 a 200 m al aire libre1 Mbit/s (hasta 250 kbit/s en largo alcance)Pares o difusiónComunicar placas ESP32 y ESP8266 sin router
RFID y NFC125 kHz y 13,56 MHzContacto a 10 cmUnos 100 kbit/s (HF)Lector y tarjetaIdentificación, accesos, pagos, etiquetas
InfrarrojoLuz de 940 nm, portadora de 38 kHz5 a 10 m, con visión directaUnos 2 kbit/sUno a uno, direccionalControles remotos de electrodomésticos

02 · Radio barata

El módulo nRF24L01+

Paquete y confirmación del nRF24L01+ El paquete Enhanced ShockBurst consta de un preámbulo de un byte, una dirección de 3 a 5 bytes, un campo de control de 9 bits, de 0 a 32 bytes de datos y un CRC de 1 o 2 bytes. Debajo, la secuencia temporal: el emisor transmite el paquete, ambos radios esperan 130 microsegundos para pasar de transmisión a recepción, el receptor responde con un paquete vacío de confirmación, y 130 microsegundos después el emisor puede transmitir el siguiente. PreámbuloDirecciónControlDatosCRC 1 byte3 a 5 bytes9 bits0 a 32 bytes1 o 2 bytes Enhanced ShockBurst: el chip arma y verifica el paquete solo; el programa entrega los datos. El emisor transmite el paqueteACK 130 µs130 µsel receptor confirmahasta 32 bytes de datos Si el ACK no llega, el emisor reintenta tras la espera programada (ARD), hasta 15 veces.

El nRF24L01+ de Nordic es un transceptor de 2,4 GHz, económico y muy extendido en proyectos de aficionados. Se conecta por SPI (SCK, MOSI, MISO, CSN), más un pin de habilitación (CE) y uno de interrupción (IRQ), y se alimenta con 1,9 a 3,6 V (las entradas toleran 5 V, pero la alimentación no). Admite 126 canales de 1 MHz (el canal n está en 2400 + n MHz), tres velocidades (250 kbit/s, 1 y 2 Mbit/s), potencia de −18 a 0 dBm y hasta 6 canales lógicos de recepción (pipes), con una dirección de 3 a 5 bytes cada uno: un receptor puede escuchar a seis emisores distintos.

Lo importante es que implementa en hardware el protocolo Enhanced ShockBurst: arma el paquete (preámbulo, dirección, 9 bits de control con la longitud, un número de secuencia de 2 bits y un indicador de «sin confirmación», los datos y un CRC), lo transmite, espera la confirmación y reintenta sin intervención del programa. Es lo que se vio en el tema 45 (ACK, tiempo de espera y reintentos) resuelto dentro del chip. El receptor valida el CRC y la dirección, y si todo coincide, responde con un paquete de confirmación vacío (o con datos, si se configuró la carga útil en la confirmación).

Cuánto tarda de verdad

Con 2 Mbit/s y 32 bytes de datos, el paquete mide 329 bits y ocupa 164,5 µs. Pero la velocidad útil no es 2 Mbit/s: tras transmitir hay que pasar a recepción (130 µs), recibir la confirmación (36,5 µs) y volver (130 µs). El ciclo completo es de 461 µs para 256 bits de datos: unos 555 kbit/s útiles, la cuarta parte de la cifra del aire. A 250 kbit/s, el mismo paquete dura 1316 µs y el ciclo, 1868 µs: 137 kbit/s. La herramienta 1 del laboratorio calcula todo esto, incluida la espera entre reintentos (ARD, de 250 a 4000 µs en pasos de 250): debe ser mayor que lo que tarda la confirmación, y por eso a 250 kbit/s el mínimo sube a 500 µs.

nRF24L01+: qué ofrece y qué hay que cuidar.
AspectoDatoConsejo
ConsumoUnos 11 mA transmitiendo a 0 dBm y 13 mA recibiendo; 26 µA en espera y menos de 1 µA apagadoEl radio se enciende solo para enviar: un microcontrolador pequeño dormido casi siempre da años con una pila
Canal126 canales; con 2 Mbit/s se ocupan 2 MHzElegir canales altos para esquivar el Wi-Fi (el 76 es el valor por omisión; el máximo legal depende del país, hasta el 83 donde se limita a 2483,5 MHz) y separarlos de a 2 si se usa 2 Mbit/s
AlimentaciónPicos de unos 12 mA, muy sensible al ruido de la fuenteUn condensador de 10 µF cerca del módulo: es la causa número uno de módulos «que no andan»; no alimentarlo con 5 V
Versiones con amplificador (PA+LNA)Alcance anunciado de hasta 1 km al aire libre con antena externaConsumen más y exigen mejor fuente; el alcance real es una fracción del anunciado
ClonesAbundan los chips compatibles (Si24R1, BK2425)Casi todos funcionan, pero algunos no admiten 250 kbit/s

Lo que el nRF24L01+ no trae es una red: no hay descubrimiento, ni direccionamiento más allá de las direcciones de canal, ni cifrado, ni malla. Esa parte la pone el programa (temas 41 y 42). Con las bibliotecas RF24 (la principal) y RF24Network y RF24Mesh (que agregan árbol y malla) se llega mucho más lejos de lo que se esperaría de un chip de dos dólares. Es una excelente tecnología para muchos emisores simples y un solo receptor cerca, y mala para cualquier cosa que deba convivir con redes ajenas, porque comparte la banda con el Wi-Fi sin ninguna coordinación.

03 · Largo alcance

LoRa

Símbolos LoRa como barridos de frecuencia Gráfico de frecuencia contra tiempo con tres símbolos consecutivos. Cada uno es un barrido de frecuencia que recorre todo el ancho de banda de abajo hacia arriba. El primero empieza en la frecuencia más baja. El segundo empieza a un cuarto del ancho de banda, llega al tope, vuelve abajo y termina el barrido. El tercero empieza al sesenta por ciento. El valor del símbolo es dónde empieza el barrido. frecuencia (ancho de banda B) tiempo empieza abajocada símbolo dura 2^SF / B segundos símbolo 0desfase de 1/4desfase de 0,6

LoRa (Long Range) es una modulación de la empresa Semtech que opera en las bandas libres de menos de 1 GHz: 433 MHz, 868 MHz en Europa y 915 MHz en América y Oceanía (el uso concreto depende del país). Las frecuencias bajas se propagan mejor y rodean mejor los obstáculos que las de 2,4 GHz, pero el secreto está en la modulación: espectro ensanchado por barrido (chirp spread spectrum). Cada símbolo es un barrido de frecuencia que recorre todo el ancho de banda, y el dato está en el punto donde empieza. El receptor correlaciona la señal con el barrido conocido, lo que le permite recibir señales por debajo del ruido: hasta 20 dB por debajo en el factor más alto.

Dos parámetros definen el compromiso entre velocidad y alcance:

  • Factor de ensanchamiento (Spreading Factor, SF, de 7 a 12): cada símbolo lleva SF bits y dura 2SF/B segundos. Subir un paso duplica el tiempo en el aire y gana unos 2,5 dB de sensibilidad.
  • Ancho de banda (B: 125, 250 o 500 kHz): duplicarlo reduce el tiempo a la mitad, a cambio de unos 3 dB de sensibilidad y de más ruido admitido.
  • Tasa de codificación (4/5 a 4/8): bits de corrección de errores añadidos, que se pagan con tiempo.
LoRa con 125 kHz, codificación 4/5 y 20 bytes de datos (herramienta 2).
SFVelocidadTiempo en el aireSensibilidadEspera con el 1 % de ciclo
75469 bit/s56,6 ms−124,5 dBm5,7 s
91758 bit/s185,3 ms−129,5 dBm18,5 s
12293 bit/s1,32 s−137 dBm132 s

La sensibilidad se calcula como −174 dBm/Hz + 10·log10(B) + figura de ruido (unos 6 dB) + relación señal a ruido mínima del factor (de −7,5 dB en SF7 a −20 dB en SF12). Con una potencia de 14 dBm y una sensibilidad de −137 dBm, el presupuesto de enlace es de 151 dB (el tema 34): suficiente para varios kilómetros en entornos urbanos y más de diez en campo abierto.

El ciclo de trabajo y el costo del tiempo en el aire

Las bandas libres de menos de 1 GHz tienen una regla que Wi-Fi no tiene: en Europa, en 868 MHz, la mayoría de los canales limita el ciclo de trabajo al 1 % (algunos, al 0,1 % o al 10 %): un transmisor solo puede estar en el aire el 1 % del tiempo, o sea 36 s por hora. Un mensaje de 20 bytes en SF12 dura 1,3 s: tras enviarlo hay que esperar 132 s. En América (915 MHz) la norma es distinta: no hay ciclo de trabajo, pero sí un tiempo máximo de permanencia en el canal y salto de frecuencias. En los dos casos, y aunque no existiera ninguna regla, el tiempo en el aire manda: se usa el SF más bajo con el que el enlace aún funciona, y los mensajes se mantienen cortos. Los 255 bytes de datos máximos de LoRa son casi siempre excesivos; un mensaje típico tiene entre 4 y 20 bytes con enteros y formato binario (tema 46).

LoRa y LoRaWAN

Hay que distinguir las dos cosas. LoRa es solo la capa física: dos módulos con un chip SX1276, SX1262 o equivalente pueden intercambiar paquetes sin más, y se programan con bibliotecas como RadioLib o LoRa. LoRaWAN es un protocolo de red por encima (de la LoRa Alliance): los dispositivos finales envían a cualquier puerta de enlace en alcance, que los reenvía por Internet a un servidor de red (por ejemplo, The Things Network), con direccionamiento, adaptación de velocidad, cifrado AES-128 de extremo a extremo y comprobación de contadores contra la repetición (tema 49). A cambio, los dispositivos de clase A (los de menor consumo) solo pueden recibir justo después de transmitir, de modo que la comunicación hacia el sensor es lenta y limitada. Para cientos de sensores con pila en un campo, una ciudad o una red de medidores, LoRaWAN es la herramienta; para dos placas propias a 3 km, LoRa a secas alcanza.

Se carga un módulo SX127x con 3,3 V (SPI más los pines de reinicio y de interrupción), una antena adecuada a la frecuencia (un cable de 1/4 de onda, 8,2 cm en 868 MHz) y nunca se transmite sin antena: la potencia reflejada puede dañar el amplificador. Se consume más de lo que la tabla anterior sugiere para la transmisión (unos 120 mA a 20 dBm, 30 a 40 mA a 14 dBm, 10 a 12 mA recibiendo) y casi nada dormido (de 0,2 a 1 µA).

04 · Redes de malla

Zigbee e IEEE 802.15.4

Canales de Zigbee y de Wi-Fi en 2,4 GHz Arriba, los canales 1, 6 y 11 de Wi-Fi, cada uno de 22 megahercios de ancho, centrados en 2412, 2437 y 2462 megahercios. Abajo, los 16 canales de Zigbee, numerados del 11 al 26, de 2 megahercios de ancho y separados 5 megahercios, desde 2405 hasta 2480. Los canales 15, 20, 25 y 26 caen en los huecos entre los canales de Wi-Fi y están resaltados; los demás se superponen con alguno de los tres canales de Wi-Fi. Wi-Fi 1Wi-Fi 6Wi-Fi 11 11121314151617181920212223242526 24002420244024602480 MHzZigbee Los canales 15, 20, 25 y 26 (naranja) caen entre los canales 1, 6 y 11 de Wi-Fi.

Zigbee es una red de malla de bajo consumo construida sobre el estándar IEEE 802.15.4, que define la radio y el acceso al medio de las redes personales de baja velocidad. En 2,4 GHz usa 16 canales de 2 MHz, numerados del 11 al 26 y separados de a 5 MHz (el canal n está en 2405 + 5·(n − 11) MHz), con modulación O-QPSK a 250 kbit/s y tramas de hasta 127 bytes. También existe en 868 y 915 MHz, con canales de 20 y 40 kbit/s. Como la radio es de corto alcance, de baja potencia y se usa poco tiempo, es ideal para sensores con pila.

Su rasgo distintivo es la malla. Una red Zigbee tiene tres tipos de nodo:

  • Coordinador: uno por red. Forma la red, elige el canal y el identificador (PAN ID), y reparte las claves de seguridad.
  • Enrutador: siempre encendido (alimentado por red eléctrica, como una lámpara o un enchufe), retransmite los mensajes de otros y extiende el alcance.
  • Dispositivo final: un sensor o un interruptor que casi siempre duerme y se comunica a través de un padre (coordinador o enrutador). Es el que dura años con pilas.

Si un enrutador se apaga, los mensajes buscan otro camino: la red se repara sola. A cambio, la complejidad es alta: un módulo suele programarse con un SDK del fabricante (Silicon Labs, Texas Instruments, Espressif con sus ESP32-H2 y ESP32-C6), y la interoperabilidad se logra con perfiles estandarizados (Zigbee 3.0) para luces, interruptores, sensores y cerraduras. El camino más corto para un aficionado es un módulo XBee (de Digi), que oculta la malla detrás de una UART: en modo transparente funciona como un cable serie inalámbrico, y en modo API los datos van en tramas con el delimitador 0x7E, dos bytes de largo, el contenido y una suma de verificación (0xFF menos la suma de los bytes del contenido): el mismo diseño de protocolo del tema 41, con la dirección del destino dentro del contenido.

Dos advertencias. Primero, Zigbee comparte banda con el Wi-Fi y con una potencia diez a cien veces menor, de modo que un canal de Zigbee que se solape con una red Wi-Fi cercana pierde casi todo. La herramienta 3 muestra qué canales esquivan los de Wi-Fi 1, 6 y 11. Segundo, Thread (la red de malla de Matter) usa la misma radio 802.15.4, pero con otra pila de protocolos, basada en IPv6: cada nodo tiene una dirección IP. Zigbee y Thread comparten el chip, no el lenguaje.

05 · Sin router

ESP-NOW

ESP-NOW es un protocolo de Espressif para que los ESP32 y los ESP8266 se comuniquen entre sí sin punto de acceso, sin conexión y sin asociación. Usa la radio de Wi-Fi (la misma de 2,4 GHz) pero, en lugar de la pila completa de IP y TCP del tema 35, envía una trama de acción de 802.11 directamente a la dirección MAC del destino. Por eso es muy rápido: no hay que escanear, asociarse, pedir una dirección IP ni abrir un socket.

ESP-NOW en resumen.
AspectoDato
Carga útilHasta 250 bytes por mensaje (hasta 1470 en las versiones recientes de la biblioteca)
DireccionamientoPor dirección MAC de 6 bytes; también difusión a FF:FF:FF:FF:FF:FF. Hasta 20 pares registrados
ConfirmaciónEn los envíos a un par registrado, la capa MAC confirma la recepción y el emisor puede saberlo con una función de retorno; la difusión no se confirma
SeguridadCifrado opcional AES-128 (CCMP) con una clave por par; solo un número limitado de pares cifrados. La difusión no se cifra
AlcanceUnos 100 a 200 m al aire libre con la velocidad por omisión; el modo de largo alcance (250 y 500 kbit/s) llega a cerca de 1 km con visión directa
CanalTodos los dispositivos deben estar en el mismo canal de Wi-Fi
Convivencia con el Wi-FiSe puede usar al mismo tiempo que una conexión a un punto de acceso, pero el canal lo impone el punto de acceso

La consecuencia práctica más importante es la última: si el ESP32 está conectado a un router, ESP-NOW usa el canal del router, y si el router cambia de canal, el enlace con el otro extremo se rompe. Una forma robusta de usarlo es no conectarse a ningún router: emisor y receptor fijan el mismo canal (por ejemplo, el 1 o el 6) y eso es todo. Otra es que el receptor esté conectado al Wi-Fi y reenvíe lo que recibe a Internet, y que los emisores se adapten a su canal.

Como no hay conexión, el emisor no sabe si alguien escucha más que por la confirmación de la capa MAC, y la fiabilidad la definen los temas 44 y 45: un número de secuencia para detectar pérdidas, un CRC (ya lo trae la capa MAC, pero sirve para la lógica propia) y reintentos si hacen falta. En el consumo, el truco es que un ESP32 despierta, envía y vuelve a dormir en pocas decenas de milisegundos si el canal es fijo, mucho menos que los 0,5 a 3 s de reconectar al Wi-Fi (tema 36). Aun así, un ESP32 despierto gasta mucho más que un microcontrolador pequeño con un nRF24L01+ o un SoC de BLE: la herramienta 6 lo cuantifica con supuestos prudentes de 0,2 s activo.

ESP-NOW encaja cuando todas las placas son de Espressif, la distancia no supera unas decenas o cientos de metros y se quiere latencia mínima: un control remoto entre dos placas, una red de sensores que reporta a un nodo central, un timbre inalámbrico. No sirve para hablar con un teléfono (sin soporte) ni con placas de otras marcas.

06 · Sin pila

RFID y NFC

En RFID (identificación por radiofrecuencia) un lector genera un campo electromagnético y una etiqueta o tarjeta, que no tiene pila, toma energía de ese campo por acoplamiento inductivo para responder. Como la energía llega por el campo, el alcance es muy corto y cae rápidamente con la distancia (con una antena de bobina, la intensidad del campo disminuye con la inversa del cubo de la distancia). Por eso las etiquetas son baratas y no se gastan. Hay tres familias:

Familias de RFID.
FamiliaFrecuenciaAlcanceEstándares y ejemplosQué hace
Baja frecuencia (LF)125 kHzHasta 5 a 10 cmEM4100, HID Prox; módulo RDM6300 o EM-18La tarjeta emite un número fijo; solo lectura
Alta frecuencia (HF)13,56 MHzHasta 10 cm (ISO 15693, hasta 1 m)ISO 14443, MIFARE, NTAG; módulos MFRC522 y PN532Memoria que se lee y se escribe, con protocolo de comandos y, en algunas, cifrado
Ultra alta frecuencia (UHF)860 a 960 MHzDe 1 a 10 mEPC Gen 2Inventario de muchas etiquetas a la vez (logística)

NFC (Near Field Communication) es un subconjunto de la familia de 13,56 MHz, a menos de 10 cm, con un formato de datos común (NDEF: mensajes con registros de tipo, como un enlace o un texto) y tres modos: lector y escritor (el teléfono lee una etiqueta), emulación de tarjeta (el teléfono se comporta como una tarjeta de pago o de acceso) y punto a punto (entre dos teléfonos). Es la forma de «tocar para configurar»: una etiqueta NTAG213 de 50 centavos con una URL abre una página en cualquier teléfono, y un módulo PN532 permite que un microcontrolador lea y escriba.

El lector de 125 kHz

El módulo RDM6300 lee tarjetas EM4100 y entrega el resultado por una UART a 9600 baudios, en cuanto detecta una tarjeta y mientras esté presente. Cada lectura es una trama de 14 bytes: 0x02 (inicio), 10 caracteres ASCII hexadecimales (5 bytes: la versión o código de cliente y el ID de 32 bits de la tarjeta), 2 caracteres ASCII con la suma de verificación (el XOR de los 5 bytes) y 0x03 (fin). Un receptor serie sigue el patrón del tema 41: espera el inicio, acumula caracteres, al llegar el fin valida el largo y la suma y recién entonces usa el ID. Una trama cortada o con ruido da un ID falso, y la herramienta 4 permite verlo cambiando un solo carácter.

Qué seguridad ofrecen

Aquí hay que ser claro: una tarjeta de 125 kHz solo dice un número, y ese número se puede copiar. Hay clonadores por unos pocos dólares que leen la tarjeta y la repiten, y los lectores no tienen forma de distinguirlos. Usar el ID como contraseña es una barrera de comodidad, no de seguridad. Las tarjetas de 13,56 MHz modernas (MIFARE DESFire, NTAG con contraseña, tarjetas con criptografía asimétrica) sí autentican, con un desafío con respuesta (tema 49) que no se puede repetir. La clásica MIFARE Classic (la del módulo MFRC522 de los kits) usa un cifrado propio, Crypto1, roto desde 2008: sirve para identificar, pero no para proteger nada de valor. Para dar acceso a algo importante, el ID no alcanza: se combina con un segundo factor (clave, teclado, validación en un servidor) o se elige una tarjeta con autenticación real.

07 · Luz invisible

Infrarrojo

Trama infrarroja NEC Esquema de una trama NEC, sin escala. Comienza con una ráfaga de 9 milisegundos y una pausa de 4,5 milisegundos. Cada bit es una ráfaga de 562,5 microsegundos: un cero va seguido de una pausa del mismo largo y un uno, de una pausa tres veces mayor. Después de los 32 bits hay una ráfaga final. Las ráfagas son una portadora de 38 kilohercios, que el receptor demodula. ráfaga de 9 mspausa de 4,5 ms 010101fin… 32 bits en total … «0»: 562,5 µs de ráfaga + 562,5 µs de pausa · «1»: 562,5 µs de ráfaga + 1687,5 µs de pausa Cada ráfaga es una portadora de 38 kHz; la pausa es silencio. No está a escala. Dirección, su complemento, orden, su complemento: 4 bytes, el bit menos significativo primero.

El control remoto de un televisor usa un LED infrarrojo de 940 nm, invisible, y un receptor integrado (como el TSOP38238 o el VS1838B) en el aparato. Para distinguir la señal de la luz ambiente, que es mucho más intensa, el emisor no enciende el LED de forma continua sino que lo modula con una portadora de 38 kHz: cada «1 lógico» es una ráfaga de pulsos de 38 kHz, y el receptor tiene un filtro sintonizado a esa frecuencia, un demodulador y entrega una salida digital limpia, invertida (en nivel bajo mientras hay ráfaga). Es la misma idea de modulación del tema 34 en la forma más simple.

Hay muchos protocolos (NEC, Sony SIRC, RC5 de Philips, Samsung). El más difundido es NEC: la trama empieza con una ráfaga de 9 ms y una pausa de 4,5 ms; sigue una dirección de 8 bits, su complemento, una orden de 8 bits y su complemento (el bit menos significativo primero); y termina con una ráfaga corta. Un «0» es una ráfaga de 562,5 µs y una pausa de 562,5 µs; un «1», una ráfaga de 562,5 µs y una pausa tres veces mayor. Con el complemento de cada byte, cada trama tiene siempre 16 unos y 16 ceros y dura 68,06 ms: el complemento sirve para detectar errores y para que la duración sea constante. Mientras se mantiene el botón apretado se envía cada 108 ms un código de repetición corto (9 ms, 2,25 ms y una ráfaga final: 11,81 ms), en lugar de la trama completa. La herramienta 5 arma y mide una trama.

En la práctica, con una placa y la biblioteca IRremote se puede recibir con tres líneas (IrReceiver.begin(PIN), IrReceiver.decode() y la lectura de IrReceiver.decodedIRData.address y .command, seguida de IrReceiver.resume()) y transmitir con IrSender.sendNEC(direccion, orden, repeticiones). Es una buena forma de capturar las órdenes de un control existente y repetirlas desde un microcontrolador, para manejar un televisor o un aire acondicionado. Las limitaciones son las de la luz: visión directa (no atraviesa paredes), alcance de 5 a 10 m, interferencias de lámparas fluorescentes y del sol, y velocidad de unos 2 kbit/s. No es una tecnología de datos: es una de órdenes, y para eso es insuperable en costo.

08 · Decidir

Elegir la tecnología

Elegir bien es contestar unas pocas preguntas en orden. Las dos primeras eliminan casi todas las opciones:

  1. ¿A qué distancia? A menos de 10 cm: RFID o NFC. De 5 a 10 m con visión directa y órdenes sueltas: infrarrojo. Hasta unas decenas de metros: BLE, nRF24L01+, ESP-NOW o Zigbee. A cientos de metros: ESP-NOW, nRF24L01+ con antena. A kilómetros: LoRa.
  2. ¿Quién escucha? Si es un teléfono: BLE (tema 38) o NFC; el resto no existe en él (salvo Wi-Fi). Si es Internet directamente: Wi-Fi (tema 35). Si es otra placa del mismo diseño: cualquiera.
  3. ¿Cuánta energía? Con red eléctrica, cualquiera. Con pila y años de vida, hay que pasar los números por la herramienta 6: el tiempo activo por mensaje y la frecuencia mandan.
  4. ¿Cuántos nodos, y quién los reúne? Un par: lo más simple. Decenas con una puerta de enlace: LoRaWAN, Zigbee. Una casa con enchufes que retransmiten: Zigbee o Thread.
  5. ¿Cuánto cuesta construir la red? El módulo barato (nRF24L01+) exige armar direccionamiento, reintentos y seguridad con lo visto en los temas 41 a 49; un módulo de red (Zigbee, LoRaWAN) lo trae, pero con su propia complejidad.
Elección según el problema.
ProblemaElecciónPor qué
Sensores de humedad en un campo de 3 km, una lectura cada 15 minutos con pilasLoRa (o LoRaWAN)Es la única de la lista que cubre kilómetros con una pila. Con SF9 y 20 bytes, cada mensaje ocupa 0,19 s, y el 1 % permite uno cada 19 s
Cinco sensores en una casa que reportan a un nodo centralESP-NOW (si son ESP32) o nRF24L01+Sin router ni IP, con latencia mínima y poca configuración
Cien sensores y lámparas en un edificio, con alimentación mixtaZigbee o ThreadLa malla da alcance y tolera fallas; los enchufes retransmiten para los sensores con pila
Un sensor que debe verse desde el teléfonoBLEEs lo único que un teléfono entiende sin hardware extra
Abrir una puerta con una tarjetaRFID de 13,56 MHz (MIFARE DESFire o NTAG con clave)El ID de 125 kHz se clona con un aparato de pocos dólares
Manejar un televisor o un aire acondicionado desde un microcontroladorInfrarrojo con IRremoteEs lo que esos aparatos entienden
Un control remoto de un portón a 100 mMódulo de 433 MHz con código variable, nRF24L01+ o LoRaAlcance razonable; el código fijo se repite (tema 49)

Conviene no perder de vista que el alcance anunciado en los catálogos es el de condiciones ideales: antena externa, visión directa, sin interferencias. En interiores, con paredes y con otras redes, se reduce a una fracción. La única forma segura de saber es medir: el RSSI (la potencia recibida) o la tasa de paquetes perdidos (tema 43) a la distancia real, con la antena real.

09 · Con el microcontrolador

ESP-NOW, nRF24L01+ y un lector RFID

Tres programas cortos, cada uno de una tecnología distinta, con el mismo criterio de diseño: un mensaje de formato fijo con versión y número de secuencia (para detectar pérdidas y cambios de versión), tamaños y orden de bytes explícitos, y validación de todo lo que llega por el aire.

ESP-NOW: un emisor de difusión

El emisor envía cada 5 segundos una lectura a todos los receptores en alcance (dirección de difusión), sin registrarse en ningún par. Se carga en cualquier ESP32 (con el núcleo 3.x; en versiones anteriores cambian las firmas de las funciones de retorno).

#include <WiFi.h>
#include <esp_now.h>

// Formato del mensaje: igual en el emisor y el receptor; tamaños fijos y sin relleno
struct __attribute__((packed)) Mensaje {
    uint8_t  version;                                          // para poder cambiar el formato en el futuro
    uint8_t  nodo;                                             // quién envía
    uint16_t secuencia;                                        // cuenta los envíos: el receptor detecta las pérdidas
    int16_t  temperatura;                                      // centésimas de grado
    uint16_t bateria_mv;
};

const uint8_t TODOS[6] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF };   // difusión
const uint8_t NODO = 1;
uint16_t secuencia = 0;

void setup() {
    Serial.begin(115200);
    WiFi.mode(WIFI_STA);                                       // ESP-NOW usa la radio de Wi-Fi, sin conectarse a nada
    if (esp_now_init() != ESP_OK) {
        Serial.println("No se pudo iniciar ESP-NOW");
        return;
    }
    esp_now_peer_info_t par = {};
    memcpy(par.peer_addr, TODOS, 6);
    par.channel = 0;                                           // 0 = el canal actual (todos deben coincidir)
    par.encrypt = false;                                       // la difusión no admite cifrado
    esp_now_add_peer(&par);
}

void loop() {
    Mensaje m = { 1, NODO, secuencia++, (int16_t)lroundf(temperatureRead() * 100), 3300 };
    esp_err_t r = esp_now_send(TODOS, (const uint8_t *)&m, sizeof(m));
    Serial.printf("Mensaje %u: %s\n", m.secuencia, r == ESP_OK ? "enviado a la radio" : "error");
    delay(5000);                                               // en una batería: dormir en lugar de esperar
}

El receptor registra una función que se llama con cada mensaje. Lo que llega puede ser de cualquiera: se comprueba el largo y la versión antes de usarlo.

#include <WiFi.h>
#include <esp_now.h>

struct __attribute__((packed)) Mensaje {                       // idéntica a la del emisor
    uint8_t  version;
    uint8_t  nodo;
    uint16_t secuencia;
    int16_t  temperatura;
    uint16_t bateria_mv;
};

void alRecibir(const esp_now_recv_info_t *info, const uint8_t *datos, int largo) {
    if (largo != sizeof(Mensaje)) return;                      // lo que llega por el aire no es confiable
    Mensaje m;
    memcpy(&m, datos, sizeof(m));
    if (m.version != 1) return;
    Serial.printf("nodo %u, n.º %u, %.2f °C, %u mV, %d dBm\n", m.nodo, m.secuencia, m.temperatura / 100.0, m.bateria_mv, info->rx_ctrl->rssi);
}

void setup() {
    Serial.begin(115200);
    WiFi.mode(WIFI_STA);
    Serial.println(WiFi.macAddress());                         // la MAC sirve para enviar solo a este receptor
    if (esp_now_init() != ESP_OK) {
        Serial.println("No se pudo iniciar ESP-NOW");
        return;
    }
    esp_now_register_recv_cb(alRecibir);
}

void loop() {}
  • Para enviar solo a un receptor se reemplaza la dirección de difusión por la MAC que imprime el receptor, y con par.encrypt = true y una clave (par.lmk, 16 bytes, y esp_now_set_pmk en los dos extremos) el mensaje va cifrado.
  • esp_now_send devuelve ESP_OK cuando el mensaje se entregó a la radio, no cuando llegó. Para saber si el par lo recibió se registra una función de envío con esp_now_register_send_cb (su firma cambió entre versiones del núcleo).
  • El número de secuencia permite que el receptor detecte saltos (mensajes perdidos) y repeticiones (tema 45) comparándolo con el anterior de cada nodo.
  • El orden de los bytes es el del ESP32 (little-endian) en los dos extremos. Para hablar con una placa de otra arquitectura hay que fijarlo explícitamente (tema 46).

nRF24L01+: un par con RF24

Con la biblioteca RF24 (disponible en el gestor de bibliotecas de Arduino), el emisor es:

#include <SPI.h>
#include <RF24.h>

RF24 radio(9, 10);                                             // pines CE y CSN
const byte DIRECCION[6] = "NODO1";                             // 5 bytes más el terminador
struct __attribute__((packed)) Lectura { uint8_t nodo; uint16_t secuencia; int16_t temperatura; };
uint16_t secuencia = 0;

void setup() {
    Serial.begin(115200);
    if (!radio.begin()) {
        Serial.println("El nRF24L01+ no responde: revisar cableado y alimentación");
        while (true) {}
    }
    radio.setPALevel(RF24_PA_LOW);
    radio.setDataRate(RF24_250KBPS);                           // la velocidad más baja: el mayor alcance
    radio.setChannel(76);                                      // 2476 MHz: por encima de los canales 1, 6 y 11 de Wi-Fi
    radio.setRetries(5, 15);                                   // espera de (5 + 1) × 250 = 1500 µs entre reintentos, hasta 15
    radio.openWritingPipe(DIRECCION);
    radio.stopListening();
}

void loop() {
    Lectura l = { 1, secuencia++, 2350 };
    bool ok = radio.write(&l, sizeof(l));                      // true solo si llegó la confirmación del receptor
    Serial.println(ok ? "confirmado" : "sin confirmación tras los reintentos");
    delay(5000);
}

El receptor usa los mismos parámetros, abre el canal de lectura y lee cuando hay algo disponible:

#include <SPI.h>
#include <RF24.h>

RF24 radio(9, 10);
const byte DIRECCION[6] = "NODO1";
struct __attribute__((packed)) Lectura { uint8_t nodo; uint16_t secuencia; int16_t temperatura; };

void setup() {
    Serial.begin(115200);
    if (!radio.begin()) { Serial.println("El nRF24L01+ no responde"); while (true) {} }
    radio.setPALevel(RF24_PA_LOW);
    radio.setDataRate(RF24_250KBPS);                           // los dos extremos deben coincidir en canal, velocidad y dirección
    radio.setChannel(76);
    radio.openReadingPipe(1, DIRECCION);
    radio.startListening();
}

void loop() {
    if (radio.available()) {
        Lectura l;
        radio.read(&l, sizeof(l));
        Serial.print("nodo ");       Serial.print(l.nodo);
        Serial.print(", n.º ");      Serial.print(l.secuencia);
        Serial.print(", ");          Serial.print(l.temperatura / 100.0);
        Serial.println(" °C");
    }
}
  • El canal, la velocidad y la dirección deben coincidir en los dos extremos: es el motivo de casi todos los «no recibe nada».
  • radio.write() bloquea hasta que llega la confirmación o se agotan los reintentos, y su valor de retorno es la confirmación del receptor, no del chip.
  • radio.begin() devuelve false si el chip no responde por SPI: casi siempre es el cableado o la fuente (el condensador de la sección 2).
  • Los dos extremos comparten el formato Lectura: el emisor y el receptor son programas distintos que dependen del mismo contrato, que conviene tener en un solo archivo de cabecera.

RDM6300: leer una tarjeta de 125 kHz

El módulo se alimenta con 5 V y transmite a 9600 baudios. Se conecta a una UART del ESP32 (aquí, la Serial2, con el pin 16 como RX); si el TX del módulo entrega 5 V, se usa el divisor del tema 37. La función implementa el mismo patrón de recepción por estados del tema 41: espera el inicio, acumula, valida al llegar el fin.

const uint32_t AUTORIZADOS[] = { 9185884UL, 1193046UL };       // IDs de las tarjetas permitidas

int nibble(char c) {
    if (c >= '0' && c <= '9') return c - '0';
    if (c >= 'A' && c <= 'F') return c - 'A' + 10;
    return -1;
}

bool leerTarjeta(uint32_t &id) {                               // trama: 0x02, 10 caracteres de datos, 2 de suma y 0x03
    static char buf[12];
    static uint8_t n = 0;
    static bool dentro = false;
    while (Serial2.available()) {
        char c = Serial2.read();
        if (c == 0x02) { dentro = true; n = 0; continue; }     // el inicio descarta lo que hubiera
        if (!dentro) continue;
        if (c != 0x03) {
            if (n < sizeof(buf)) buf[n++] = c; else dentro = false;   // demasiado largo: descartar
            continue;
        }
        dentro = false;                                        // llegó el fin: validar
        if (n != 12) continue;
        uint8_t b[6];
        bool ok = true;
        for (int i = 0; i < 6; i++) {
            int alto = nibble(buf[2 * i]), bajo = nibble(buf[2 * i + 1]);
            if (alto < 0 || bajo < 0) { ok = false; break; }
            b[i] = (alto << 4) | bajo;
        }
        if (!ok || (b[0] ^ b[1] ^ b[2] ^ b[3] ^ b[4]) != b[5]) continue;   // la suma de verificación no coincide
        id = ((uint32_t)b[1] << 24) | ((uint32_t)b[2] << 16) | ((uint32_t)b[3] << 8) | b[4];
        return true;
    }
    return false;
}

void setup() {
    Serial.begin(115200);
    Serial2.begin(9600, SERIAL_8N1, 16, -1);                   // solo se recibe
}

void loop() {
    static uint32_t ultimoId = 0;
    static unsigned long ultimaLectura = 0;
    uint32_t id;
    if (leerTarjeta(id)) {
        bool nueva = id != ultimoId || millis() - ultimaLectura > 1000;   // el módulo repite la trama mientras la tarjeta está cerca
        ultimoId = id;
        ultimaLectura = millis();
        if (nueva) {
            bool permitida = false;
            for (uint32_t a : AUTORIZADOS) if (a == id) permitida = true;
            Serial.printf("Tarjeta %lu: %s\n", (unsigned long)id, permitida ? "permitida" : "no registrada");
        }
    }
}

Qué hay que notar: la validación completa (largo, caracteres hexadecimales y suma) antes de usar el ID; el descarte de la trama si llega un nuevo inicio a medias; la supresión de repeticiones (el módulo reenvía la trama una y otra vez mientras la tarjeta está presente, y no es una lectura nueva cada vez); y que la lista de IDs permitidos es solo una comodidad: como se explicó en la sección 6, un ID de 125 kHz se copia con facilidad.

10 · Analogía con programación

Las cuentas de cada tecnología en Python

Casi todo lo que se calcula en este tema se prueba sin hardware: el tamaño y el tiempo del paquete del nRF24L01+, el tiempo en el aire y la velocidad de LoRa, la frecuencia de un canal de Zigbee y su choque con el Wi-Fi, la validación de una trama RDM6300, la trama y la duración de NEC y la corriente media de un sensor. El modelo siguiente reproduce las reglas de los programas y de la página.

Python en tu navegador. Los bloques son editables: cambiá los valores y presioná «Ejecutar Python». La primera vez tarda unos segundos en cargar.

import math


def paquete_nrf(kbps, datos, direccion, crc):
    bits = 8 + 8 * direccion + 9 + 8 * datos + 8 * crc       # preámbulo, dirección, control de paquete, datos, CRC
    ack = 8 + 8 * direccion + 9 + 8 * crc                    # la confirmación va sin datos
    t_paq = bits * 1000 / kbps                               # µs
    t_ack = ack * 1000 / kbps
    ciclo = 130 + t_paq + 130 + t_ack                        # 130 µs por cada cambio entre transmisión y recepción
    return bits, t_paq, t_ack, ciclo, datos * 8 / ciclo * 1e6


def tiempo_aire_lora(sf, bw_khz, cr, carga):                 # cr = 5 a 8 (4/5 a 4/8); encabezado explícito y CRC
    tsym = 2 ** sf / (bw_khz * 1000)
    de = 1 if tsym > 0.016 else 0                            # optimización de baja velocidad
    n = 8 + max(math.ceil((8 * carga - 4 * sf + 28 + 16) / (4 * (sf - 2 * de))) * cr, 0)
    return tsym, (8 + 4.25) * tsym + n * tsym


def velocidad_lora(sf, bw_khz, cr):
    return sf * (bw_khz * 1000 / 2 ** sf) * 4 / cr


def frecuencia_zigbee(canal):
    return 2405 + 5 * (canal - 11)


def choca_con_wifi(canal_zigbee):
    f = frecuencia_zigbee(canal_zigbee)
    return [w for w in (1, 6, 11) if abs(f - (2407 + 5 * w)) < 12]


def validar_rdm6300(texto):
    datos = bytes.fromhex(texto)
    xor = 0
    for b in datos[:5]:
        xor ^= b
    return int.from_bytes(datos[1:5], "big"), xor, xor == datos[5]


def trama_nec(direccion, orden):
    return bytes([direccion, direccion ^ 0xFF, orden, orden ^ 0xFF])


def duracion_nec_ms(trama):
    unos = sum(bin(b).count("1") for b in trama)
    return 9 + 4.5 + (32 - unos) * 1.125 + unos * 2.25 + 0.5625


def corriente_media_ma(activo_s, i_activa_ma, sueno_ua, periodo_s):
    return (i_activa_ma * activo_s + sueno_ua / 1000 * (periodo_s - activo_s)) / periodo_s


for kbps in (2000, 1000, 250):
    bits, tp, ta, ciclo, thr = paquete_nrf(kbps, 32, 5, 2)
    print(f"nRF24 a {kbps:>4} kbit/s: {bits} bits, {tp:.1f} µs, ACK {ta:.1f} µs, ciclo {ciclo:.0f} µs, {thr / 1000:.0f} kbit/s útiles")

for sf in (7, 9, 12):
    tsym, toa = tiempo_aire_lora(sf, 125, 5, 20)
    print(f"LoRa SF{sf}, 125 kHz, 20 bytes: símbolo {tsym * 1000:.3f} ms, {toa * 1000:.1f} ms, {velocidad_lora(sf, 125, 5):.0f} bit/s, mínimo entre mensajes con 1 %: {toa * 100:.1f} s")

for canal in (11, 15, 20, 26):
    print(f"Zigbee canal {canal}: {frecuencia_zigbee(canal)} MHz, choca con Wi-Fi {choca_con_wifi(canal) or 'ninguno'}")

print("RDM6300:", validar_rdm6300("0A008C2A5CF0"), validar_rdm6300("0A008C2A5CF1"))
t = trama_nec(0x00, 0xFF)
print("NEC 00/FF:", t.hex(" ").upper(), f"{duracion_nec_ms(t):.2f} ms")
t = trama_nec(0x20, 0x0C)
print("NEC 20/0C:", t.hex(" ").upper(), f"{duracion_nec_ms(t):.2f} ms")

for nombre, activo, i, sueno in (("ESP-NOW", 0.2, 100, 20), ("nRF24", 0.01, 15, 5), ("LoRa", 0.185, 35, 5), ("BLE", 0.003, 8, 3), ("Wi-Fi", 0.94, 120, 20)):
    ma = corriente_media_ma(activo, i, sueno, 600)
    print(f"{nombre:8} cada 10 min: {ma:.4f} mA, {2000 / ma / 24:.0f} días con 2000 mAh")

Resultado: el nRF24L01+ con 32 bytes, dirección de 5 y CRC de 2 arma un paquete de 329 bits; a 2000 kbit/s ocupa 164,5 µs, la confirmación 36,5 µs, el ciclo 461 µs y se obtienen 555 kbit/s útiles; a 1000 kbit/s, 329 µs, 73 µs, 662 µs y 387 kbit/s; a 250 kbit/s, 1316 µs, 292 µs, 1868 µs y 137 kbit/s. LoRa con 125 kHz, 4/5 y 20 bytes: SF7 dura 1,024 ms por símbolo y 56,6 ms en el aire, con 5469 bit/s y 5,7 s de espera mínima con el 1 %; SF9, 4,096 ms, 185,3 ms, 1758 bit/s y 18,5 s; SF12, 32,768 ms, 1318,9 ms, 293 bit/s y 131,9 s. En Zigbee, el canal 11 está en 2405 MHz y se pisa con el Wi-Fi 1, mientras que los canales 15, 20 y 26 (2425, 2450 y 2480 MHz) no chocan con ninguno de los tres. La trama RDM6300 0A008C2A5CF0 da el ID 9185884, suma 240 (0xF0) y es válida; con F1 final, la suma coincide en el cálculo pero no con la recibida (False). Las tramas NEC son 00 FF FF 00 y 20 DF 0C F3, y las dos duran 68,06 ms. Cada 10 minutos y con 2000 mAh: ESP-NOW usa 0,0533 mA y dura 1563 días (4,3 años); el nRF24L01+, 0,0052 mA y 15 873 días; LoRa, 0,0158 mA y 5278 días; BLE, 0,0030 mA y 27 412 días; y el Wi-Fi con conexión rápida, 0,2080 mA y 401 días. Esas duraciones ignoran la autodescarga de la batería.

Una lección de esta cuenta: la tecnología importa menos que el tiempo activo por mensaje. Un nRF24L01+ y un ESP-NOW tienen potencia de radio parecida, pero uno vive en un microcontrolador pequeño que despierta 10 ms y el otro en un ESP32 que tarda 200 ms: la diferencia es de diez veces en la energía de cada envío.

11 · Exploración interactiva

Laboratorio: paquete, tiempo en el aire, canales, tarjetas, infrarrojo y batería

El laboratorio tiene seis herramientas. La primera calcula el paquete del nRF24L01+ y su velocidad útil. La segunda, el tiempo en el aire de LoRa y lo que permite el ciclo de trabajo. La tercera ubica un canal de Zigbee frente al Wi-Fi. La cuarta valida una trama del lector RFID RDM6300. La quinta arma una trama infrarroja NEC. La sexta compara la duración de la batería de las tecnologías del tema.

Para la herramienta 6, cada tecnología se modela con estos supuestos por cada envío (valores prudentes de un diseño típico; los reales varían bastante con el chip y la placa):

Supuestos de la herramienta 6.
TecnologíaTiempo activoCorriente activaCorriente dormidoQué representa
ESP-NOW (ESP32)0,2 s100 mA20 µAEl ESP32 despierta, arranca la radio y envía
nRF24L01+0,01 s15 mA5 µAUn microcontrolador pequeño y el módulo
LoRa (SF9, 20 bytes)0,185 s35 mA5 µAEs el tiempo en el aire de la herramienta 2
Zigbee (dispositivo final)0,03 s25 mA3 µADespertar, consultar al padre y enviar
BLE (publicidad)0,003 s8 mA3 µAUn evento de publicidad (tema 38)
Wi-Fi con conexión rápida0,94 s120 mA20 µAReconectar y enviar un mensaje (tema 36)

1. Paquete del nRF24L01+

Tamaño del paquete—
Tiempo del paquete—
Tiempo de la confirmación—
Ciclo completo—
Velocidad útil—
Espera entre reintentos—

Elegí la velocidad y el tamaño de los datos.

2. Tiempo en el aire de LoRa

Duración del símbolo—
Tiempo en el aire—
Velocidad de bits—
Sensibilidad—
Mensajes por hora—
Separación mínima—

Elegí los parámetros de LoRa.

3. Canal de Zigbee frente al Wi-Fi

Frecuencia central—
Tiempo en el aire—
Tramas por segundo—
Canales de Wi-Fi que pisa—
Veredicto—

Elegí un canal de Zigbee.

4. Trama del lector RFID RDM6300

Byte de versión—
Bytes del ID—
ID en decimal—
Suma de verificación—
Veredicto—

Escribí los 12 caracteres de la trama.

5. Trama infrarroja NEC

Bytes de la trama—
Bits enviados—
Unos y ceros—
Duración de la trama—
Con el botón apretado—

Escribí una dirección y una orden.

6. Batería según la tecnología

ESP-NOW—
nRF24L01+—
LoRa—
Zigbee—
BLE—
Wi-Fi con conexión rápida—
La más eficiente—

Elegí la batería y el intervalo.

En la herramienta 1, el paquete cuenta preámbulo, dirección, 9 bits de control, datos y CRC, y el ciclo incluye 130 µs en cada cambio entre transmisión y recepción. En la 2, la fórmula supone encabezado explícito, CRC y 8 símbolos de preámbulo. En la 3, el solapamiento se evalúa con la separación de 12 MHz entre centros (la mitad del ancho de un canal de Wi-Fi más la de uno de Zigbee). En la 4, la suma es el XOR de los cinco bytes de datos. En la 5, las ráfagas y las pausas siguen los tiempos de NEC. La 6 ignora la autodescarga.

Recorrido guiado

  1. En la herramienta 1, con los valores iniciales (2000 kbit/s, 32 bytes, dirección de 5 y CRC de 2): 329 bits, 165 µs, 36,5 µs de confirmación, ciclo de 461 µs (2169 paquetes por segundo) y 555,3 kbit/s útiles. Con 250: 1316 µs, ciclo de 1868 µs, 137 kbit/s y espera de reintento de 500 µs. Con 1000 kbit/s, 8 bytes, dirección de 3 y CRC de 1: 113 bits y 151,7 kbit/s; con 0 bytes de datos, el ciclo de 358 µs es solo costo. Con 500: no es una velocidad válida.
  2. En la herramienta 2, con los valores iniciales (SF9, 125 kHz, 4/5, 20 bytes, 1 %): 4,096 ms por símbolo, 185,3 ms en el aire, 1,8 kbit/s, −129,5 dBm, 194 mensajes por hora y uno cada 19 s. Con SF7: 56,6 ms, −124,5 dBm y 636 mensajes por hora. Con SF12 y 51 bytes: 2,47 s, −137 dBm, solo 14 mensajes por hora (uno cada 247 s, marcado en rojo). Con SF7, 500 kHz, 10 bytes y 10 %: 10,3 ms, 21,9 kbit/s y −118,5 dBm: más velocidad y menos alcance.
  3. En la herramienta 3, con el canal 15 y 127 bytes: 2425 MHz, 4256 µs en el aire (133 bytes a 250 kbit/s), 235 tramas por segundo y ninguno de los Wi-Fi 1, 6 y 11 pisado. Con el 11: 2405 MHz, se pisa con el Wi-Fi 1 (en rojo). Con el 25: 2475 MHz, sin choque con 1, 6 y 11 (solo con los canales 12 y 13, que en América no se usan). Con el 18 y 20 bytes: 2440 MHz, 832 µs, 1202 tramas por segundo y choque con el Wi-Fi 6.
  4. En la herramienta 4, con 0A008C2A5CF0: versión 0x0A, ID 00 8C 2A 5C, 9 185 884, suma calculada 0xF0 y recibida 0xF0: trama válida. Cambiá el último carácter a 1: la suma recibida es 0xF1, la trama se descarta. Con 0A008C (cortada): no hay resultados.
  5. En la herramienta 5, con dirección 00 y orden FF: 00 FF FF 00, 16 unos y 16 ceros y 68,06 ms. Con 20 y 0C: 20 DF 0C F3, con los bits 00000100 11111011 00110000 11001111 (el menos significativo primero), y otra vez 16 unos, 16 ceros y 68,06 ms: la duración no depende de la orden.
  6. En la herramienta 6, con los valores iniciales (2000 mAh, un envío cada 10 minutos): BLE usa 0,0030 mA y es la más eficiente, el nRF24L01+ 0,0052 mA, LoRa 0,0158 mA, Zigbee 0,0042 mA, ESP-NOW 0,0533 mA (4,3 años) y Wi-Fi 0,208 mA (401 días). Con un envío por minuto (60): ESP-NOW cae a 236 días y el Wi-Fi a 44 días (en rojo). Con 3600 s y 220 mAh (una pila de botón): BLE, 8,4 años; Zigbee, 7,8; LoRa, 3,7; nRF24L01+, 5,0; ESP-NOW, 359 días. Con un envío cada 5 s (y los 220 mAh): solo BLE (3,2 años) y el nRF24L01+ (262 días) superan los 90 días.
Desafío: medidores de agua en un barrio

Una cooperativa quiere medir el consumo de agua de 400 casas, con un mensaje de 12 bytes por casa cada 15 minutos, con medidores alimentados por pilas de 2 Ah que deben durar 10 años, y con una distancia de hasta 2 km a una torre. Con la herramienta 2 (SF9, 125 kHz, 12 bytes): unos 144 ms en el aire. Con la herramienta 6 (una cada 900 s): LoRa gasta unos 0,0106 mA, o sea 2000 / 0,0106 / 24 ≈ 7860 días, más de 20 años en el cálculo (la autodescarga manda). Problemas: (1) Ciclo de trabajo: un medidor emite 96 mensajes por día, 14 s: lejos del 1 %. Pero 400 medidores comparten el canal: con 96 mensajes cada uno son 38 400 mensajes por día y 5500 s de aire, el 6,4 % del tiempo de un solo canal: habrá colisiones (sin coordinación, con ese tráfico se pierde alrededor del 12 % de los mensajes), y se reparten entre canales o con LoRaWAN, que adapta el SF de cada uno. (2) Alcance: 2 km en zona urbana necesitan SF9 a SF11; con el SF más alto, más tiempo en el aire y más colisiones: se instalan dos puertas de enlace. (3) Seguridad: sin cifrado, cualquiera lee y falsifica el consumo; LoRaWAN cifra con AES-128 y usa contadores contra la repetición. (4) Confirmación: el mensaje de un medidor es una lectura acumulada, no un incremento, de modo que un mensaje perdido se recupera con el siguiente. Es la misma disciplina de los temas 43 a 45 aplicada a otra radio.

12 · Comprensión

Confusiones frecuentes

«El nRF24L01+ llega a 1 km, como dice el catálogo»

Esa cifra es de la versión con amplificador y antena externa, a 250 kbit/s, con visión directa y sin interferencias. Con el módulo común, en interiores, se esperan entre 10 y 30 m, y a 2 Mbit/s menos. Se mide con la tasa de paquetes perdidos a la distancia real.

«Con 2 Mbit/s en el aire, el nRF24L01+ transfiere 2 Mbit/s»

Con paquetes de 32 bytes, la confirmación y los 130 µs de cada cambio entre transmisión y recepción dejan unos 555 kbit/s útiles, y a 250 kbit/s, 137 kbit/s. La velocidad útil siempre es menor que la del aire.

«LoRa es lenta, así que es mala»

Es lenta a propósito: cada paso de factor de ensanchamiento duplica el tiempo y gana alcance. Para una lectura de 12 bytes cada 15 minutos la velocidad no importa y el alcance sí. Si hace falta velocidad, no es la herramienta.

«LoRa y LoRaWAN son lo mismo»

LoRa es la modulación (capa física); LoRaWAN, un protocolo de red con puertas de enlace, servidor, cifrado y direcciones. Con dos módulos LoRa se puede armar un enlace propio sin LoRaWAN, y a cambio no hay red ni seguridad hechas.

«Con LoRa se puede transmitir tantas veces como se quiera»

No: el tiempo en el aire está regulado en muchas regiones (en Europa, el 1 % del tiempo en la mayoría de los canales de 868 MHz) y, aunque no lo estuviera, los mensajes largos agotan la batería y chocan con los de otros. Se usa el SF más bajo que funcione y mensajes cortos.

«Mi red de Zigbee anda mal desde que cambié el router»

Zigbee y Wi-Fi comparten la banda de 2,4 GHz, y el router puede haber pasado a un canal que tapa al de la red. Se elige un canal de Zigbee (15, 20, 25 o 26) que quede en los huecos de los canales 1, 6 y 11 de Wi-Fi, y se fijan los dos.

«ESP-NOW anda hasta que conecto el ESP32 al router»

Al conectarse, la radio se mueve al canal del router, y el otro extremo, que sigue en el anterior, deja de oír. Todos los dispositivos de una red ESP-NOW deben estar en el mismo canal; si uno se conecta, los demás tienen que adaptarse.

«Si la tarjeta es de mi sistema, el ID es una contraseña»

El ID de una tarjeta de 125 kHz es un número fijo que se copia con un aparato barato. Para controlar un acceso real hacen falta tarjetas con autenticación (desafío con respuesta) y, mejor, un segundo factor.

«El lector RFID leyó dos veces la misma tarjeta, así que están pasando dos personas»

El módulo reenvía la trama mientras la tarjeta está cerca del lector. El programa debe distinguir una presencia sostenida de una lectura nueva (por ejemplo, ignorando el mismo ID dentro de un segundo).

«El infrarrojo funciona en cualquier lado, como la radio»

Necesita visión directa, no atraviesa paredes ni vidrios con filtro, y la luz del sol o de ciertas lámparas lo interfiere. Es perfecto para un control remoto de sala y mala idea para cualquier cosa que deba funcionar sin apuntar.

«Elijo la tecnología con más alcance, por las dudas»

El alcance se paga en velocidad, en tiempo en el aire, en complejidad y, muchas veces, en regulación. Se elige la que cubre la distancia real con un margen y minimiza el costo total (energía, red y programación), no la que más promete.

13 · Práctica guiada

Predecí antes de comprobar

1. Paquete del nRF24L01+

Un nRF24L01+ a 1 Mbit/s envía 10 bytes con dirección de 5 bytes y CRC de 2. ¿Cuántos bits tiene el paquete, cuánto tarda el ciclo con su confirmación y cuál es la velocidad útil?

Ver solución

8 + 40 + 9 + 80 + 16 = 153 bits, o 153 µs. La confirmación vacía mide 8 + 40 + 9 + 16 = 73 bits, 73 µs. El ciclo es 130 + 153 + 130 + 73 = 486 µs. La velocidad útil es 80 bits / 486 µs ≈ 165 kbit/s, una sexta parte de la velocidad del aire.

2. Tiempo en el aire de LoRa

Un mensaje de 10 bytes con SF7, 125 kHz y codificación 4/5. ¿Cuánto dura el símbolo, cuánto el mensaje y cuántos mensajes por hora permite el 1 %?

Ver solución

Símbolo: 27 / 125 000 = 1,024 ms. Símbolos de datos: 8 + ⌈(80 − 28 + 28 + 16) / 28⌉ · 5 = 8 + 4 · 5 = 28. Total: (8 + 4,25 + 28) · 1,024 ms ≈ 41,2 ms. El 1 % de una hora son 36 s, así que caben 36 / 0,0412 ≈ 873 mensajes por hora, uno cada 4,1 s como mínimo.

3. Canal de Zigbee

¿En qué frecuencia está el canal 17 de Zigbee? ¿Se pisa con algún canal de Wi-Fi de 1, 6 y 11? Nombrá dos canales de Zigbee que no se pisen con ninguno.

Ver solución

2405 + 5 · (17 − 11) = 2435 MHz. El Wi-Fi 6 está centrado en 2437 MHz: solo 2 MHz de diferencia, se pisa por completo. Los canales 15 (2425 MHz) y 20 (2450 MHz) están a 12 MHz o más de los centros de los canales 1, 6 y 11 de Wi-Fi: no chocan (también el 25 y el 26).

4. Trama del RDM6300

El lector entrega los cinco bytes 0A 00 12 34 56. ¿Qué dos caracteres de suma de verificación lleva la trama, y qué ID decimal da?

Ver solución

XOR: 0A ⊕ 00 = 0A; ⊕ 12 = 18; ⊕ 34 = 2C; ⊕ 56 = 7A. Los 12 caracteres de la trama son 0A001234567A (diez de datos y 7A al final). El ID son los cuatro últimos bytes de datos: 0x00123456 = 1 193 046.

5. Trama NEC

Una trama NEC envía la dirección 04 y la orden 08. ¿Qué cuatro bytes se transmiten, cómo salen los bits del primero y cuánto dura la trama?

Ver solución

Los bytes son 04 FB 08 F7 (cada uno con su complemento). El 0x04 es 00000100 y se envía con el menos significativo primero: 00100000. Como cada byte va con su complemento, siempre hay 16 unos y 16 ceros: 9 + 4,5 + 16 · 1,125 + 16 · 2,25 + 0,5625 = 68,06 ms, para cualquier dirección y orden.

6. La batería de un sensor ESP-NOW

Un sensor con ESP32 y ESP-NOW despierta 0,2 s a 100 mA cada 10 minutos y duerme con 20 µA, con una batería de 2000 mAh. ¿Cuál es la corriente media y la duración? ¿Qué pesa más, el envío o el sueño?

Ver solución

Cada envío gasta 100 mA · 0,2 s = 20 mC. En 600 s son 20 / 600 = 0,0333 mA, más los 0,02 mA del sueño: 0,0533 mA. Duración: 2000 / 0,0533 ≈ 37 500 h, unos 1563 días (4,3 años). Pesa más el envío (63 %) que el sueño (37 %): bajar el tiempo despierto (canal fijo, sin esperas) es lo que más ayuda.

7. Elegir la tecnología

Elegí una tecnología y justificala con alcance, energía y quién escucha: (a) sensores de temperatura en invernaderos distribuidos en 3 km, con pilas, un mensaje cada 15 minutos; (b) un timbre inalámbrico entre dos placas ESP32 de una casa; (c) abrir una puerta con una tarjeta; (d) encender un televisor desde un microcontrolador.

Ver solución

(a) LoRa (o LoRaWAN, con una puerta de enlace): kilómetros con una pila; con SF9 y 20 bytes son 0,19 s por mensaje, y el 1 % lo permite. (b) ESP-NOW: las dos placas son de Espressif, sin router y con latencia de pocos milisegundos; alcanza con difusión o con la MAC del receptor. (c) RFID de 13,56 MHz con autenticación (MIFARE DESFire o NTAG con clave), idealmente más un segundo factor: el ID de 125 kHz se copia. (d) Infrarrojo con IRremote: es lo que entiende el televisor; se captura la orden del control original y se repite.

14 · Síntesis

Ideas para recordar

  • Toda tecnología inalámbrica es un compromiso entre alcance, velocidad y consumo: ninguna gana en las tres. Se compara también por topología (par, estrella, malla), costo y ecosistema, y lo que importa para la batería es la energía por mensaje y el tiempo activo, no solo la corriente.
  • El nRF24L01+ es un transceptor de 2,4 GHz con el protocolo Enhanced ShockBurst en el chip: paquete de preámbulo, dirección, 9 bits de control, 0 a 32 bytes y CRC, con confirmación y reintentos automáticos. La velocidad útil es una fracción de la del aire (555 kbit/s con 2 Mbit/s y 32 bytes) por los 130 µs de cada cambio y la confirmación. No trae red ni cifrado.
  • LoRa usa espectro ensanchado por barrido en menos de 1 GHz. Cada paso de factor de ensanchamiento duplica el tiempo en el aire y gana unos 2,5 dB; duplicar el ancho de banda reduce el tiempo a la mitad y pierde 3 dB. Con 14 dBm y −137 dBm de sensibilidad, el enlace alcanza kilómetros. El tiempo en el aire, regulado por el ciclo de trabajo (1 % en Europa), limita los mensajes: uno de 1,3 s obliga a esperar 132 s.
  • LoRa es la capa física y LoRaWAN, la red por encima: puertas de enlace, servidor, cifrado AES-128 y contadores contra la repetición. Es la herramienta para cientos de sensores con pila; para dos placas propias, LoRa sola alcanza.
  • Zigbee (IEEE 802.15.4) usa 16 canales de 2 MHz en 2,4 GHz (el canal n está en 2405 + 5·(n − 11) MHz), 250 kbit/s y malla con coordinador, enrutadores y dispositivos finales que duermen. Con poca potencia, un canal que se pise con el Wi-Fi pierde casi todo: los canales 15, 20, 25 y 26 esquivan los canales 1, 6 y 11. Thread usa la misma radio con IPv6.
  • ESP-NOW comunica ESP32 y ESP8266 con tramas de 802.11 enviadas a una MAC, sin punto de acceso ni conexión: hasta 250 bytes, cifrado opcional, rápido y de bajo costo, con la condición de que todos estén en el mismo canal (el del router, si están conectados). El emisor no sabe si alguien escucha si no hay confirmación; la fiabilidad la agrega el programa.
  • RFID y NFC alimentan la etiqueta con el campo del lector y funcionan a pocos centímetros. Las tarjetas de 125 kHz (EM4100) solo emiten un número copiable: el RDM6300 lo entrega en una trama de 14 bytes con una suma XOR que hay que validar. Las de 13,56 MHz (MIFARE, NTAG, NFC) tienen memoria y comandos; solo las que autentican con desafío y respuesta protegen algo.
  • El infrarrojo modula un LED de 940 nm con una portadora de 38 kHz que un receptor integrado demodula. La trama NEC lleva dirección, orden y sus complementos: siempre 16 unos y 16 ceros y 68,06 ms. Necesita visión directa y sirve para órdenes sueltas, no para datos.
  • Se elige respondiendo cuatro preguntas: a qué distancia, quién escucha (teléfono, Internet u otra placa), cuánta energía hay y cuántos nodos se reúnen. Se mide con el RSSI y la tasa de pérdida a la distancia real: el alcance del catálogo es el de condiciones ideales.

¿Listo para el siguiente tema?

Antes de avanzar, calculá cuánto tarda un mensaje de 20 bytes con SF9 en LoRa y cuántos mensajes por hora permite el 1 %; explicá por qué el nRF24L01+ a 2 Mbit/s no entrega 2 Mbit/s útiles; y elegí entre ESP-NOW, LoRa y BLE para un sensor de pila que reporta a 800 m de una casa, justificando con alcance, energía y quién lo recibe. Si podés justificar las tres respuestas, entendés el mapa de las tecnologías inalámbricas.

En el próximo tema se reúne todo lo de esta parte del curso en un taller: un sensor inalámbrico de bajo consumo. Se mide, se envía por BLE o por LoRa, se usa el sueño profundo para dormir casi siempre y se calcula la duración real de la batería: la cuenta de la herramienta 6 de este tema, ahora con un circuito y un multímetro.