Autres articles / Other articles

Interfacer une transmission LoRa avec ESP32Forth

publication: 2 février 2022 / mis à jour 11 janvier 2023

Read this page in english

 

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:

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:

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