Transmettez des trames LoRa à 900 MHz étonnamment loin sans radio (et d'autres manigances radio utilisant des ADC, des PWM et des bus I2S/SPI), y compris l'envoi d'autres données RF, ainsi que la réception de signaux RF (bien que ce ne soit certes pas un récepteur LoRa).
Si vous recherchez la conférence radio sur les microcontrôleurs Hackaday 2024, vous pouvez cliquer ici.
Si vous recherchez des produits LoLRa (comme des t-shirts, etc.), cliquez ici.
Note
Prudence
Parce que nous nous appuyons sur les harmoniques et le repliement, les principales composantes de fréquence émises par votre microcontrôleur se trouveront dans des parties du spectre RF où les transmissions RF sont interdites. Veuillez filtrer votre sortie ou effectuer vos tests dans une zone où il est peu probable qu'il y ait une fuite RF importante. La sortie EIRP globale est généralement ≪ 300 uW sur l'ensemble du spectre réparti sur des centaines de fréquences d'émission, mais il est pratiquement impossible qu'un appareil transmettant délibérément sur ces fréquences puisse jamais satisfaire à la conformité à la partie 15 de la FCC, même avec filtrage.
J'ai toujours été fasciné par l'envoi et la réception de signaux radio à partir de microcontrôleurs ne disposant pas de matériel radio dédié. Ce référentiel sert d'aperçu de nombreux projets que j'ai réalisés pour effectuer ce décodage, ainsi que d'exemples de code (bien que certains d'entre eux soient sous licence restrictive)
En général, le dépôt est divisé en plusieurs projets, mais classés par type d'appareil.
Transmission LoRa uniquement par micrologiciel, pour une variété de processeurs. Envoyez des paquets LoRa, sans aucune radio, puce, matériel externe ou radio intégrée, sur une variété de processeurs courants et peu coûteux. Bien qu'il ne s'agisse pas vraiment d'un bit banging, ce référentiel montre comment, en utilisant soit un registre à décalage (c'est-à-dire un port I2S ou SPI) ou un APLL, vous pouvez envoyer des paquets LoRa qui peuvent être décodés par des passerelles LoRa commerciales et d'autres puces.
Il existe deux modes principaux avec lesquels ce référentiel fonctionne.
Cliquez ci-dessous pour la version vidéo Youtube de cette page :
Chaque fois qu'un signal change d'état de bas en haut ou de haut en bas, une perturbation est créée dans les champs électromagnétiques entourant ce fil. À tout moment. La différence est : allez-vous, en tant qu'ingénieur, le craindre, l'étouffer en vous dandinant, avoir peur des interférences électromagnétiques qu'il pourrait provoquer, ou allez-vous attraper le taureau par les cornes et émettre des signaux artisanaux ? Les grands principes que vous devrez comprendre sont :
Le deuxième principe est le mixage des signaux. Si vous créez un signal, puis le « mélangez » avec une haute fréquence, vous obtenez une « image » enroulée autour de cette haute fréquence. Le mélange peut être effectué avec des diodes, un équipement RF spécial ou même simplement un échantillonnage, comme celui effectué à l'aide d'un registre à décalage, produisant des bits à un rythme constant.
Maintenant, la véritable magie opère lorsque vous réalisez que ces deux principes fonctionnent réellement ensemble. Vous obtenez une image sur la bande de base, une image réfléchie autour de la fréquence d'échantillonnage, puis autour de ×3 la fréquence d'échantillonnage, vous obtenez 2 autres images, l'avant et l'arrière. Et ×5, et ×7, etc.
Avec cela, avec une horloge suffisamment précise, nous pouvons générer arbitrairement n'importe quelle fréquence que nous souhaitons, à condition qu'il reste suffisamment de bande passante sur le GPIO de notre micro pour le générer, même si le signal "réel" que nous générons est beaucoup plus faible en fréquence. .
Les oscillateurs internes des microcontrôleurs sont non seulement inexacts, mais ils tremblent également en fréquence. Vous pourriez penser que c'est négatif, mais en fait, l'utilisation de l'oscillateur interne intégré aux micros peut souvent vous sauver la vie, vous permettant de dépasser les EMI/EMC. Parce que les oscillateurs internes ne sont pas seulement imprécis mais instables, ils empêchent les harmoniques des fréquences individuelles plus élevées dans le spectre parce que la fréquence d'horloge dérive si fortement.
Sortie cristal :
Sortie RC :
Consultez la section ci-dessous pour en savoir plus sur le fonctionnement réel des signaux LoRa ou sur des choses qu'aucun des autres docteurs sur Internet n'a jamais voulu vous en dire.
LoRa fonctionne généralement dans le spectre de 433 MHz ou de 900 MHz, généralement avec des canaux de 125 kHz. En principe, LoRa crée des gazouillis, commençant à une fréquence, 62,5 kHz en dessous du centre du canal, puis sur une courte période (1,024 µS à SF7), la tonalité monte jusqu'à 62,5 kHz au-dessus du centre du canal.
Bien que LoRa puisse être utilisé avec de nombreuses largeurs de canal différentes, 125 kHz et 500 kHz sont tous deux très bien pris en charge, alors que les autres largeurs de canal ne sont pas configurables avec des routeurs comme le LR9.
Ce diagramme montre la fréquence sur l'axe X et le temps sur l'axe Y (de haut en bas)... Vous pouvez voir :
Idéalement, la fenêtre pour un gazouillis donné est stable en fonction du facteur d'étalement. Pour le paquet ci-dessus, avec SF7, cela équivaut à 1 024 us par symbole, ou pour SF8, à 2 048 us par symbole. Chaque symbole/chirp peut représenter un certain nombre de bits, par un déphasage.
La "phase" brute d'un chirp est codée en gris afin de mieux répartir l'erreur binaire entre les bits vers les couches supérieures du processus. Par exemple, si vous êtes décalé par rapport à la phase à laquelle vous pensez que le gazouillis se trouve, il pourrait dépasser une limite comprise par exemple entre 0b1111 et 0b10000 et provoquerait des erreurs de 5 bits. En le codant en gris, il minimise les erreurs de bits créées par un décalage d'une ou même de quelques phases.
Une fois que ce flux binaire brut est décodé à partir des gazouillis individuels et codé en gris (voir encodeHamming84sx
) dans LoRa-SDR-Code.h
, nous transposons/entrelacons les bits afin que tout symbole qui pourrait être supprimé (voir diagonalInterleaveSx
) pour répartissez toutes les erreurs afin qu'un seul symbole perdu puisse être récupéré et blanchi (je pense que c'est en fait une étape sans valeur dans ce protocole, corrigez-moi si je me trompe) voir Sx1272ComputeWhitening
. Au-dessus du blanchiment se trouve une couche de correction d'erreurs pour aider à corriger les erreurs binaires qui pourraient survenir au niveau d'une couche inférieure (voir encodeFec
).
Globalement, les messages ont un en-tête et une charge utile. Notez que cela peut être un peu délicat, car l'en-tête utilise parfois des paramètres d'encodage différents de ceux de la charge utile. Et c'est tout.
Une fois que vous avez généré des paquets correctement formatés, vous pouvez les coder en gazouillis et les transmettre par câble.
Une vue plus détaillée du protocole peut être trouvée ici, pour une vue plus académique et ici pour de meilleurs exemples (bien que j'ai trouvé quelques problèmes avec l'exactitude/clarté des deux documents).
J'ai commencé le projet avec un ESP32-S2 pour voir si je pouvais émettre un signal en utilisant l'APLL interne intégré et acheminer l'horloge APLL/2 via l'IOMUX, et la réponse était que je le pouvais. Parce que cela génère une simple onde carrée et que les ondes carrées ont des harmoniques à F×3, F×5, F×7, etc... dans le spectre, si je règle l'APLL sur 139,06 MHz, elle produit 69,53 MHz. La 13ème harmonique est de 903,9 MHz, soit le premier canal LoRa de 125 kHz. Ensuite, en réglant les bits de contrôle PLL les moins significatifs, nous pouvons le régler de 903,9 MHz - 62,5 kHz à 903,9 + 62,5 kHz, en réglant l'APLL de 139,06 MHz - 9,62 kHz à 139,06 MHz + 9,62 kHz. Cela nous permet de générer les gazouillis caractéristiques de LoRa et en effet, c'est recevable !
L'ESP32-S2 a également une autre astuce : le multiplexeur GPIO est capable de produire un signal ou l'inverse de ce signal. De cette façon, nous pouvons créer différentiellement le signal de 139,06 MHz, augmentant ainsi la puissance de sortie de 3 dB !
Il y a cependant des problèmes avec l'ESP32-S2. Notamment que :
De plus, très peu de processeurs disposent d'un APLL, donc malgré ce succès rapide, j'ai décidé de passer à autre chose...
Il y a plusieurs années, j'ai réalisé un certain nombre de projets utilisant la synthèse directe de flux binaires pour faire certaines choses, comme la diffusion de télévision RF Color NTSC sur le canal 3 avec un ESP8266 ou l'utilisation de paquets Ethernet pour transmettre la radio AM. L'une des astuces intéressantes est que si vous transmettez un flux binaire sur un registre à décalage SPI ou I2S, cela provoque un alias à la fréquence d'échantillonnage, avec des images à F×3, F×5, F×7, etc. en partie, il préserve la taille/forme de la forme d'onde transmise au niveau des images/alias sur le spectre. Pour le canal 3, le signal de 65 MHz était réfléchi autour du taux d'échantillonnage de 40 MHz. Harry Nyquist peut aller croquer un citron.
Cette technique donne une fidélité incroyable même dans des situations extrêmement mauvaises, de manière non intuitive. Vous pouvez créer des signaux étonnamment précis à l’extérieur, partout où vous les attendez.
Il existe plusieurs façons d'y parvenir, mais le plus simple est généralement d'utiliser un registre à décalage. Un registre à décalage comme celui d'un bus I2S ou SPI. Et, si vous utilisez DMA, vous pouvez facilement alimenter le registre à décalage avec plus de données sans réveiller le processeur à chaque cycle. Il existe cependant d'autres moyens, comme basculer directement une E/S ou utiliser une minuterie pour activer et désactiver une E/S au bon moment, mais il est plus simple d'écrire du code pour générer un flux binaire et le déplacer.
Pour les registres à décalage, quelques considérations doivent être prises en compte, comme s'assurer que le boutisme, les largeurs de bits et les dispositions de mémoire sont corrects, mais, en général, vous pouvez suivre le rythme, et à moins qu'il n'y ait un décalage, comme le temps entre chaque mot, ils sont généralement capables de représenter assez fidèlement un modèle de bits sur la sortie pour être transféré et décalé hors d'une broche.
Le "lohrcut" décrit dans la vidéo consiste à écrire une fonction qui, à un instant donné, détermine l'amplitude d'un signal. Cette fonction peut consister à déterminer l'amplitude d'un signal à très haute fréquence, puis la fréquence d'échantillonnage peut être n'importe quelle fréquence d'échantillonnage physiquement réalisable et disponible. Cela créera une image du signal haute fréquence à un signal de fréquence beaucoup plus basse, en le construisant à partir d'une puissance comprise entre 0 et Fs/2.
Un autre souci est le flash, sur certains systèmes les accès sont incohérents ou ne fonctionnent pas bien à certaines fréquences. Dans ces cas-là, comme sur l'ESP8266, les tables doivent être lues dans la RAM et jouées à partir de là.
Les trames LoRa sont totalement encapsulées. Si tu voulais, on pourrait s'arrêter ici. Vous pouvez même utiliser une passerelle commerciale, mais sans utiliser LoRaWAN, les trames ne pourraient pas être envoyées à des courtiers comme The Things Network. Par exemple, si vous utilisez une passerelle Raspberry Pi, vous pouvez simplement accepter les anciennes trames LoRa de votre choix, mais nous sommes allés encore plus loin en aidant les paquets à être transférés dans le monde entier. LoRaWAN est un cryptage « de bout en bout », dans le sens où aucun de vos voisins ou passerelles ne peut lire les messages. Cependant, c'est curieux : The Things Network PEUT lire vos messages car ils disposent des clés de cryptage.
Idéalement, vous pouvez appeler GenerateLoRaWANPacket
dans lib/lorawan_simple.h
qui gère toute l'encapsulation requise. Utilisez simplement cette fonction pour générer vos frames, et les diffuser !
Nous pouvons transmettre ces messages. Cool. Mais désormais, pour les recevoir, nous aurons besoin soit d'un appareil comme un LILYGO® T-Beam Meshtastic, soit d'une passerelle comme un MikroTik LR9. Ce dernier est vraiment intéressant ici car il en existe des milliers installés partout dans le monde, et connectés à The Things Network. Cela signifie que si nous transmettons un paquet LoRaWAN correctement formaté à portée de voix de l’une de ces passerelles, nous pouvons obtenir la trame ailleurs sur la planète !
La configuration est assez simple. Vous devez:
Note
Nous nous concentrons uniquement sur les trames LoRa qui réinitialisent les compteurs de trames. Cependant, si vous pouvez stocker le dernier identifiant de paquet transmis dans une mémoire flash non volatile dans votre pièce, vous pouvez éviter cette étape. Sans cela, votre appareil sera soumis à des attaques par rejeu.
Note
Si vous utilisez le MikroTik LR9, assurez-vous de l'ouvrir physiquement et de brancher l'antenne interne. Depuis l'usine, il est expédié connecté au port extérieur.
Les relations publiques sont ouvertes si vous parvenez à comprendre l'un d'entre eux ! Je viens de consacrer tout le temps que je prévois de consacrer à ce projet avant d'arriver ici.
Pour LoRa en particulier, les vagues se comportent très bien et devraient être entièrement créables avec des circuits de minuterie à la volée et ne devraient nécessiter aucun précalcul, mais je n'y suis pas encore parvenu. Cela éliminerait la nécessité d’avoir une grande table pour les gazouillis flashés dans un appareil.
Je souhaite également essayer de réaliser ce projet en utilisant des modèles de bits sur mesure qui sont plus facilement créés à la volée. De plus, en fonction des codes exacts utilisés (éventuellement en employant des technologies liées aux codes d'or), on pourrait même rendre possible la réception simultanée de plusieurs signaux avec exactement le même codage. Cela rendrait tout à fait approprié l'implémentation de "printf" sur des microcontrôleurs qui peuvent être reçus sans fil par un SDR central avec une très faible surcharge d'espace processeur (et de performances).
De plus, ce serait amusant d'ajouter un filtre, ou peut-être d'essayer d'intégrer un filtre dans un PCB sans composants.
De plus, ce serait très cool d'essayer de construire un amplificateur de classe C pour le signal 900 MHz. Ce serait très cool car cela pourrait être efficace, incroyablement bon marché et simple et fournir également jusqu'à 10 à 20 dB de gain !
Les tests urbains ont été effectués le 2024-02-23, les tests suburbains le 2022-02-26 et les tests ruraux ont été effectués le 2022-02-27.
Les plages sont des plages de pointe. Un fonctionnement fiable se termine beaucoup plus tôt.
Pour TTGO Lora32, une antenne +3dBi a été ajoutée. Pour le MikroTik LR9, il a utilisé l'antenne interne.
Date | Expéditeur | Récepteur | SF/CR | PC | Note | Gamme | Moyenne fin RSSI/SNR | Base |
---|---|---|---|---|---|---|---|---|
2024-02-23 | CH32V203 | MicroTik LR9 | SF8/CR48 | 125 | Centre-ville de Bellevue (Urbain) | 435' 132m | -98 / -9 | Sol |
2024-02-23 | CH32V203 | MicroTik LR9 | SF10/CR48 | 500 | Centre-ville de Bellevue (Urbain) | 435' 132m | -90 / -18 | Sol |
2024-02-26 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Parc Miramont (banlieue légère + bois) | >576' >176m | -134 / -12 | Sol |
2024-02-26 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Début du sentier Poo Poo Point (rural) | >1117' >340m | -123 / -6 | Sol |
2024-02-26 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Banlieue d'Issaquah (+Arbres lumineux) | 2200' 669m | -133 / -10 | Sol |
2024-02-27 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Antenne rouge plus longue Meadowbrook (Rural) | 2220' 677m | -135 / -13 | Drone |
2024-02-27 | CH32V203 | TTGO Lora32 | SF10/CR48 | 500 | Antenne rouge plus longue Meadowbrook (Rural) | 1752' 534m | -132 / -16 | Drone |
2024-02-27 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Antenne plus longue rouge Meadowbrook (Rural) OVERVOLT 5V | 3996' 1218m | -131 / -12 | Drone |
2024-02-27 | CH32V203 | TTGO Lora32 | SF8/CR48 | 125 | Antenne assortie VNA grise Meadowbrook (Rural) | 2719' 829m | -131 / -11 | Drone |
2024-02-27 | ESP8266 à 80 MHz | TTGO Lora32 | SF8/CR48 | 125 | Antenne assortie VNA grise Meadowbrook (Rural) | 2789' 850m | -138 / -13 | Drone |
2024-02-27 | ESP8266 à 173 MHz | TTGO Lora32 | SF7/CR48 | 125 | Antenne assortie VNA grise Meadowbrook (Rural) | 2812' 857m | -131 / -8 | Drone |
2024-02-27 | ESP32-S2 + Bitenne | TTGO Lora32 | SF10/CR48 | 125 | Meadowbrook (Rural) (Note 1) | 3428' 1044m | -137 / -13 | Sol |
2024-02-27 | ESP32-S2 + Bitenne | TTGO Lora32 | SF10/CR48 | 125 | Précipitations légères à Meadowbrook (rural) | >4895' >1492m | -130 / -8 | Drone |
2024-02-27 | ESP32-S2 + Funtenne | TTGO Lora32 | SF10/CR48 | 125 | Ruisseau Meadow (Rural) Légère Précipitation | 705' / 215m | -139 / -15 | Drone |
2024-02-27 | ESP32-S2 + Bitenne | TTGO Lora32 | SF10/CR48 | 125 | Sentier Snoqualmie, du parc pour chiens au ruisseau Ribary (rural) Percipitation lumineuse | 8460' / 2580m | -141 / -16 | Drone |