Les codes opération 

Phases et Paramètres  
Opérations sur des variables numériques
Mélangeurs
Opérations sur des variables logiques
Exécution conditionnelle
Les chronomètres
Alarme au démarrage de l'émetteur
version V4:
    les messages visuels ou auditifs
    la télémétrie Jeti
    contrôle de l'identité du récepteur Jeti
    logging
    PID
Curseur digital
Trims
Voies de sortie (servos)

Syntaxe

Le fichier de commandes est un fichier texte, qui constitue la documentation du modèle.
Chaque ligne décrit une opération sur des variables . Elle comporte des arguments séparés par un ou plusieurs espace ou tabs.
Le cycle de calcul exécute ces opérations  de la première ligne à la dernière, plus de 50 fois par seconde.

On peut présenter ces arguments  en 3 colonnes:

-le nom de la  variable qui est modifiée par l'opération (quelques opérations ne modifient pas de variable )
-un code opération, exprimé par un code court
-un ou plusieurs noms de paramètre ou de variable, qui sont consultées par cette opération.

Toute nom de variable numérique peut être remplacée par une constante (chiffres et . décimal éventuel ou signe -,
par exemple 100 ,-50  0.05).


Certains codes opération prévoient un argument sous forme de texte.

Remarque:
Il faut savoir que ces définitions suivent deux règles :
1) la nature de la variable modifiée par un code opération est fixée pour chaque code
2) la nature des paramètres de l'opération est également définie



Caractères spéciaux

espace ou tab

séparateur des arguments

#

ce  qui suit le # est un commentaire

: ce signe est placé à la fin d'un nom de paramètre. 

Variables

Un nom de variable comporte quelques caractères (sans espace).

Les variables numériques prennent une valeur entre -100 et +100, avec au moins deux décimales. Une constante numérique peut comporter un point décimal et un signe -. L'affichage des variables se fait avec deux décimales.
Les voies de sortie sont également des variables numériques. Elles sont exprimées avec une précision de 1 microseconde
Les durées des chronomètres sont exprimées en minutes avec deux décimales, donc en 1/100ème de minute.

Les variables de télémétrie sont des variables numériques mais parfois elles ne sont pas disponibles. Dans ce cas leur valeur est fortement négative  ( - 125.00 = NOT_AVAILABLE)

Les variables logiques valent 0 ou 1.(0=faux 1=vrai)

Une variable est dans certains cas une chaîne de caractères entourée obligatoirement de guillemets (depuis V4) 

Les paramètres sont des constantes numériques, modifiables facilement sur l'émetteur. Certains sont modifiables en cours de vol.
Les paramètres ont un nom qui se termine obligatoirement par un double point (:)

Le nom d'un paramètre est composé de plusieurs parties séparées par un point. Cette structure hiérarchique est libre, mais recommandée pour la lisibilité du programme.
Ils sont conservés entre deux vols, lorsqu'on éteint l'émetteur.

Avant chaque cycle de calcul, les variables d'entrée sont lues,  les autres variables sont mises à zéro à l'exception des  paramètres qui gardent leur valeur.

Certaines variables "d'état" ne sont pas remises à zéro entre deux calculs. Le code opération HOLD définit ces variables.

Identification des variables

A titre d'exemple, voici les noms que j'ai utilisé
M1 à 4 = les 4 manches (analogiques).
@M1  droite avant/arr (+100 / -100)
@M2  droite gauche/droite (-100 / +100)
@M3  gauche avant/arr  (+100 / -100)
@M4  gauche gauche/droite (-100 / +100)
@C1 à ... = curseurs analogiques (avant=+100 arrière =-100)
@S1 à ... = interrupteurs  (variables logiques)
    pour un sw  à 3 positions, par exemple S4, le programme utilise 2 switches dont  les noms sont de la forme S4a et S4b
@B1.. sont des boutons à presser. Un bouton est VRAI pendant un seul cycle de calcul,
lorsqu'il a été pressé.
@V1..16  sont des voies de sortie, dont le nombre n'est limité que par le système de transmission. (variables est exprimée en µsec)
@Hx sont réservées au x chronos . HS et H1 sont deux variables logiques, @HT est le temps écoulé depuis le démarrage, en minutes et centièmes.



attention à la  convention de signe pour les manches et curseurs: +100 à droite ou en avant

Les trims digitaux sont des paramètres modifiables en vol


Définition des phases

On appelle "phase" une "condition de vol".

Si on ne définit aucune phase, le nom de la phase active  est à blanc.

vphase PHASE x 

La variable x est une variable logique, le plus souvent un interrupteur ( switch @Sx)
La variable logique vphase est le nom de la phase.
Son nom comporte souvent plusieurs parties , séparées par un point. 

On peut placer des instructions logiques (AND,OR,NOT...) avant les instructions PHASE,  pour définir les variables logiques utilisées par les instructions PHASES. 

Priorité des interrupteurs de phase

