Transmita tramas LoRa de 900 MHz sorprendentemente lejos sin una radio (y otras travesuras de radio que utilizan ADC, PWM y buses I2S/SPI), incluido el envío de otros datos de RF, así como la recepción de señales de RF (aunque es cierto que no es un receptor LoRa).
Si está buscando la charla por radio sobre el microcontrolador La-Tecnologia 2024, puede hacer clic aquí.
Si buscas productos de LoLRa (como camisetas, etc.), haz clic aquí.
Nota
Precaución
Debido a que dependemos de armónicos y aliasing, los principales componentes de frecuencia emitidos por su microcontrolador estarán en partes del espectro de RF donde las transmisiones de RF están prohibidas. Filtre su salida o realice sus pruebas en un área donde sea poco probable que haya fugas de RF significativas. La salida EIRP general es generalmente ≪300uW en todo el espectro distribuido en cientos de frecuencias de emisión, pero prácticamente no hay forma de que un dispositivo que transmita deliberadamente en estas frecuencias pueda cumplir con la parte 15 de la FCC, incluso con filtrado.
Siempre me ha fascinado enviar y recibir señales de radio desde microcontroladores que no tienen hardware de radio dedicado. Este repositorio sirve como una descripción general de muchos de los proyectos que he realizado para realizar esta decodificación, junto con código de ejemplo (aunque algunos tienen licencia restrictiva).
En general, el repositorio se divide en muchos proyectos, pero se clasifica por tipo de dispositivo.
Transmisión LoRa solo por firmware, para una variedad de procesadores. Envíe paquetes LoRa, sin radio, chips, hardware externo ni radios integradas, en una variedad de procesadores comunes y económicos. Si bien no es realmente una explosión de bits, este repositorio muestra cómo utilizando un registro de desplazamiento (es decir, un puerto I2S o SPI) o un APLL, puede enviar paquetes LoRa que pueden ser decodificados mediante puertas de enlace LoRa comerciales y otros chips.
Hay dos modos principales con los que funciona este repositorio.
Haga clic a continuación para ver la versión en vídeo de Youtube de esta página:
Cada vez que una señal cambia de estado de bajo a alto o de alto a bajo, se crea una perturbación en los campos electromagnéticos que rodean ese cable. En cualquier momento. La diferencia es: ¿usted, como ingeniero, le tendrá miedo, lo aplastará mientras camina, tendrá miedo de cualquier EMI que pueda causar, o agarrará al toro por los cuernos y emitirá algunas señales elaboradas artesanalmente? Los principios principales que deberá comprender son:
El segundo principio es la mezcla de señales. Si crea una señal y luego la "mezcla" con una alta frecuencia, obtendrá una "imagen" envuelta alrededor de esa alta frecuencia. La mezcla se puede realizar con diodos, equipos especiales de RF o incluso simplemente muestreo, como el que se realiza utilizando un registro de desplazamiento, que genera bits a una velocidad constante.
Ahora la verdadera magia ocurre cuando te das cuenta de que estos dos principios realmente funcionan juntos. Obtienes una imagen en la banda base, una imagen reflejada alrededor de la frecuencia de muestreo, luego alrededor de ×3 la frecuencia de muestreo, obtienes otras 2 imágenes, la directa y la inversa. Y ×5, y ×7, etc.
Con esto, con un reloj lo suficientemente preciso, podemos generar arbitrariamente cualquier frecuencia que deseemos, siempre que quede suficiente ancho de banda en el GPIO de nuestro micro para generarla, incluso si la señal "real" que estamos generando tiene una frecuencia mucho menor. .
Los osciladores internos de los microcontroladores no sólo son inexactos, sino que también oscilan en frecuencia. Podría pensar que esto es negativo, pero de hecho, usar el oscilador interno integrado en los micros a menudo puede ser un salvavidas, permitiéndole superar EMI/EMC. Debido a que los osciladores internos no sólo son imprecisos sino también nerviosos, evitan los armónicos de frecuencias individuales más altas en el espectro debido a que la velocidad del reloj varía mucho.
Salida de cristal:
Salida RC:
Consulte la sección siguiente para conocer el meollo de la cuestión de cómo funcionan realmente las señales LoRa o las cosas que ninguno de los otros doctores en Internet estuvo dispuesto a contarle al respecto.
LoRa normalmente opera en el espectro de 433MHz o 900MHz, generalmente con canales de 125kHz. En principio, LoRa crea chirridos, comenzando en una frecuencia, 62,5 kHz por debajo del centro del canal, luego, durante un corto período de tiempo (1.024uS en SF7), el tono sube hasta 62,5 kHz por encima del centro del canal.
Si bien LoRa se puede utilizar con muchos anchos de canales diferentes, 125 kHz y 500 kHz son muy compatibles, mientras que otros anchos de canales no se pueden configurar con enrutadores como el LR9.
Este diagrama muestra la frecuencia en el eje X y el tiempo en el eje Y (de arriba a abajo)... Puedes ver:
Convenientemente, la ventana para un chirrido determinado es estable dependiendo del factor de dispersión. Para el paquete anterior, con SF7, equivale a 1024 us por símbolo, o para SF8, 2048 us por símbolo. Cada símbolo/chirrido puede representar un número de bits, mediante un desplazamiento de fase.
La "fase" sin procesar de un chirrido está codificada en gris para distribuir mejor el error de bit entre bits a capas superiores del proceso. Por ejemplo, si no está de acuerdo con la fase en la que cree que se encuentra el chirrido, podría estar por encima de un límite entre, por ejemplo, 0b1111 y 0b10000 y provocaría errores de 5 bits. Al codificarlo en gris, se minimizan los errores de bits creados por un apagado por uno o incluso por algunos de la fase.
Después de que este flujo de bits sin procesar se decodifica a partir de los chirridos individuales y se codifica en gris (consulte encodeHamming84sx
) en LoRa-SDR-Code.h
, luego transponemos/intercalamos los bits para que cualquier símbolo que pueda eliminarse (consulte diagonalInterleaveSx
) para distribuya cualquier error para que un solo símbolo perdido pueda recuperarse y blanquearse (creo que en realidad este es un paso inútil en este protocolo, corríjame si me equivoco) ver Sx1272ComputeWhitening
. Arriba del blanqueamiento hay una capa de corrección de errores para ayudar a corregir cualquiera de los errores de bits que podrían ocurrir en una capa inferior (consulte encodeFec
).
En general, los mensajes tienen un encabezado y una carga útil. Tenga en cuenta que esto puede ser un poco complicado, porque el encabezado a veces usa configuraciones de codificación diferentes a las de la carga útil. Y eso es todo.
Una vez que genere paquetes formateados correctamente, puede codificarlos en chirridos y transmitirlos por cable.
Puede encontrar una vista más detallada del protocolo aquí, para una visión más académica y aquí para ver algunos ejemplos mejores (aunque he encontrado algunos problemas con la corrección/claridad de ambos documentos).
Comencé el proyecto con ESP32-S2 para ver si podía emitir una señal usando el APLL interno incorporado y enrutar el reloj APLL/2 a través del IOMUX, y la respuesta fue que podía. Debido a que esto genera una onda cuadrada simple, y las ondas cuadradas tienen armónicos en F×3, F×5, F×7, etc... en el espectro, si configuro el APLL en 139,06 MHz, genera 69,53 MHz. El decimotercer armónico es 903,9 MHz, o el primer canal LoRa de 125 kHz. Luego, al sintonizar los bits de control del PLL menos significativos, podemos sintonizarlo de 903,9 MHz - 62,5 kHz a 903,9 + 62,5 kHz, sintonizando el APLL a 139,06 MHz - 9,62 kHz a 139,06 MHz + 9,62 kHz. Esto nos permite generar los chirridos característicos de LoRa y, de hecho, ¡esto es aceptable!
El ESP32-S2 también tiene otro truco: el GPIO mux es capaz de emitir una señal o la inversa de esa señal. De esa manera podemos crear diferencialmente la señal de 139,06MHz, ¡aumentando la potencia de salida en 3dB!
Sin embargo, existen problemas con el ESP32-S2. Cabe destacar que:
Además, muy pocos procesadores tienen APLL, por lo que a pesar de este rápido éxito, decidí pasar a...
Hace varios años, realicé varios proyectos que utilizaban síntesis directa de flujo de bits para hacer algunas cosas, como transmitir televisión RF Color NTSC en el canal 3 con un ESP8266 o usar paquetes Ethernet para transmitir radio AM. Uno de los buenos trucos es que, si transmites un flujo de bits en un registro de desplazamiento SPI o I2S, se produce un alias en la frecuencia de muestreo, con imágenes en F×3, F×5, F×7, etc. Parte es que conserva el tamaño/forma de la forma de onda transmitida en imágenes/alias en todo el espectro. Para el Canal 3, la señal de 65MHz se reflejaba alrededor de la frecuencia de muestreo de 40MHz. Harry Nyquist puede ir a morder un limón.
Esta técnica proporciona una increíble fidelidad incluso en situaciones extremadamente pobres, de forma poco intuitiva. Puede crear señales sorprendentemente precisas en cualquier lugar donde las esperaría.
Hay varias formas de lograr esto, pero normalmente es más fácil con un registro de desplazamiento. Un registro de desplazamiento como ese en un bus I2S o SPI. Y, si usa DMA, puede alimentar fácilmente el registro de desplazamiento con más datos sin activar la CPU en cada ciclo. Sin embargo, hay otras formas, como alternar directamente una IO o usar un temporizador para encender y apagar una IO en el momento adecuado, pero es más fácil escribir código para generar un flujo de bits y desplazarlo.
Para los registros de desplazamiento, se deben hacer algunas consideraciones, como asegurarse de que el endianismo, el ancho de bits y la disposición de la memoria sean correctos, pero, en general, puede mantenerse al día y, a menos que haya un retraso, como el tiempo entre cada palabra, Por lo general, son capaces de representar con bastante fidelidad un patrón de bits en la salida para transferirlo y sacarlo de un pin.
El "lohrcut" descrito en el vídeo implica escribir una función que, dado un momento determinado, determina la amplitud de una señal. Esta función puede ser determinar la amplitud de una señal de muy alta frecuencia, luego, la frecuencia de muestreo puede ser cualquier frecuencia de muestreo físicamente realizable que esté disponible. Esto creará una imagen de la señal de alta frecuencia en una señal de frecuencia mucho más baja, construyéndola sin potencia entre 0 y Fs/2.
Otra preocupación es el flash, que en algunos sistemas accede de manera inconsistente o no funciona bien en ciertas frecuencias. En esos casos, como en el ESP8266, las tablas deben leerse en la RAM y reproducirse desde allí.
Las tramas LoRa están totalmente encapsuladas. Si quisieras, podríamos detenernos aquí. Incluso podría utilizar una puerta de enlace comercial, pero sin utilizar LoRaWAN, las tramas no podrían enviarse a corredores como The Things Network. Por ejemplo, si ejecuta una puerta de enlace Raspberry Pi, puede aceptar cualquier marco LoRa antiguo que desee, pero llevamos esto un paso más allá al ayudar a que los paquetes se reenvíen a todo el mundo. LoRaWAN es un cifrado "de extremo a extremo", en el sentido de que ninguno de sus vecinos o puertas de enlace puede leer los mensajes. Sin embargo, es curioso: The Things Network PUEDE leer sus mensajes porque tienen las claves de cifrado.
Convenientemente, puede llamar GenerateLoRaWANPacket
en lib/lorawan_simple.h
que maneja toda la encapsulación requerida. ¡Simplemente use esta función para generar sus cuadros y transmitirlos!
Podemos transmitir estos mensajes. Fresco. Pero ahora, para recibirlos, necesitaremos dispositivos como LILYGO® T-Beam Meshtastic o una puerta de enlace como un MikroTik LR9. Esto último es realmente interesante porque hay miles de ellos instalados en todo el mundo y conectados a The Things Network. Eso significa que si transmitimos un paquete LoRaWAN con el formato adecuado al alcance del oído de una de esas puertas de enlace, ¡podemos obtener la trama en cualquier otra parte del planeta!
La configuración es bastante sencilla. Necesitas:
Nota
Solo nos centramos en tramas LoRa que restablecen los contadores de tramas; sin embargo, si puede almacenar la identificación del último paquete transmitido en una memoria flash no volátil dentro de su parte, puede evitar este paso. Sin esto, su dispositivo estará sujeto a ataques de repetición.
Nota
Si utiliza el MikroTik LR9, asegúrese de abrirlo físicamente y conectar la antena interna. De fábrica se envía conectado al puerto exterior.
¡Las relaciones públicas están abiertas si puedes resolver alguno de estos! Dediqué todo el tiempo que planeo dedicar a este proyecto antes de llegar aquí.
Específicamente para LoRa, las ondas se comportan muy bien y deberían poder crearse completamente con circuitos de temporizador sobre la marcha y no deberían necesitar ningún cálculo previo, pero aún no lo he logrado. Esto evitaría la necesidad de tener una mesa grande para que los chirridos se transmitan a un dispositivo.
También quiero intentar realizar este proyecto utilizando patrones de bits personalizados que se crean más fácilmente sobre la marcha. Además, dependiendo de los códigos exactos utilizados (posiblemente empleando tecnologías relacionadas con los códigos de oro), se podría incluso hacer posible la recepción de muchas señales con exactamente la misma codificación al mismo tiempo. Hacer esto haría que fuera bastante apropiado implementar "printf" en microcontroladores que puedan ser recibidos de forma inalámbrica por un SDR central con una sobrecarga de espacio (y rendimiento) de procesador muy baja.
Además, sería divertido agregar un filtro, o tal vez intentar construir un filtro en una PCB sin componentes.
Además, sería genial intentar construir un amplificador Clase C para la señal de 900MHz. ¡Esto sería genial porque podría ser eficiente, increíblemente barato y simple y también proporcionar hasta 10-20 dB de ganancia!
Las pruebas urbanas se realizaron el 23 de febrero de 2024, las suburbanas el 26 de febrero de 2022 y las pruebas rurales se realizaron el 27 de febrero de 2022.
Los rangos son rangos máximos. La operación confiable termina mucho antes.
Para TTGO Lora32, se agregó una antena de +3dBi. Para el MikroTik LR9, utilizó la antena interna.
Fecha | Remitente | Receptor | SF/CR | peso corporal | Nota | Rango | Promedio final RSSI/SNR | Base |
---|---|---|---|---|---|---|---|---|
2024-02-23 | CH32V203 | MicroTik LR9 | SF8/CR48 | 125 | Centro de Bellevue (urbano) | 435' 132m | -98 / -9 | Suelo |
2024-02-23 | CH32V203 | MicroTik LR9 | SF10/CR48 | 500 | Centro de Bellevue (urbano) | 435' 132m | -90 / -18 | Suelo |
2024-02-26 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Miramont Park (suburbano ligero + bosque) | >576' >176m | -134 / -12 | Suelo |
2024-02-26 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Inicio del sendero Poo Poo Point (rural) | >1117' >340m | -123 / -6 | Suelo |
2024-02-26 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Suburbio de Issaquah (+árboles claros) | 2200'669m | -133 / -10 | Suelo |
2024-02-27 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Antena más larga roja Meadowbrook (Rural) | 2220'677m | -135 / -13 | Zumbido |
2024-02-27 | CH32V203 | TTGO Lora32 | SF10/CR48 | 500 | Antena más larga roja Meadowbrook (Rural) | 1752'534m | -132 / -16 | Zumbido |
2024-02-27 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Meadowbrook (Rural) OVERVOLT 5V Rojo Antena más larga | 3996' 1218m | -131 / -12 | Zumbido |
2024-02-27 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Antena combinada VNA gris Meadowbrook (rural) | 2719'829m | -131 / -11 | Zumbido |
2024-02-27 | ESP8266 @ 80MHz | TTGO Lora32 | SF8/CR48 | 125 | Antena combinada VNA gris Meadowbrook (rural) | 2789'850m | -138 / -13 | Zumbido |
2024-02-27 | ESP8266 @ 173MHz | TTGO Lora32 | SF7/CR48 | 125 | Antena combinada VNA gris Meadowbrook (rural) | 2812'857m | -131 / -8 | Zumbido |
2024-02-27 | ESP32-S2 + Bitena | TTGO Lora32 | SF10/CR48 | 125 | Meadowbrook (Rural) (Nota 1) | 3428' 1044m | -137 / -13 | Suelo |
2024-02-27 | ESP32-S2 + Bitena | TTGO Lora32 | SF10/CR48 | 125 | Meadowbrook (Rural) Precipitación ligera | >4895' >1492m | -130 / -8 | Zumbido |
2024-02-27 | ESP32-S2 + Funtenna | TTGO Lora32 | SF10/CR48 | 125 | Meadow Brook (Rural) Precipitación ligera | 705'/215m | -139 / -15 | Zumbido |
2024-02-27 | ESP32-S2 + Bitena | TTGO Lora32 | SF10/CR48 | 125 | Snoqualmie Trail, parque para perros hasta Ribary Creek (rural) Precipitación ligera | 8460'/2580m | -141 / -16 | Zumbido |