1-Concept

La programmation d'un modèle par le pilote se fait avec un language confortable à écrire et mettre au point : micropython.
En principe tout ce projet est réalisé en micropython pour les microprocesseurs et python pour le processeur Linux.

Processeurs multiples
...

Plusieurs microprocesseurs sont utilisés dans un réseau qui transfère des 'paquets' . Ceci évite d'ajouter trop de fonctions à un seul microprocesseur, qui pourrait s'engorger.
Ce réseau est en étoile: un 'centre de tri' qui est relié à chaque microprocesseur par une communication série 8 bits.
Chaque fonction peut envoyer un message vers un autre fonction, ou plusieurs messages.
Chaque fonction est hébergée par un processeur, connu par le centre de tri.

Chaque message est un 'bytearray' dont le 1er byte identifie la fonction.

Un événement extérieur prend l'initiative:

  • le processeur qui lit les organes de commande envoie un message périodiquement au processeur de calcul qui envoie les signaux des servos vers le module d'émission
  • un message de télémétrie entre en format EX, il est transformé en variables 'python' et enregistré dans une base de données
  • le pilote (ou un aide) peut communiquer par deux à trois canaux
    • en cours de vol, les boutons de commande et une oreillette permettent de consulter la télémétrie, modifier tout paramètre
    • un browser se connecte au serveur wifi de l'émetteur et peut tout consulter ou modifier (même en vol mais il faut évidemment un copilote)
    • avec des boutons de commande un dialogue est affiché sur un petit écran collé à l'émetteur. J'ai des doutes sur l'utilité de ce canal de communication lorsqu'une communication par smartphone est disponible.

Organisation
...

Les processeurs sont:

  • 'T' le centre de tri des messages
  • 'S' = acquisition des organes de commandes , qui est en fait hébergé dans le processeur du centre de tri 'T'.
  • 'C' = calcul (transformer les positions des organes de commande en impulsion de servo). La périodicité est 10ms.
  • 'R' = transmission des impulsions de servo vers le module d'émission et aussi lecture de la télémétrie
  • 'U' interface utilisateur ici la fréquence des messages est faible

Transmission
...

concept variables<=>message<=>paquet<=>uart
...

variables
...

Tout programme manipule des variables. Python dispose de variables sont complexes (nombres, libellés ,listes, dictionnaires..éventuellement imbriqués)
Pour les transmettre sur une ligne de communication il faut les transformer en une suite de bytes .

avec JSON
...

On peut transformer une structure complexe de variables 'python' (dictionnaire, liste...) en chaîne de caractères avec JSON . Ensuite ceci est converti en bytearray avec encode(), ce qui est le format pour la trnsmission.
https://docs.micropython.org/en/latest/library/json.html

avec struct
...

Pour transformer une suite de variables de définition précise et de longueur connue(genre C) on peut utiliser struct ; VOIR https://docs.micropython.org/en/latest/library/struct.html

message
...

Le résultat est une suite de bytes (1 byte = 8bits)
Sa longueur est variable .
Le premier byte du message définit le destinataire du message (voir les codes 2-Fonctions )
Dans le format normal le message est transmis en un seul paquet, dont le premier byte est le code fonction.
Dans le format long le message est découpé en plusieurs paquets , d'une façon transparente à réaliser

paquet
...

Un paquet emballe ce message pour le faire circuler sur les lignes de transmission:

  • préfixe
    • un préambule de 2 bytes 06 85 qui marque le début du paquet
    • un byte avec la longueur du message, maximum 255
  • le message inclu dans ce paquet; longueur maximum 255 , y compris le code fonction
  • en suffixe un byte de contrôle, calculé à partir du message

Centre de tri : le processeur 'T'
...

Ce processeur qui est relié à chaque processeur de traitement par une voie de communication série ( une ligne TX et une ligne RX), réalisée avec des UART ou des PIO .
Une table définit pour chaque code 'fonction' quel est le processeur qui traite ce message(ceci permet une grande souplesse , par exemple dans la mise au point tout est testé dans 'U'=laptop)
Les messages entrants sont écrits dans une liste qui se remplit d'un côté et se vide de l'autre, mais en général la liste est vide et le message passe directement de l'entrée vers la sortie.
Remarque que si le message est long, les morceaux restent dans l'ordre
Une évolution captivante est la transmission Lora : également des paquets de 255 bytes mais sans fil et à grande distance. Un processeur est le récepteur, l'autre est l'émetteur.

Utilisation des deux cores
...

