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
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. |
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.
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.
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)
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 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 vraievvv 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
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)
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 .
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
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
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)
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.
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)
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
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"
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.
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 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.
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
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.
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)
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 .
co = controller output , qui est la variable de commande (la dérive par exemple)Pour enclencher / déclencher le régulateur, on utilise une variable logique et une instruction IF / ENDIF
pv = process variable , qui est une variable mesurée par télémétrie. ( par exemple le taux de glissade)
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
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
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.
Le fonctionnement d'un trim combine
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:
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
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:
Plusieurs opérations sont disponibles
SLOW pour obtenir un changement de phase progressif, par
exemple pour éviter un mouvement des servos qui est petit mais
cependant brutal (notez que ceci ne ralentit PAS les actions faites
par le pilote après le changement de phase)
NUMT est par contre destiné à construire un
mouvement précis: une variable qui évolue linéairement, en une durée
précise, pour controler des mélangeurs. Regardez ce que Arno Wezel a
écrit pour la MC24 à mélangeurs
RAL est comme le changement de phase, mais ici on ralentit les variations d'une seule variableRemarques: les gouvernes de roulis
© Copyright 2008-20015 Robert Spilleboudt - Tous droits réservés. Projet rcopensource - Licence GPL V2