Transmita quadros LoRa de 900 MHz surpreendentemente longe sem um rádio (e outras travessuras de rádio usando ADCs, PWMs e barramentos I2S/SPI), incluindo o envio de outros dados de RF, bem como o recebimento de sinais de RF (embora reconhecidamente não seja um receptor LoRa).
Se você está procurando a palestra de rádio do microcontrolador Hackaday 2024, você pode clicar aqui.
Se você está procurando LoLRa Merch (como camisetas, etc.), clique aqui.
Observação
Cuidado
Como contamos com harmônicos e aliasing, os principais componentes de frequência emitidos pelo seu microcontrolador estarão em partes do espectro de RF onde as transmissões de RF são proibidas. Filtre sua saída ou realize seus testes em uma área onde é improvável que haja vazamento significativo de RF. A saída EIRP geral é geralmente ≪300uW em todo o espectro espalhado por centenas de frequências de emissão, mas praticamente não há como um dispositivo transmitindo deliberadamente nessas frequências passar pela conformidade com a parte 15 da FCC, mesmo com filtragem.
Sempre fui fascinado por enviar e receber sinais de rádio de microcontroladores que não possuem hardware de rádio dedicado. Este repositório serve como uma visão geral de muitos dos projetos que fiz para fazer essa decodificação, junto com código de exemplo (embora alguns deles sejam licenciados de forma restritiva)
Em geral, o repositório é dividido em vários projetos, mas categorizado por tipo de dispositivo.
Transmissão LoRa somente firmware, para uma variedade de processadores. Envie pacotes LoRa, sem qualquer rádio, chips, hardware externo ou rádios integrados em uma variedade de processadores comuns e baratos. Embora não seja realmente complicado, este repositório mostra como usar um registro de deslocamento (ou seja, porta I2S ou SPI) ou um APLL, você pode enviar pacotes LoRa que podem ser decodificados por gateways LoRa comerciais prontos para uso e outros chips.
Existem dois modos principais com os quais este repositório funciona.
Clique abaixo para ver a versão em vídeo do Youtube desta página:
Sempre que um sinal muda de estado de baixo para alto ou de alto para baixo, uma perturbação é criada nos campos eletromagnéticos que cercam esse fio. A qualquer momento. A diferença é: você, como engenheiro, vai temê-lo, esmagando-o, tendo medo de qualquer EMI que ele possa causar, ou vai agarrar o touro pelos chifres e emitir alguns sinais artesanais? Os principais princípios que você precisa entender são:
O segundo princípio é a mixagem de sinais. Se você criar um sinal e então "misturá-lo" com uma alta frequência, obterá uma "imagem" envolvida em torno dessa alta frequência. A mixagem pode ser feita com diodos, equipamentos especiais de RF ou até mesmo apenas amostragem, como aquela feita com um registrador de deslocamento, gerando bits em uma taxa constante.
Agora a verdadeira magia acontece quando você percebe que esses dois princípios realmente funcionam juntos. Você obtém uma imagem na banda base, uma imagem refletida em torno da frequência de amostragem e, em seguida, em torno de ×3 da frequência de amostragem, obtém outras 2 imagens, a direta e a reversa. E ×5 e ×7, etc.
Com isso, com um clock preciso o suficiente, podemos gerar arbitrariamente qualquer frequência que desejarmos, desde que haja largura de banda suficiente no GPIO do nosso micro para gerá-lo, mesmo que o sinal "real" que estamos gerando tenha uma frequência muito menor. .
Os osciladores internos em microcontroladores não são apenas imprecisos, mas também oscilam em frequência. Você pode pensar que isso é negativo, mas na verdade, usar o oscilador interno embutido nos micros pode muitas vezes ser um salva-vidas, ajudando você a superar a EMI/EMC. Como os osciladores internos não são apenas imprecisos, mas também instáveis, eles evitam harmônicos de frequências individuais mais altas no espectro porque a frequência do clock varia muito.
Saída de cristal:
Saída RC:
Veja a seção abaixo para saber como os sinais LoRa realmente funcionam ou as coisas que nenhum dos outros PhDs na Internet jamais esteve disposto a lhe contar sobre isso.
LoRa normalmente opera no espectro de 433 MHz ou 900 MHz, geralmente com canais de 125 kHz. Em princípio, LoRa cria chilreios, começando em uma frequência, 62,5kHz abaixo do centro do canal, e depois, durante um curto período de tempo (1,024uS em SF7), o tom sobe até 62,5kHz acima do centro do canal.
Embora LoRa possa ser usado com muitas larguras de canal diferentes, 125kHz e 500kHz são ambos muito bem suportados, enquanto outras larguras de canal não são configuráveis com roteadores como o LR9.
Este diagrama mostra a frequência no eixo X e o tempo no eixo Y (de cima para baixo)... Você pode ver:
Convenientemente, a janela para um determinado chirp é estável dependendo do fator de propagação. Para o pacote acima, com SF7, resulta em 1.024us por símbolo, ou para SF8, 2.048us por símbolo. Cada símbolo/chirp pode representar um número de bits, por um deslocamento de fase.
A "fase" bruta de um chirp é codificada em cinza para melhor distribuir o erro de bit entre os bits para as camadas superiores do processo. Por exemplo, se você estiver errado em relação à fase em que acredita que o chirp está, ele pode ultrapassar o limite de, digamos, 0b1111 e 0b10000 e causar erros de 5 bits. Ao codificá-lo em cinza, ele minimiza os erros de bits criados por uma fase off-by-one ou mesmo por algumas fases.
Depois que esse fluxo de bits bruto é decodificado a partir dos chirps individuais e codificado em cinza (consulte encodeHamming84sx
) em LoRa-SDR-Code.h
, então transpomos/intercalamos os bits para que qualquer símbolo que possa ser retirado (consulte diagonalInterleaveSx
) para espalhe quaisquer erros para que um único símbolo perdido possa ser recuperado e embranquecido (acredito que esta é realmente uma etapa inútil neste protocolo, corrija-me se estiver errado) veja Sx1272ComputeWhitening
. Acima do branqueamento há uma camada de correção de erros para ajudar a corrigir qualquer erro de bit que possa acontecer em uma camada inferior (consulte encodeFec
).
No geral, as mensagens têm um cabeçalho e uma carga útil. Observe que isso pode ser um pouco complicado, porque o cabeçalho às vezes usa configurações de codificação diferentes da carga útil. E é isso.
Depois de gerar pacotes formatados corretamente, você pode codificá-los em chilreios e transmiti-los pela rede.
Uma visão mais detalhada do protocolo pode ser encontrada aqui, para uma visão mais acadêmica e aqui para alguns exemplos melhores (embora eu tenha encontrado alguns problemas com a correção/claridade de ambos os documentos).
Comecei o projeto com um ESP32-S2 para ver se conseguia emitir um sinal usando o APLL interno integrado e rotear o relógio APLL/2 por meio do IOMUX, e a resposta foi que sim. Como isso gera uma onda quadrada simples, e as ondas quadradas têm harmônicos em F×3, F×5, F×7, etc... no espectro, se eu definir o APLL para 139,06 MHz, ele produzirá 69,53 MHz. O 13º harmônico é 903,9 MHz, ou o primeiro canal LoRa de 125kHz. Então, ajustando os bits de controle PLL menos significativos, podemos ajustá-lo de 903,9 MHz - 62,5 kHz para 903,9 + 62,5 kHz, ajustando o APLL para 139,06 MHz - 9,62 kHz para 139,06 MHz + 9,62 kHz. Isso nos permite gerar os chilreios característicos do LoRa e, de fato, isso é recebível!
O ESP32-S2 também tem outro truque – o GPIO mux é capaz de emitir um sinal ou o inverso desse sinal. Dessa forma podemos criar diferencialmente o sinal de 139,06 MHz, aumentando a potência de saída em 3dB!
Existem problemas com o ESP32-S2, entretanto. Notavelmente que:
Além disso, poucos processadores possuem um APLL, então, apesar desse rápido sucesso, decidi seguir em frente...
Vários anos atrás, fiz vários projetos que usavam síntese direta de fluxo de bits para fazer algumas coisas, como transmitir televisão RF colorida NTSC no canal 3 com um ESP8266 ou usar pacotes Ethernet para transmitir rádio AM. Um dos truques legais é que, se você transmitir um fluxo de bits em um registrador de deslocamento SPI ou I2S, isso causará aliasing na taxa de amostragem, com imagens em F×3, F×5, F×7, etc. parte é que preserva o tamanho/forma da forma de onda transmitida em imagens/aliases no espectro. Para o Canal 3, o sinal de 65 MHz estava sendo refletido em torno da taxa de amostragem de 40 MHz. Harry Nyquist pode ir morder um limão.
Essa técnica oferece uma fidelidade incrível, mesmo em situações extremamente ruins, de forma não intuitiva. Você pode criar sinais surpreendentemente precisos fora de qualquer lugar que você esperaria.
Existem várias maneiras de fazer isso, mas normalmente é mais fácil com um registrador de deslocamento. Um registrador de deslocamento como esse em um barramento I2S ou SPI. E, se você usar DMA, poderá facilmente alimentar o registrador de deslocamento com mais dados sem ativar a CPU a cada ciclo. Existem outras maneiras, porém, como alternar diretamente um IO ou usar um temporizador para ligar e desligar um IO no momento certo, mas é mais fácil escrever código para gerar um fluxo de bits e deslocá-lo.
Para registradores de deslocamento, algumas considerações devem ser feitas, como garantir que o endianismo, as larguras de bits e os arranjos de memória estejam corretos, mas, em geral, você pode acompanhar e, a menos que haja atraso, como o tempo entre cada palavra, eles normalmente são capazes de representar com fidelidade suficiente um padrão de bits na saída a ser transferido e deslocado para fora de um pino.
O “lohrcut” descrito no vídeo envolve escrever uma função que, dado um momento, determina a amplitude de um sinal. Esta função pode ser para determinar a amplitude de um sinal de frequência muito alta; então, a taxa de amostragem pode ser qualquer taxa de amostragem fisicamente realizável que esteja disponível. Isto criará uma imagem do sinal de alta frequência em um sinal de frequência muito mais baixa, construindo-o com potência entre 0 e Fs/2.
Outra preocupação é o flash, em alguns sistemas acessa de forma inconsistente ou não funciona bem em determinadas frequências. Nesses casos, como no ESP8266, as tabelas devem ser lidas na RAM e reproduzidas a partir daí.
Os quadros LoRa são totalmente encapsulados. Se você quisesse, poderíamos parar por aqui. Você poderia até usar um gateway comercial, mas sem usar LoRaWAN, os frames não poderiam ser enviados para corretoras como a The Things Network. Por exemplo, se você executasse um gateway Raspberry Pi, poderia simplesmente aceitar quaisquer quadros LoRa antigos que desejasse, mas demos um passo adiante, ajudando os pacotes a serem encaminhados ao redor do mundo. LoRaWAN é criptografia “ponta a ponta”, pois nenhum de seus vizinhos ou gateways pode ler as mensagens. Porém, é curioso - The Things Network PODE ler suas mensagens porque elas possuem as chaves de criptografia.
Convenientemente, você pode ligar, GenerateLoRaWANPacket
em lib/lorawan_simple.h
lida com todo o encapsulamento necessário. Basta usar esta função para gerar seus frames e transmiti-los!
Podemos transmitir essas mensagens. Legal. Mas agora, para recebê-los, precisaremos de dispositivos como o LILYGO® T-Beam Meshtastic ou de um gateway como o MikroTik LR9. Este último é realmente interessante aqui porque existem milhares deles configurados em todo o mundo e conectados à The Things Network. Isso significa que se transmitirmos um pacote LoRaWAN devidamente formatado ao alcance da voz de um desses gateways, poderemos obter o quadro em outro lugar do planeta!
A configuração é bastante simples. Você precisa:
Observação
Nós nos concentramos apenas em quadros LoRa que redefinem os contadores de quadros; no entanto, se você puder armazenar o último ID do pacote transmitido em flash não volátil em sua parte, poderá evitar esta etapa. Sem isso, seu dispositivo estará sujeito a ataques de repetição.
Observação
Se estiver usando o MikroTik LR9, certifique-se de abri-lo fisicamente e conectar a antena interna. De fábrica, ele é enviado conectado à porta externa.
Os PRs estão abertos se você conseguir descobrir alguma dessas coisas! Passei todo o tempo que pretendo gastar neste projeto antes de chegar aqui.
Especificamente para LoRa, as ondas são muito bem comportadas e devem ser completamente criadas com circuitos de temporizador em tempo real e não devem precisar de nenhum pré-cálculo, mas ainda não consegui fazer isso. Isso dispensaria a necessidade de ter uma mesa grande para os chilreios inseridos em um dispositivo.
Quero também tentar executar este projeto usando padrões de bits personalizados que são criados mais facilmente na hora. Além disso, dependendo dos códigos exatos utilizados (possivelmente empregando tecnologias relacionadas aos códigos ouro), pode-se até tornar possível a recepção de muitos sinais com exatamente a mesma codificação simultaneamente. Fazer isso tornaria bastante apropriado implementar "printf" em microcontroladores que podem ser recebidos sem fio por um SDR central com sobrecarga de espaço (e desempenho) de processador muito baixa.
Além disso, seria divertido adicionar um filtro ou talvez tentar construir um filtro em uma PCB sem componentes.
Além disso, seria muito legal tentar construir um amplificador Classe C para o sinal de 900MHz. Isso seria muito legal porque poderia ser eficiente, incrivelmente barato e simples e também fornecer até 10-20dB de ganho!
Os testes urbanos foram realizados em 23/02/2024, os testes suburbanos em 26/02/2022 e os testes rurais foram realizados em 27/02/2022.
Os intervalos são intervalos de pico. A operação confiável termina muito mais cedo.
Para TTGO Lora32, foi adicionada uma antena de +3dBi. Para o MikroTik LR9, utilizou a antena interna.
Data | Remetente | Receptor | SF/CR | PN | Observação | Faixa | Média final de RSSI/SNR | Base |
---|---|---|---|---|---|---|---|---|
23/02/2024 | CH32V203 | MicroTik LR9 | SF8/CR48 | 125 | Centro de Bellevue (Urbano) | 435'132m | -98/-9 | Chão |
23/02/2024 | CH32V203 | MicroTik LR9 | SF10/CR48 | 500 | Centro de Bellevue (Urbano) | 435'132m | -90/-18 | Chão |
26/02/2024 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Parque Miramont (Suburbano Leve + Bosque) | >576' >176m | -134/-12 | Chão |
26/02/2024 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Trilha Poo Poo Point (Rural) | >1117' >340m | -123/-6 | Chão |
26/02/2024 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Subúrbio de Issaquah (+Árvores Claras) | 2.200' 669m | -133/-10 | Chão |
27/02/2024 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Antena mais longa vermelha Meadowbrook (rural) | 2220' 677m | -135/-13 | Drone |
27/02/2024 | CH32V203 | TTGO Lora32 | SF10/CR48 | 500 | Antena mais longa vermelha Meadowbrook (rural) | 1752' 534m | -132/-16 | Drone |
27/02/2024 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Meadowbrook (Rural) Antena mais longa vermelha OVERVOLT 5V | 3996' 1218m | -131/-12 | Drone |
27/02/2024 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Antena combinada VNA cinza Meadowbrook (rural) | 2719' 829m | -131/-11 | Drone |
27/02/2024 | ESP8266 a 80 MHz | TTGO Lora32 | SF8/CR48 | 125 | Antena combinada VNA cinza Meadowbrook (rural) | 2789' 850m | -138/-13 | Drone |
27/02/2024 | ESP8266 a 173 MHz | TTGO Lora32 | SF7/CR48 | 125 | Antena combinada VNA cinza Meadowbrook (rural) | 2812' 857m | -131/-8 | Drone |
27/02/2024 | ESP32-S2 + Bitena | TTGO Lora32 | SF10/CR48 | 125 | Meadowbrook (Rural) (Nota 1) | 3428' 1044m | -137/-13 | Chão |
27/02/2024 | ESP32-S2 + Bitena | TTGO Lora32 | SF10/CR48 | 125 | Precipitação leve de Meadowbrook (rural) | >4895' >1492m | -130/-8 | Drone |
27/02/2024 | ESP32-S2 + Funtenna | TTGO Lora32 | SF10/CR48 | 125 | Meadow Brook (Rural) Precipitação leve | 705'/215m | -139/-15 | Drone |
27/02/2024 | ESP32-S2 + Bitena | TTGO Lora32 | SF10/CR48 | 125 | Trilha Snoqualmie, Dog Park até Ribary Creek (Rural) Percipitação leve | 8460' / 2580m | -141/-16 | Drone |