On utilise dans le centre de tri 'T' les deux 'core' (processeurs) du Raspberry Pico. Le nombre maximum de connections série est 6:

  • 2 par UART hardware
  • 4 par PIO (le pico comporte 2 blocs de PIO avec 4 statemachines chacun, une pour Rx et l'autre pour Tx)
core 1 = traitement des communications
...

Une boucle perpétuelle rapide démarre automatiquement à la mise sous tension, elle traite chaque byte disponible sur une voie d'entrée (RX) .
Le core 1 doit tout d'abord lire tous les messages entrants

  • lire chaque ligne d'entrée (Rx)
  • détecte le préambule ( début de message )
  • lire ensuite la longueur du message
  • lire le code fonction, qui définit la destination
  • écrire le paquet dans un buffer associé à la destination (quelques buffers sont alloués par destination)
    Vitesse de transmission : a été utilisée à 9600 Bauds et aussi à 460800 !
core 0 : gestion du boitier de l'émetteur
...

Ceci est principalement la lecture des ADC et DIO.

  • initialisation: gestion de l'alimentation : un bouton allume l'alimentation de l'émetteur
  • séquence d'allumage: ce processeur maintient l'alimentation
  • lecture des organes de commande et transfert vers 'C'
  • séquence d'arrêt réception d'un message de 'U' qui demande l'extinction.
    • mettre à jour les fichiers sur la carte SD et clôturer 'U'
    • couper toute l'alimentation

Autre microprocesseurs
...

Regrouper par processeur des fonctions qui ont des points communs.
Les microprocesseurs utilisés sont des Raspberry Pico , programmés en micropython. Toutefois on pourrait utiliser d'autres microprocesseurs ou C++ lorsqu'une solution toute faite est disponible.
Chaque microprocesseur est relié à une porte fixe du centre de tri, avec un UART (qui dispose d'un grand buffer d'entrée )
Le traitement dans chacun de ces 'autres' processeur est simplement une grande boucle, qui démarre a la mise sous tension

  • attendre un paquet entrant
  • le valider et l'abandonner en cas d'erreur.
  • exécuter la fonction associée au paquet. Au cours du traitement il y a une ou plusieurs messages à transmettre vers d'autres processeurs .
  • le format de chaque message est défini selon son code fonction
    • format normal : message unique encodé par JSON
    • format structure fixe : message unique encodé par 'struct', ce qui est assez compact

Processeur de calcul 'C'
...

Sa fonction principale est de traduire les organes de commande (ce que le pilote manipule) en position des gouvernes. Le retour d'information est seulement visuel : que fait l'avion !
La périodicité est sévère ( 10 ms) .
Tout ce qui est propre à un modèle est traité dans ce processeur
Il envoie vers 'U' les commandes du pilote qui sont destinées à un menu ou à des trim.

Processeur radio 'R'
...

Le programme est spécifique pour la liaison radio et est situé dans un boitier de transmission amovible. L'implémentation du protocole Jeti est très différente du protocole Lora
Pour le protocole JETI le signal PPM est généré directement par 'C', le processeur 'R' ne sert qu'à la télémétrie.
Boîtiers à réaliser:

  • JETI TU2 ou TU (je dispose de l'ancien module et je veux comparer TU/TU2 pour les anciens récepteurs). Pour la télémétrie, le module fournit une liaison half-duplex asynchrone 9 bits)
    • TU2: message en codification EX (le processeur R extrait le message EX qui est en 8 bits, le décode en un format python puis l'envoie à U qui devra le garder dans une base de données. Il peut envoyer certaines données au calcul , pour des fonctions 'assist'
    • TU et TU2: message en format jetibox (texte de 32 caractères également en 8 bits). Celui-ci est envoyé à U, du moins quand il change. Le processeur 'U' peut répondre avec une commande 'JetiBox'
  • ultérieurement Lora V9_Lora

Processeur U = interfaces avec l'utilisateur
...

Tout d'abord , une grande différence entre les processeurs est leur échelle de temps

  • 'C' a des temps de réponse courts, il traduit toutes les 10 ms la position des commandes en position de gouvernes.La durée du traitement est environ 5 ms.
  • 'U' a une échelle de temps humaine
  • 'R' a des besoins comme 'C' mais il doit respecter un protocole 'Jeti' ou autre.Le traitement de télémétrie consiste à transformer le jargon 'jeti' ou autre en mesures traitées par 'U'
Dialogue avec l'utilisateur
...

Il faut distinguer 2 ou 3 modes de communication(le mode LCD est optionnel, j'envisage un émetteur sans LCD )

Modecommandes du piloteRéponsesswitch
en voltrim de manche et boutonmessage dictésvol=haut
au soltrim de manche et boutonLCD plusieurs lignessvol=bas
browseréditer des fichiers de configurationtexte long, éventuellement plusieurs lignessvol=bas
Les commandes du dialogue
...

Le boitier dispose des 4 trims classiques , un trim sur un manche , un bouton de sélection.
Chaque trim se compose de deux boutons ( actionnés ensemble ils signifie un retour ou reset)
Le switch 'strim' définit l'utilisation des trims:

  • centre= utilisation normale
    • les trims sont affectés aux manches d'une façon standard
    • le trim de manche permet de choisir une sous-phase de vol.
    • Le bouton de sélection est une interrogation
  • en bas = le trim de manche permet de naviguer dans les menus et le bouton exécute l'action associée à la ligne de menu. Chaque trims est disponible pour modifier en vol un paramètre.
  • en haut =les 4 trims permettent de modifier 4 paramètres différents.
    Le switch svol distingue les modes vol ou sol
    - en mode sol la communication est visuelle
    - en mode vol les messages sont dictés
Fichiers
...

Une carte SD comporte tous les fichiers des modèles (programme et paramètres). Il faut échanger les fichiers entre la carte SD et le processeur qui traite les données du fichier.
Il comporte également le logging de la télémétrie et des messages d'erreur.
Ces fichiers sont accessibles au browser (du smartphone ou du pc).

Messages d'erreur
...

Si un des processeurs génère un message d'erreur, il faudrait le rediriger vers 'U' pour logging.
smission redondante et stabilisation
J'envisage une transmission Jeti complétée par une transmission Lora. La transmission Lora est en 900 mhz ou 2.4 ghz, a une portée très grande à la condition de comprimer le signal.
Pour comprimer on peut séparer

  • le calcul des organes de commande et des conditions de vol, fait dans le boitier de l'émetteur
  • transmettre seulement les modifications
  • le calcul des gouvernes, fait dans le récepteur
    Un microprocesseur compare les signaux du récepteur Jeti (R3 par exemple) et du récepteur Lora et choisit le meilleur signal.

En même temps ce microprocesseur lit le signal de capteurs Jeti (fonction expander) , ajoute les signaux de ses propres capteurs (en particulier gyro) et fournit ainsi un stabilisateur correct

  • roulis :il reçoit la valeur de consigne: le taux de rotation demandé par le pilote
  • tangage : plus complexe car ce manche commande deux variables : la rotation et la vitesse de vol