Interfacer une transmission LoRa avec ESP32Forth
publication: 2 février 2022 / mis à jour 11 janvier 2023
Appel à collaboration
Vous développez des montages, simples ou complexes avec ESP32 et ESP32forth.
Partagez-les ici sur ce site.
ESP32forth ne pourra se développer qu'avec la collaboration active de toutes les bonnes volontés.
Vos montages peuvent aider d'autres développeurs.
Les montages des autres développeurs peuvent vous aider.
Pour proposer un article ou un montage, cliquez ici
Environnement de développement requis
Pour gérer nos feux tricolores par l'intermédiaire des transmetteurs LoRa, il faut:
- utiliser strings management for ESP32forth
- avoir une version ESP32Forth avec gestion de la liaison série UART2
- disposer de deux cartes ESP32, chacune avec un transmetteur LoRa. Voir:
Paramétrage LoRa REYAX RYLR890, 3ème partie.
Notre programme de référence
Pour démontrer l'incroyable souplesse du langage FORTH, et plus particulièrement la
version ESP32Forth sur ESP32, on va reprendre le programme utilisé dans cet article:
Gérer un feu tricolore avec ESP32.
L'ennui, avec les définitions dans cet article, c'est que le contrôle des LEDs exploite les bornes GPIO de la liaison série. On déplace donc le branchement des LEDS comme ceci:
Listing complet du contrôle des LEDs: command Traffic Lights with LoRa
Voici la seule et unique adaptation de code qui est réalisée pour s'adapter au nouveau branchement des LEDs:
DEFINED? defPIN: invert [if] include /spiffs/defpin.txt [then] \ old code \ 2 defPIN: ledGREEN \ green LED on GPIO2 \ 21 defPIN: ledYELLOW \ yellow LED on GPIO21 \ 17 defPIN: ledRED \ red LED on GPIO17 \ new code 27 defPIN: ledGREEN \ green LED on GPIO2 26 defPIN: ledYELLOW \ yellow LED on GPIO21 25 defPIN: ledRED \ red LED on GPIO17
Notre code utilise le mot include
suivi du fichier à charger. Pour comprendre l'édition des fichiers dans
le dossier système spiffs, voir:
Visual editor: édition des fichiers sources dans ESP32forth
Voici les séquences de code en langage FORTH pour activer ou désactiver sélectivement chaque LED. Ces séquences sont exécutables depuis la fenêtre du terminal connecté à la carte ESP32:
LEDinit ledGREEN high \ set GREEN led on ledRED high \ set RED led on ledGREEN low \ set GREEN led off
Et ce sont ces séquences, et elles seules qui seront transmises et reçues par les transmetteurs LoRa. Voici le montage des LEDs et du transmetteur LoRa sur notre plaque d'essai nommée SLAV1:
Le programme coté transmetteur LoRa nommé BOSS
On va compléter le programme chargé des transmissions. On part de ce qui est décrit dans l'article Communication entre deux transmetteurs LoRa REYAX RYLR890
Listing complet du contrôle du transmetteur BOSS: LoRa transmission from BOSS to SLAVx
Le listing reprend les composants essentiels permettant une transmission LoRa depuis la carte ESP32 marquée BOSS.
On rajoute simplement quelques définitions simples pour exécuter à distance l'allumage et l'extinction des LEDs qui elles sont sur la carte marquée SLAV1:
\ 55 constant LoRaBOSS 39 constant LoRaSLAV1 \ 40 constant LoRaSLAV2 : toSLAV1 ( addr len -- ) emptyRX typeToLoRa LoRaSLAV1 ATsend typeToTerm ; : REDhigh ( -- ) s" LEDred high" toSLAV1 ; : REDlow ( -- ) s" LEDred low" toSLAV1 ; : YELLOWhigh ( -- ) s" ledYELLOW high" toSLAV1 ; : YELLOWlow ( -- ) s" ledYELLOW low" toSLAV1 ; : GREENhigh ( -- ) s" ledGREEN high" toSLAV1 ; : GREENlow ( -- ) s" ledGREEN low" toSLAV1 ;
On a volontairement créé une définition par commande, ce dans le but de faire au plus simple. Libre à vous de réaliser un moyen plus interactif. Ce n'est pas le but de cet article. Pour le moment, une fois la carte marquée BOSS branchée et le code compilé, si on veut transmettre une commande à SLAV1, on tape simplement dans le terminal:
serial2.init REDhigh
Ceci transmet le message LEDred high
vers SLAV1. La dernière
phase sera de faire exécuter cette commande comme si elle a été tapée depuis un
terminal connecté à SLAV1.
Réception et exécution des commandes FORTH par SLAVx
On résume: le transmetteur BOSS envoie un message, par exemple LEDred high
à destination du transmetteur SLAV1. Le transmetteur SLAV1 reçoit le message et exécute
RXdecode
pour stocker cette commande FORTH dans la variable alphanumérique RCVdata
.
x . . . . "LEDred high" . . . . . x | | +-----+-+ +-----+-+ | BOSS | | SLAV1 | +-------+ +-------+ | RXdecode +-----> RXdata: LEDred high
Exécution d'une commande reçue par LoRa
Dans notre schéma, nous avons deux cartes ESP32, chacune disposant d'un transmetteur LoRa:
- BOSS (adresse 55) qui transmet des commandes FORTH
- SLAV1 (adresse 39) qui reçoit ces commandes FORTH
La seule différence, avec des commandes FORTH entrées directement au clavier
du PC et transmises par le programme terminal connecté à SLAV1 concerne les
commandes transmises par LoRa et stockées dans RXdata
.
Comment exécuter ces commandes stockées dans RXdata
?
La réponse est consternante de simplicité:
RCVdata evaluate
Non...?
Si....!
Nous n'avons absolument besoin de rien d'autre POUR INTERFACER la transmission LoRa avec n'importe quel programme embarqué dans une carte ESP32!!!
Voici une définition sécurisée de cette interfaçage:
: RXinterface ( -- )
RCVdata ?dup if
evaluate
else
2drop
then
;
Voici quelques manipulations en FORTH pour tester cet interface:
LEDinit \ initialize GPIOs s" LEDred high" RCVdata $! RCVdata RXinterface \ turn RED led on s" LEDred low" RCVdata $! RCVdata RXinterface \ turn RED led off
Nous avons tenu notre promesse:
- agir depuis LoRa sur n'importe quel programme sans en changer une seule ligne de code.
Dans n'importe quelle carte ESP32, vous pourrez compiler et tester facilement avec le terminal toutes les fonctionnalités de vos programmes.
Pour interfacer ces programmes, il suffira ensuite de rajouter la couche de transmission LoRa et son code d'interfaçage.
Le transmetteur distant n'aura plus qu'à envoyer des commandes FORTH pour agir sur vos programmes.
Seul le langage FORTH permet un interface transmission -> application aussi simple!
Voyons maintenant le dernier point: lire régulièrement le tampon de réception du transmetteur LoRa....
Boucle de gestion des transmissions LoRa
Le transmetteur LoRa est connecté au port série UART2. Quand une transmission est
reçue, le mot Serial2.available
indique le nombre d'octets en attente
dans le tampon série de UART2. S'il n'y a pas de transmission, la valeur remontée par
Serial2.available
sera nulle. Voici le code pour tester la présence de
caractères reçus par UART2:
Serial \ final loop : LoRaLoop ( -- ) begin Serial2.available \ not 0 if chars availalble if 100 ms \ ensures that the entire transmission is received LoRaRX maxlen$ nip Serial2.readBytes LoRaRX drop cell - ! RXdecode \ analyse content of LoRa message RXinterface \ interpret content or RCVdata then pause \ skip to next task again ;
On est presque au bout.... patience!
Le code de LoRaLoop
utilise une boucle infinie. Il est déconseillé
d'exécuter ce mot tel quel. Si vous le faites, vous n'aurez plus la main sur
l'interpréteur FORTH de ESP32Forth.
Pour utiliser LoRaLoop
sans bloquer l'interpréteur FORTH, nous allons
définir une nouvelle tâche my-loop
comme ceci:
' LoRaLoop 100 100 task my-loop my-loop start-task
A partir de ce moment, toute transmission effectuée depuis la carte marquée BOSS sera interprétée sur cette carte marquée SLAV1.
Pour que toute notre programmation reste persistante dans notre carte SLAV1, on finalise l'initialisation générale:
\ 115200 speed communication for LoRa REYAX 115200 value #SERIAL2_RATE Serial : mainInit ( -- ) cr ." Starting SLAV1 LoRa" cr LEDinit #SERIAL2_RATE Serial2.begin \ initialise Serial2 my-loop start-task ; startup: mainInit
A compter de cet instant, une fois le programme compilé dans la carte ESP32 marquée
SLAV1, au redémarrage de la carte, le mot mainInit
sera exécuté, ce que
confirme le message Starting SLAV1 LoRa qui doit normalement s'afficher.
Voici en photo les actions exécutées depuis la carte BOSS, incrustation en bas à gauche:
Sur la carte marquée SLAV1, Les LEDs réagissent avec une latence de une à deux secondes. Ce délai est normal. Il résulte du protocole LoRa qui est certes lent, mais extrêmement robuste. Sur la photo ci-dessus, les tests ont été effectués avec une distance de un mètre. Les cartes BOSS et SLAV1 ont été rapprochées pour la photo.
Des tests de transmission longue distance sont prévus. Ce sera l'objet d'un autre article.
Listing complet: Interface LoRa with other ESP32Forth application
Si vous laissez SLAV1 connecté au terminal, vous aurez toujours la main sur l'interpréteur FORTH.
Là aussi, c'est normal! Le mot LoRaLoop
s'exécute en multi-tâche.
Depuis ses origines, le langage FORTH est multi-tâche. Il l'était déjà sur des versions sous MS-DOS quand MS-DOS n'était pas multi-tâche.
Avec ESP32Forth, nous restons dans la continuité des fonctionnalités de FORTH, dont justement les possibilités
d'activer des tâches concurrentes. Dans notre cas précis, la tâche moniteur vous laisse la main
sur l'interpréteur tout en gérant les LEDs depuis la tâche LoRaLoop
.
Legal: site web personnel sans commerce / personal site without seling