Les lignes de code opération PHASE sont rangées par ordre de priorité: la première dont la variable "x" est vraie est la phase active. Les lignes suivantes ne sont pas prises en considération. La dernière ligne est toujours "vraie", c'est pourquoi elle ne comporte pas de variable "x"

Exemple

J'utilise 2 interrupteurs à 3 positions  pour définir mes phases de vol en planeur.

Le premier définit deux phases maître:
- en haut = vol moteur @S4a
- en bas  = atterrissage @S4b
-au centre : la phase active est déterminée par le deuxième interrupteur:

-en haut=vitesse @S5a
-centre= vol normal
-en bas= vol lent @S5b

La codification des phases est:

Att                PHASE @S4b
vol.Moteur     PHASE  @S4a
vol.Vitesse    PHASE   @S5a
vol.Therm     PHASE   @S5b
vol               PHASE      

La dernière phase déclarée ne comporte pas de variable d'entrée, car elle est toujours "vraie". Elle permet de donner un nom à la phase par défaut. Si on ne met pas cette ligne, la phase par défaut n'a pas de nom.

Variables logiques associées à une phase active:

Dans la suite du programme, plusieurs variables logiques sont disponibles: ce sont les noms de phase et leurs morceaux.
Prenons un exemple fictif: la phase vol.thermique.spirale est vraie.
Comme le bon sens le voudrait, 3 variables logiques sont vraies:
- vol.thermique.spirale
- vol.thermique
- vol
Ceci définit des "groupes de phases" et est utilisé pour définir les paramètres (voir INIT ci-dessous)

Changement de phase avec ralentissement 

SLOW t

On peut obtenir un changement de phase progressif avec cette instruction. Lorsqu'une phase devient active, la dernière instruction SLOW définit la durée de la transition vers cette nouvelle phase, exprimée en dixièmes de seconde.

Le ralentissement maximum est 20 (2 secondes)

Valeur des paramètres

ppp: INIT  val (x)

Le paramètre ppp: prend la valeur  "val" si la variable logique "x" est vraie.  On peut omettre cette variable logique si le paramètre prend toujours cette valeur .

Lorsqu'on écrit le programme, "val" est une constante,  modifiable ensuite par les menus de l'émetteur ou même en vol.

Si le paramètre prend une valeur différente  par phase ou par groupe de phase, on utilise une des variables logiques générées par l'instruction PHASE.

Dans quel ordre coder les lignes ? Le programme les exécute et la valeur du paramètre est donnée par la dernière ligne dont la condition est vraie.  Il faut donc coder d'abord le cas  général et ensuite les cas particuliers.

Voici un exemple, avec les noms de phase utilisés ci-dessus

diff:  INIT 50 # pas de condition: cette ligne est toujours vraie
diff:  INIT 60 vol #valeur pour toutes les phases qui commencent par vol
diff:  INIT 80 vol.thermique #valeur spécifique pour cette phase

UPD ppp: val  permet au programme de modifier un paramètre.
Un exemple d'utilisation : le trim automatique. Si on actionne le bouton @BA, la valeur de la commande de vol est transférée dans le trim ce qui permet de recentrer la commande de vol
IF @BA
    UPD ail.trim: x
ENDIF

Si le paramètre a plusieurs valeurs , cette instruction modifie seulement la valeur pour la phase active.


Opérations sur des variables numériques

vvv ADD x y z   (ou + à la place de ADD)

ajouter les variables numériques: vvv= x+ y + z 

Ceci est la façon de réaliser un mélange de variables.

vvv SUB x y z (ou - à la place de SUB)

soustraire les variables numériques vvv= -x- y - z


vvv = xyz

xyz est une constante ou un paramètre ou même une variable.
la variable vvv prend la valeur de xyz

vvv RAL  xyz  t 

la variable vvv suit la variable xyz mais les variations sont ralenties avec une constante de temps t (exprimée ici  seconde)
Ceci est un filtre passe-bas, appellé aussi lissage exponentiel, qui est utile pour les variables de télémétrie
.

Attention: les noms des variables xyz et vvv doivent être différents.


vvv  EXP x nn

transformation x en vvv selon  une courbe exponentielle
par exemple nn = 40 pour obtenir une réduction de sensibilité au neutre de 40% sans modifier la course extrême

nn=0 signifie qu'il n'y PAS de réduction de sensibilité


vvv MULT x p   (ou * à la place de MULT)

la variable vvv est égale à la variable x multipliée par p 
p est un paramètre, une constante...ou une variable, qui doit être comprise entre -1 et +1

vvv MULT% x p   

la variable vvv est égale à la variable x multipliée par p/100
p est un paramètre, une constante...ou une variable

vvv DIV x p

la variable vvv est égale à la variable x divisée par p ; vvv est éventuellement
p est un paramètre, une constante...ou une variable, qui doit être comprise entre -100 et +100

non réalisé 

vvv DELTA x

la variable vvv est égale à la variation de la variable x depuis le dernier appel.(utilisé pour la télémétrie)

Transformations linéaires ou non-linéaires (appelées à tort Mélangeurs)

vvv CURVE xxx    x1 y1    x2 y2   ... xn yn   

La variable xxx est transformée en variable vvv selon une courbe passant par les points xi,yi 

Les valeurs pour chaque point sont soit des constantes, soit des paramètres., soit même des variables  .
Ce mélangeur limite le signal vvv , qui ne peut déborder de l'intervalle -100  +100.

 

vvv LINE  xxx x1 y1 x2 y2... xn yn   

Comme ci-dessus mais sans arrondi ; la "courbe" est une ligne brisée . 


vvv ADDS x p    

Ceci est un mélangeur linéaire symétrique, 
Il ajoute x*(p/100) à vvv

vvv SUBS x p    

Ceci est un mélangeur linéaire symétrique
Il soustrait  x*(p/100) de vvv

Pourquoi ? Pour les ailerons on est amené à créer une variable pour la gouverne de gauche et une variable pour la gouverne de droite. Leur signe est différent  et on voudrait utiliser le même paramètre.

vvv ADDAS x p1 p2     

mélangeur linéaire asymétrique
    si x>0
        ajoute x*(p2/100) à vvv
    si x<0
        ajoute x*(p1/100) à vvv

vvv SUBAS x p1 p2

mélangeur linéaire asymétrique
    si x>0
        soustrait x*(p2/100) à vvv
    si x<0
        soustrait x*(p1/100) à vvv

Voies de sortie (servos)

MODUL ch ms (m) définit la modulation (PPM.... ou autre)


Cette opération définit les caractéristiques de transmission pour ce modèle:
- ch =nombre de canaux (implémentation actuelle  6 à 12)
- ms = longueur d'une trame PPM , en msec
- m = module de sortie (à partir de la version V5)
    1 = le module d'émission Jeti, qui est la valeur par défaut
    2 = le module alternatif ppm, par exemple DT-1 pour indoor
    autres à définir selon les modules d'émission qui seront réalisés

    ...


Notez que la longueur de trame doit être suffisante: nombre de canaux * impulsion maximum + 3msec (pour la synchronisation)
Soit par exemple 9 canaux *(1,5 +0,5) + 3 = 21 msec minimum

x OUT  vvv    max  center   (max =1.55  center = .55 normalement)
(x OUTN  vvv    max center )

Cette instruction OUT fait la liaison entre une variable du programme et une voie de sortie de l'émetteur, en appliquant un ralentissement lors d'un changement de phase si l'instruction SLOW a été spécifiée.
L'instruction OUTN ne doit être utilisée que pour les voies qui ne doivent pas être ralenties.

La variable d'entrée vvv est une variable exprimée normalement entre -100 et +100.
La variable de sortie x doit porter un nom tel que @Vnn et est exprimée en µsec/100. (restriction version 4)

Dans une version ultérieure le format de cette instruction de liaison pourrait changer.

Quelques valeurs usuelles que j'ai mesurées:

Graupner MC24 1,5 msec et 0,4 msec à 100% (mais on peut aller au delà de 100%) . Trame PPM18 (9 canaux) 22 msec et PPM24 (12 canaux) 24 msec
Jeti Duplex : récepteur tout à fait paramétrable , valeur par défaut 1,5msec et 0,5  , sans dépassement. Trame PPM adaptable à l'émetteur ou réglable.
Multiplex Evo 1,5 et 0,55  En 6 canaux trame PPM de 18 msec, en 8 canaux trame 22msec

et pour les anciens servos Multiplex, utiliser 1,6 msec et 0,55


limites des servos :première version

v  SERV x high center low

Ceci est destiné à régler les courses des servos, dans les cas usuels.
Cette instruction est suivie par une instruction OUT / OUTN.

La variable v  est le signal destiné à l'instruction OUT ou OUTN, en valeur normalisée -100 à +100.
Les trois paramètres qui suivent  sont la valeur de v pour x = +100 (high), 0 ,-100 (low).

Remarque importante: ce mélangeur limite la valeur  extrême du signal , le signal v sera toujours compris entre high et low .

Exemple trivial pour l'aileron gauche ailL.: pas de limites de course

ailL.s SERV ailL  100 0 -100
ailL.s SERV ailL -100 0  100     pour inverser le sens de rotation, il suffit de permuter les limites (remplacer 100 par -100 et -100 par 100)

Exemple avec limites de course sous forme de paramètres à régler
ailL.U: INIT 100.00
ailL.C: INIT 0
ailL.D: INIT -100.00

ailL.s    SERV ailL ailL.U: ailL.C: ailL.D:
@V2    OUT ailL.s  1.55 .55

Cet exemple illustre ma convention pour les noms :
- les mouvements de l'aileron gauche sont définis par la variable ailL   (ailR pour l'aaileron droit)
- les limites de ce servo sont réglées par des paramètres, qui ont le même nom que cette variable, avec un suffixe .U .C .D (up , center, down)
- le mouvement du servo est défni par une variable ailL.s (suffixe s)


 version qui sépare la programmation d'un modèle de la cinématique des servos

Les variables du programme qui concernent une gouverne sont exprimées en mm  , au lieu de valeurs entre -100 et +100.
Ceci simplifie la programmation: on règle les mélangeurs en fonction des débattements souhaités, sans se soucier des particularités de construction

La dernière étape du programme convertit ces débattements (mm) en voie de sortie, en utilisant un mélangeur non linéaire.
Ceci permet de tenir compte facilement des particularités de réalisation de chaque commande, par exemple des petites différences entre deux ailerons.

L'intruction utilisée est un "mélangeur"  LINE qui remplace la commande SERV de la version précédente.

Exemple:
Le constructeur indique les débattements des ailerons: 20mm vers le bas et 30mm vers le haut en aérofrein.

ailL.s  LINE ailL  -30    ailL.U:  0 ailL.C:  20 ailL.D:
@V2   OUT  ail.s1.55 .55

On ajuste les paramètres pour obtenir un débattement mécanique mesuré égal au débattement commandé.
Si par exemple la variable ailL vaut -30.00, on ajuste le paramètre ailL.U pour obtenir le débattement mesuré égal à 30mm.


Opérations sur des variables logiques

v AND x y z la variable v est égale à la relation ET entre les variables logiques qui suivent

v OR x y z idem OU

v NOT x  v est l'inverse de la variable logique x


x TRUE  Crée et initialise la variable logique à la valeur "vrai"
x FALSE Crée et initialise la variable logique à la valeur "faux"


Les opérations suivantes dépendant du temps:

v MEM x est une mémoire  :la variable v est vraie et reste vraie dès que x est passé par l'état vrai.(ne plus employer)

v VART x est une variable logique "vraie" lorsque la variable x passe de faux à vrai (true).
Usage : par exemple signaler un changement de valeur pour un switch

v VARF x est une variable logique "vraie" lorsque la variable x passe de vrai à faux (false)


Variables d'état

Ces variables ne sont pas remises à zéro au début de chaque cyvcle de calcul, ce qui leur permet de mémoriser un "état" du modèle. Ce peuvent être des variables numériques ou logiques.

HOLD x y .... définit une liste de variables d'état


Opérations combinant des variables numériques et logiques

télémétrie : tenir compte des variables NON disponibles (valeur -125.00)

x COMP v y

la variable numérique v est comparée à la variable numérique y
si v>y alors x=vrai

x COMPE v y

la variable numérique v est comparée à la variable numérique y
si v=y alors x=vrai

attention: la valeur d'une  variable numérique est brouillée par de petites erreurs . Cette comparaison  ne doit être utilisée que pour des variables qui ont une valeur exacte , par exemple en utuilisant une instruction DTRIM avec "step"

x COMPA v y t

la variable numérique v est comparée à la variable numérique y
si v devient > y alors x=vrai mais seulement une seule fois par période t (exprimée en minutes et centièmes.
Ceci est utilisé pour créer les signaux d'alarme . Si la condition d'alarme subsiste, le signal d'alarme n'est activé que toutes les t secondes.


x VAR v y

lorsque la valeur de la variable numérique v change de  y
x est vrai, lorsqu'il y a un changement de y depuis le dernier changement signalé
sinon x est faux

exemples d'utilisation, pour la télémétrie:

x NUM v

Transforme la variable logique v en variable numérique
v=Faux -> x= -100, v=vrai -> x= +100

x NUMT v t

Transformation comme ci-dessus, mais  le passage d'une valeur à l'autre se fait progressivement  et à vitesse constante  pendant une durée de t , exprimée en  secondes .
A l'initialisation du programme, x prend immédiatement la valeur correspondant à v

Ceci est utilisable pour une cinématique de trappes; la variable x passe de -100 à 100 en 10 secondes.
On veut ouvrir les trappes (entre  le temps 0 et le temps 2 secondes, les laisser ouvertes jusqu'au temps 8 et les refermer ensuite.
Le train sort entre le temps 2 et le temps 8.
La variable x dans deux mélangeurs courbes qui fournissent le signal des trappes et du train...c'est très facile. 
Réalisé pour V4 , non disponible en V2.


Exécution conditionnelle

IF vvv      exécuter les lignes qui suivent juqu'au ENDIF correspondant si la variable vvv est vraie

  IFNOT  vvv      idem si la variable vvv est fausse (version V4)

ENDIF

Ceci est par exemple utilisé pour distinguer les opérations ou les mixages par phase de vol.
Il est permis d'imbriquer des opérations IF ENDIF,:

...code
IF vvv
    ...code exécuté si  vvv est vrai
    IF xxx
        ...code exécuté si  xxx est vrai
    ENDIF
    ...suite du code exécuté si vvv est vrai

ENDIF

Les chronomètres


La programmation des chronos fait appel aux opérations déjà décrites, complétées par ce qui suit.


La variable logique @H1 est à un lorsqu'il faut initialiser les chronos, c'est-à-dire au chargement du modèle en mémoire ou lorsqu'on utilise le menu chrono reset avant un nouveau vol.
Dans cet  exemple on initialise un compteur à zéro et un autre à 8 minutes

IF @H1 #reset chrono
    timefly = 0
    timemot = 8 # minutes
ENDIF

La variable logique @HS représente un "tick" l'horloge . Le programme teste cette variable, qui passe à 1 une fois tous les 100ème de minute.
Ceci permet de coder facilement la valeur initiale du compteur: 8,5  pour 8 minutes et 30 secondes.
Les chronomètres sont les variables numériques modifiées par les opération CHR+ ou CHR- . Choisissez un nom court (max 5 caractères) , en version V4 il s'affiche.

Ces variables sont des "variables d'état": elles conservent leur valeur entre deux cycles de calcul.

La variable numérique @HT est le nombre de ticks depuis le démarrage.Combiné avec l'instruction VAR, on dispose d'une variable logique de périodicité quelconque


IF @HS # clock pulse 
    fly CHR+ 4
    mot CHR- 3
ENDIF



x CHR+  pos
ajoute un 100ème de minute à la variable x et l'affiche sous la forme de 8 caractères  _h_ mm_ ss
pos= 0 pas d'affichage
pour la version V2:
pos=1  1ère ligne 1er caractère 
pos=2  1ère ligne 8ème caractère
pos=3  2ème ligne 1er caractère 
pos=4  2ème ligne 8ème caractère
pour la version V4 pos=numéro de ligne

x CHR-  pos
est identique mais soustrait un 100ème de minute .

BEEP n donne un signal sonore de longueur n , exprimé en 100 msec.

Quelques exemples pour illustrer les possibilités de programmation des chronomètres.

Alarme au démarrage


La variable  @H1 est vraie lors du démarrage.  On peut tester n'importe quelle combinaison  de variables, par exemple la position du manche de gaz.
On déclenche l'alarme avec l'opération BREAK ("xxx") qui affiche ce message xxx avec une alarme sonore.
Cette opération ne remet PAS à zéro @H1 (ce qui fait que le prochain cycle de calcul vérifiera à nouveau) et affiche le message optionnel xxx .
Une alarme sonore et un message sonore alertent le pilote.
Le premier message est affiché. Après correction le message suivant s'affiche.

Notez que le démarrage par le watchdog
ne signale aucun BREAK

Messages visuel ou auditifs
 

Les mesures de télémétrie sont des variables du programme, exactement comme les manches ou curseurs. (voir plus loin comment les acquérir)

Comment communiquer avec le pilote?

Messages auditifs: le "souffleur" intelligent

Les instructions PLAY mettent les messages à dicter dans une file d'attente. Il peut y avoir plusieurs messages successifs, mais if faut éviter de remplir la file d'attente ou de saturer le pilote.

Pour les messages sur demande, c'est très simple car le pilote doit actionner un bouton poussoir. On suppose qu'il ne va pas actionner le bouton à répétition.

IF @BB
.....PLAY
ENDIF

Les alarmes proviennent  de comparaisons faites avec COMPA, pour envoyer le message d'alarme toutes les t seconde .

Le message provenant du vario est plus particulier. Il est parfois dépendant de la phase de vol mais il est émis en continu. Le programme ne met ce message en file d'attente que si celle-ci est  vide.En d'autres mots, le message vario remplit les silences sans bloquer  les autres messages.

Un autre exemple est le message de recherche d'un modèle perdu: il dicte en continu le niveau de réception des antennes. Mais attention à placer un ralentisseur: émettre le message à une périodicité plus longue que la durée du message !


PLAYV  f var automatise la dictée :

dicte la description de la variable (= le fichier var.wav)
dicte ensuite la valeur selon le format f (0,1,2  selon le nombre de décimales)
dicte éventuellement l'unité de mesure, si le fichier varX.wav existe.
et finalement un court silence pour séparer les variables dictées

Si la variable n'a pas de valeur connue, rien n'est dicté.


PLAY  f var dicte la variable var selon le format f  

f= 0,1,2  nombre de décimales dictées
f=8 réservé pour un message vario "chanté" , dont la fréquence varie selon la valeur de la variable
f=9 utilisé pour une variable chrono

PLAYT   "xxxx"  joue le fichier xxxx  (sans l'extension .wav qui sera ajoutée automatiquement)

PLAYT   "xxxx" varL  joue le fichier xxxx  SI la variable logique varL devient vraie.
Un exemple d'utilisation: on actionne un switch et l'émetteur dicte la fonction qui vient d'être activée.

PLAYS   nn insère un silence de nn dixièmes de seconde.


Affichage

La communication à l'écran n'offre pas d'intérêt, sauf pour la mise au point.

SHOW   n f var  affiche la variable var à la ligne n, dans le format f , avec le nom de variable

SHOWT   n "xxx..xx"  affiche ce texte à la ligne n

BREAK    "xxx..xx"    affiche une alarme au démarrage le texte "xxx...xx" en dernière ligne et envoie un message sonore
( seul le premier message BREAK d'un cycle de calcul est affiché . Dès que sa cause est supprimée, un message suivant peut apparaitre)


Acquisition des variables de télémétrie pour les capteurs Jeti

voir aussi télémétrie

Des  instructions spécifiques au protocole JETI se chargent de l'acquisition de données, pour la codification voir la télémétrie Jeti en V4 et le fichier RCCLEXP.txt qui définit les capteurs.

JETIMX  X 

Cette instruction définit la connexion d'un capteur X au récepteur

Si on utilise le "expander" de Jeti pour connecter 1 à 4 capteurs, on codifie ceux-ci par JETIMX suivi des 4 numéros de capteur ou zéro pour une position non occupée .



Accès continu.
Cette instruction est exécutée de façon continue, à chaque cycle de calcul mais de façon conditionnelle si elle se trouve entre des instructions IF...ENDIF qui testent des conditions de vol ou autres variables logiques, interrupteurs....

vvv JETI  X
vvv JETI X n
vvv JETI X n d

vvv est le résultat de l'acquisition : une variable du programme. Si la variable n'est pas disponible , sa valeur est -120
X est le numéro de nœud , qui identifie un capteur et un écran de ce capteur
n est optionnel, c'est le numéro de variable  lorsque plus d'une variable existe dans un seul écran ; valeur par défaut= 0
d est un diviseur optionnel, par exemple d=3 pour diviser par 1000
    (
Certaines variables ne sont pas dans un format de -100,00 à +100,00, utiliser dans ce cas le diviseur)

La variable logique @HJ est vraie lorsque un nouveau message a été reçu . En principe, lorsqu'on affiche les variables d'un seul nœud, ce message est renouvelé toutes les 80ms

Attention :  si l'instruction n'est pas exécutée (par exemple à cause d'un IF ...) ou n'a pas su lire le capteur, après quelques secondes la variable de sortie prend la valeur "indisponible"


Accès sur demande et dictée automatique
Une seule instruction combine l'acquisition sur demande suivie de la dictée de la variable.
Elle permet de lire un nœud d'accès lent uniquement quand on veut communiquer sa valeur
( accès lent:
pour passer d'un capteur au récepteur et revenir à un capteur, le protocole Jeti demande 4 à 5 secondes! ).

vvv JETI    X  n L  f
vvv JETI    X  n L f d
L est une variable logique pour demander l'acquisition (bouton tel que @BB par exemple )
f= 0,1,2  nombre de décimales dictées

Cette instruction démarre si la variable logique L est vraie. L'acquisition a lieu, la variable vvv est mise à jour et est donc disponible dans le programme. La dictée suit automatiquement avec le nom, la valeur et les unités (comme l'instruction PLAYV)
N'utilisez pas une variable L qui reste à "vrai"....la dictée serait continue!


L'instruction JETI peut se trouver entre des instructions IF ...ENDIF pour choisir les variables selon par exemple la phase de vol.

On peut utiliser la deuxième forme de cette instruction JETI en remplacement de   IF @BB + JETI + PLAY: c'est un raccourci agréable.


Accès direct
Pour un accès rapide aux variables disponibles dans l'Expander, utiliser l'instruction JETIX .
Elle remplace la deuxième ligne du nœud n .
JETIX   n  "xxxxxxxxxx..x"
Exemple pour un MUI connecté à la ligne 1 (noeud 21) :JETIX 21 "1}&&&&&mAh&&&&V " 

Contrôle de l'identité du récepteur (Jeti)

Chaque récepteur a un code d'identification unique,qui est disponible dans le menu Tx, affiché sous la forme de deux nombres de 5 chiffres.
L'instruction JETIRX vérifie que l'identification codée dans le programme correspond à l'identification du récepteur. En cas d'erreur elle émet un message d'alarme toutes les 15 secondes.

Attention: ceci ne vous protège pas contre un démarrage intempestif d'un moteur électrique ou un mouvement excessif d'un servo,  la connexion émetteur-> récepteur se fait et c'est d'ailleurs  ce qui permet d'accéder à l'identité du récepteur.

JETIRX  "xxxxx xxxxx"

exemple
JETIRX  "42344 24546" 

Logging

Pour enregistrer des variables  pendant le vol.
LOG   v1 v2 v3...vn  enregistre  ces variables numériques v1..vn (ou logiques) dans un fichier.
Le fichier est sur la carte SD. On peut directement l'importer dans un tableur.

La périodicité est un enregistrement toutes les 80 msec , ce qui est la périodicité des informations de télémétrie provenant du récepteur
   

Régulation PID


co  PID    pv sv Kp  Ki  Kd 
co = controller output , qui est la variable de commande (la dérive par exemple)

la variable co est à la fois une variable "entrée" (la commande actionnée par le pilote) et une variable de sortie, car le régulateur PID  ajoute sa correction
Ceci permet de combiner
-une correction automatique en laissant le manche immobile et donc de préférence centré (prévoir un trim adéquat)
-le pilote peut toujours ajouter sa propre  intervention
  
pv = process variable , qui est une variable mesurée par télémétrie. ( par exemple le taux de glissade)
sv = setpoint , la "consigne", qui est la valeur souhaitée pour la variable pv (0 dans cet exemple où le régulateur commande le dérive pour annuler la glissade)
   
Kp,Ki,Kd = les paramètres de réglage du régulateur
Ce sont le plus souvent des constantes figées dans le programme , mais on peut utiliser des paramètres pour un réglage en vol
Leur définition correspond à la forme classique (
e=pv-sv est l'erreur)
   co = Kp *e   :terme proportionnel
        +Ki  * (somme de e)   attention à l'unité,  Ki= nombre / sec
        +Kd * (dérivée de l'erreur): terme dérivé  Kd= nombre *seconde
 

Pour enclencher / déclencher le régulateur, on utilise une variable logique et une instruction IF / ENDIF
Lorsqu'on enclenche le régulateur , il n'y a pas de variation brutale de la commande.
Si la consigne change, cette variation n'est pas amplifiée par le terme "dérivé" du PID

Variante sans consigne
co  PIDA    pv  Kp  Ki  Kd 
Lorsqu'on enclenche le régulateur , la consigne prend la valeur de pv (penser au "cruise control": la consigne de vitesse est la vitesse au moment où on l'enclenche)

plus de détails dans la version RCCL V5

Attention : les variables de télémétrie doivent être disponibles et mises-à-jour à la périodicité normale (80 msec) .
Ce qui signifie que lorsqu'un PID est actif, il faut que les instructions JETI actives ne consultent qu'un seul noeud (celui qui fournit ces variables de télémétrie). Il faut en tenir compte dans l'écriture du programme.





     

Le curseur digital ou "trim digital"

Deux boutons poussoirs créent une sorte de curseur virtuel.
En appuyant simultanément sur les deux boutons on remet le trim à sa valeur centrale, qui est le plus souvent zéro.
On le déplace lentement par des pressions successives. On le déplace de plus en plus rapidement en gardant le bouton enfoncé.
Pendant ces ajustements, la valeur s'affiche sur l'écran et la valeur sera dictée dès qu'on lâche le bouton.

Ceci est utilisé pour les trims digitaux décrits au point suivant mais rien n'empêche d'utiliser les curseurs digitaux à la place de curseurs analogiques classiques.

Un code opération assigne un trim digital (une paire de boutons) à un paramètre . Remarquez qu'il n'est pas assigné à une variable: les valeurs des paramètres sont conservées entre deux vols...pas la valeur des variables.

DTRIM n  ppp  (course-   course+)  (step) 
    (n de 1 à 4) 

Le paramètre ppp est assigné au curseur digital n . Les numéros de 1 à 4 sont attribués aux trims digitaux des manches.
Ce curseur digital a une valeur différente pour chaque phase de vol .

Les deux derniers paramètres sont optionnels:

La course du trim est définie par ses deux limites, par exemple DTRIM 1 param: -10  +50 limite le paramètre param aux valeurs comprises entre -10 et +50. Si on appuye sur les deux boutons simultanément, le trim se recentre à (-10 + 50) /2 =20 !
La valeur par défaut des limites est  -30 à +30.  

Le step est par défaut à zéro,  qui signifie que le déplacement du trim est continu et s'accélère si on garde un bouton enfoncé.
Une autre valeur (positive) définit le déplacement pour une pression sur le bouton.
Note: ce paramètre est une constante ou une variable.

Une valeur élevée pour step  transforme le trim en interrupteur à plusieurs positions.Par exemple course=50 et step =15 réalise un interrupteur à 4 positions du côté positif : 0 15 30 45 .

Voir aussi DSW , qui utilise les boutons de trim pour réaliser un interrupteur à plusieurs positions avec confirmation audio de la position.

Voici un exemple de paramètre initialisé à trois valeurs différentes selon la phase de vol.

"courb.trim" est une variable qui sera utilisée dans un mélangeur pour régler la courbure de l'aile.
Les valeurs initiales 0 , -3 et +5 sont écrites dans des variables, modifables facilement au sol ou en vol.
Ici on affecte la variable "courb.trim" au curseur digital 1.
En cours de vol, si la phase active est vol.vitesse, le curseur digital modifie la valeur correspondante courb.trim:vol.vitesse, dont la valeur initiale était -3.

courb.trim: INIT 0 vol
courb.trim: INIT -3 vol.vitesse
courb.trim: INIT +5 vol.therm

DTRIM1 courb.trim:



DSW n  ppp z  str
   

Le paramètre  ppp comporte la position de d'un sélecteur à plusieurs positions (penser à un sélecteur rotatif) . C' est un nombre entier( par exemple -1, 0,1,2,3).

Sur mon émetteur, j'utilise les deux boutons de manche (n=5).

Le nombre dit en quelle position se trouve le "zéro" (sélction du zéro en appuyant sur les deux boutons à la fois). Dans cet exemple z=1 (numérotation à partir de zéro)

str comporte les noms de fichiers "son", sans le suffiwxe .wav, séparés par un espace.
- le premier nom est la description de l'interrupteur( les 2 boutons de manche sont affectés à l'un ou l'autre sélecteur ,selon les phases de vol)
- les noms suivants comportent le fichier dicté lorsqu'une position est sélectée.



Les trims

Le fonctionnement d'un trim combine

- une commande de trim (curseur, boutons poussoirs ...) qui est aussi une mémoire du trim, conservée entre deux vols
- une façon d'ajouter la correction de trim


Commençons par décrire les façons d'ajouter une correction de trim , qui sont faciles à réaliser avec le code opération LINE décrit plus haut:

  1.  décalage général par le trim t: le mélangeur se réduit à une simple addition ,sans utilisation du mélangeur, mais les points extrêmes se déplacent également.
  2.  décalage du neutre par le trim t avec maintien des courses extrêmes
  3.  le trim agit à l'extrémité +100% - le neutre et l'autre extrémité ne changent pas (utilisation pour la commande de gaz )
  4.  le trim agit à l'extrémité -100% - le neutre et l'autre extrémité ne changent pas  (utilisation pour la commande de gaz )

On peut choisir si cette correction se fait sur valeur brute du manche , mais il est préférable de le faire après la transformation "exponentielle"qui diminue la sensibilité autour du neutre et la transformation "dual rate" qui diminue la course.


La commande du trim est possible de plusieurs façons, selon un choix fait à la construction de l'émetteur.:
Trim analogique 

Les trims analogiques: ce sont des curseurs mécaniques que le programme traite comme n'importe quelle autre entrée analogique.
On les complète par un bouton de mémorisation qui permet de remettre les trims au centre, ce qui est indispensable avant de changer de modèle.

La réalisation est simple: à chaque curseur de trim on associe un paramètre. En appuyant sur le bouton de mémorisation, la valeur du curseur est ajoutée au paramètre et le pilote remet chaque curseur au centre. Le mélangeur additionne en fait deux corrections: le curseur de trim et le paramètre. C'est une méthode ancienne qui a ses adeptes inconditionnels.

Trim digital
Ce trim utilise un curseur digital au lieu d'un curseur analogique.
Le trim digital peut être global ou par phase de vol, ce qui est son grand avantage.
Par exemple, j'utilise un trim par phase de vol pour la profondeur tandis que les trims d'aileron, dérive sont indépendants de la phase de vol.
La mémorisation est automatique: il ne faut rien faire avant de changer de modèle
Une instruction DTRIM associe un paramètre à un trim digital .
Trim automatique
Choisir une phase de vol et voler dans l'attitude où on souhaite pouvoir centrer les manches (par exemple à plat). Tout en gardant les manches dans leur position , on actionne un bouton
qui mémorise la position des manches.
C'est la nouvelle valeur du trim et on peut recentrer les manches.
Ce trim est rapide .
La programmation est simple avec l'opération UPD. Lorsqu'on actionne le bouton de trim automatique, la position du manche est ajoutée à un paramètre.
La correction de trim  additionne ce paramètre à la position du manche.

La variable logique autotrim est un bouton poussoir

C'est une méthode récente et vraiment très pratique. 
Choisissons par exemple un avion acrobatique. Il a deux phases de vol: - le vol "pépère" où il est sensé voler tout seul à mi-gaz, mances centrés. Pour trimer, il suffit de choisir cette phase, se mettre à mi-gaz en vol horizontal , appuyer sur le bouton d'autotrim puis recentrrer les manches - en vol acrobatique on voudrait que la profondeur soit "neutre". En montée verticale...l'avion doit monter tout droit. Pour trimer, il suffit donc de monter tout droit et d'appuyer sur le bouton de trim dès que cette trajectoire est obtenue.


Remarques: les gouvernes de roulis

les ailerons

Soit AIL la commande des ailerons , qui a subi des transformations telles que exponentiel ou dual-rate, mélangeur éventuel avec la dérive...mais reste une seule variable numérique avec un signe positif ou négatif, par exemple +=tourner à droite.

Quand on veut une commande différentielle des gouvernes, l'aileron descendant bouge moins que l'aileron montant.

On termine la programmation des ailerons en créant deux variables : ailL et ailR (Aileron gauche et Aileron droit) et en utilisant un mélangeur asymétrique pour créer ce différentiel. Ces variables alimentent les voies de sortie ou les mélangeurs finaux.

voir exemple:
ailR    SUBAS ail  50   100    #aileron right  +=en bas -=en haut 
ailL    ADDAS ail  100 50    #aileron left,+=en bas -=en haut

#La constante 50 sera remplacée par un paramètre  diff:

les ralentissements

Plusieurs opérations sont disponibles


© Copyright 2008-20015  Robert Spilleboudt   - Tous droits réservés. Projet rcopensource - Licence GPL V2