Implémentation des programmes
Programmes de simulation sur le PC
Ces programmes permettent de programmer un modèle, de vérifier le programme et finalement de le transférer vers l'émetteur.
Après le vol, avant de modifier le programme, il faut transférer les valeurs des paramètres de l'émetteur vers le PC.
Ces programmes sont écrits en Python et Tkinter pour l'interface, disponibles tant avec Windows que Linux.
L'interface Gui se trouve dans deux modules:
-main.py qui est le programme principal ( lance l'application et gère le menu)
-Gui.py gère l'interface de simulation
Toute la logique de l'application se trouve dans le module Calc.py
Dans ce module une fonction Tx() doit être adaptée aux besoins, car elle
décrit
1) les commandes utilisées pour simuler un émetteur sur l'écran du PC.
2) les organes de contrôle de l'émetteur et leur connection aux
portes du microprocesseur.
Voici cette codification pour mon émetteur prototype:
# __________the variables in the microprocessor
________________________________________________________
# this table provides a equivalence between the name of a
hardware variable and the index of this variable in L_tx or N_tx
# theses tables are the interface with the computational routine calc()
# the variable defined here are
# -real hardware: ADC, switch...
# -fixed variable defined in the core program of rccl
# digital trims
# servo outputs
# nearly all the buttons (because a
debouncing is provided)
# example: the variable @C1 is at the index 4 in the Numerical table
#here (my prototype) there are 4 sticks, 3 sliders, 4
digital trims for the sticks ,max 12 servo channels,
self.N_tx=["M1", "M2", "M3", "M4", "C1", "C2", "C3", "Vn", "V1", "V2", "V3", "V4", "V5", "V6", "V7", "V8", "V9",
"V10", "V11","V12"]
# (for analog trims, please group all the adc inputs)
# digital input : switches and a special button
# the first variable is reserved for autotrim (please reserve always this variable)
self.L_tx=["BA","S1","S2","S3","S6","S4a","S4b","S5a","S5b", "B1" ]
A modifier sous la forme d'un fichier de paramètres, pour faciliter la simulation avec plus d'un émetteur.
Organisation générale de l'émulateur
Le
language RCCL est interprété par un microprocesseur.
Ce
prototype est développé pour un Atmega128: un micro 8 bits, disposant de au moins 4K de RAM, programmé en C.
Les outils de dévelopement sont disponibles gratuitement, tant pour Windows que Linux.
Les programmes suivants sont quasi indépendants du microprocesseur :
AVR_rccl.c qui est le programme principal
-rccl.h qui comporte entre autre toutes les dimensions des tables
-calc.c qui comporte l'interpréteur proprement dit
-param.c pour la gestion des paramètres (recherche hiérarchisée)
-menu.c qui gère les menus et les messages en vol
Les programmes fortement liés au microprocesseur sont:
- io.h comporte les définitions d'entrées-sorties- io.c où se trouve la correspondance détaillée entre un "bouton" de l'émetteur et une porte du microprocesseur.Le détail se trouve dans ce fichier Atmega128Ports
. Celui qui veut réaliser son propre émetteur en utilisant un Atmega128
ne devra sans doute modifier que ce fichier et le programme io.c- io_timer.c comporte deux timers, pour la génération du signal PPM et du signal d'horloge- sd.c comporte l'accès aux fichier de la carte SD, qui est compatible avec le PC.- battery.c surveille la tension de la batterie ou coupe l'émetteur lorsqu'on le laisse allumé sans bouger les manches
- io_all.c concerne les entrées-sorties mais est quasi indépendant du microprocesseur- le folder util comporte des programmes d'origine externe, pour gérer l'écran LCD, la communication série et la carte SD
L'interpéteur utilise une zone de mémoire RAM partagée en tables de dimensions fixes
-
table des variables numériques N_tx., comportant des éléments integer
en 16 bits
- table des variables logiques L_tx, comportant une valeur binaire, un byte/élément
- table des opérations (byte-code) op qui est une table de char
- table des libellés, en RAM (possibilité de migration ultérieure vers l' EEPROM )
Format des variables numériques:
Les constantes du programme source sont
multipliées par la constante TOINT = 100 pour obtenir la valeur interne.
La valeur normale des variables est comprise entre -100 et +100,
leur valeur interne est donc un nombre entier compris entre -10000 et
+10000. Un léger dépassement est possible pendant les calculs.
Les variables analogiques (ADC) sont également exprimées de cette façon et ont été mises à l'échelle (calibrage des manches).
Les
voies de sortie @Vx sont également des variables numériques dont
la représentation interne est exprimée en microsecondes.(valeur normale
1500)
Chaque
table de variables commence par les variables liées au hardware (@.. )
qui sont à un endroit fixe (voir le simulateur Calc.Tx). Cette
position fixe permet la communication entre les programmes du
microproceseur et le language RCCL
Les valeurs constantes suivent, puis les variables d'état et ensuite toutes les variables intermédiaires.
Ces dernières sont initialisées à zéro au début de chaque cycle de calcul.
Les tables de variables comportent au maximum 254 éléments, permettant d'utiliser un entier de 8 bits pour l'index. La valeur 255 est réservée.
Chaque opération comporte
- un byte = code opération (traduction des codes source INIT, ADDS... voir Calc.py OPCODE ou rccl.h)
- un byte = le nombre d'arguments
-
0 à n arguments de 1 byte chacun, qui sont un index d'une des deux
tables de variables. (Selon le code opération, la nature des variables
est connue: numérique ou logique) .
La
table des opérations comporte ces opérations, les unes après les
autres, terminées par un code opération indiquant la fin de la boucle.
La table des libellés est une table de char, comme la table des opérations. Elle comporte pour chaque libellé:
-un byte avec la nature du libellé, soit pour le moment le code '5' ou '6' qui distingue un nom de phase d'un nom de paramètre.
- un byte avec l'index de la variable (logique pour nom de phase, numérique pour nom de paramètre
-un char \0 qui sert de terminateur pour une exploration en marche arrière
- une chaîne de caractères terminée par \0
Format du fichier modelname.md transféré vers l'interpréteur
Le fichier "source" modelName.mdx est transformé sur le PC en un fichier , transféré vers l'émetteur.
Le nom du fichier est modelName.md (les points éventuels dans le nom du modèle sont remplacés par _ )
Ce fichier est en ASCII et réside sur une carte SD.
Chaque
ligne comporte un code "x" en un caractère et des
arguments séparés par un espace, puis un séparateur "#" et un
commentaire qui est en général la ligne du programme source. Ce commentaire n'est utile que pour le debug des programmes.
x=0 Nom
l'argument est le nom du modèle
x=1 Nombre de variables
arguments de la forme 123 :
- nombre de variables numériques
- nombre de variables logiques
(ceci pour vérifier que la dimension des tables n'est pas dépassée)
- index de la première variable numérique à initialiser à zéro au début de chaque cycle de calcul
- idem variable logique
x=7 Valeur des paramètres
Ce sont de fausses constantes, qui sont modifiables sur l'émetteur.
Elles sont rangées immédiatement derrière les variables hardware.
Codification comme les constantes ci-dessous
En fin de fichier on trouve les lignes de code 6 qui associe un libellé à chacune de ces paramètres.
x=8 trims digitaux pour les sticks
Un exemple : 8? 017 2le paramètre qui se trouve à l'index 17 de la table est associé au trim du manche 2
x=2 Constantes
Les constantes sont codées sous la forme 123 ( 123=index dans la table) suivi d'un nombre entier (voir plus haut TOINT),
elles ne sont pas modifiables.
Un exemple : 2? 017 8000la variable numérique qui se trouve à l'index 17 de la table vaut 80
x=3 Opérations
T xxx xxx....
En
général, la première variable est la variable de sortie, si elle
existe pour le code opération. Les variables d'entrée suivent.
Le code interne T est un byte qui identifie l'opération.(coir Calc OPCODE ).
3 = 029 020
On transfére la constante -100 (à l'index 20 de la table) dans la variable moteur (index 29).
Remarque:
pour certaines opérations, la codification en langage source RCCL prévoit des
arguments optionnels. Ici tous les arguments sont présents, certains
avec la valeur "vide" égale à 255.
Phase:
Une opération phase comporte une
variable logique d'entrée. Si elle est la première à être vraie, elle
positionne à "vrai" une série de variables de sortie. L'ordre des
paramètres est donc inversé: une variable d'entrée ou 255 si elle est
absente suivie de 1 à n variables de sortie, par exemple vol vol.therm vol.therm.spirale
La dernière variable logique est celle qui identifie la phase.
Out/Outn:
Tous les paramètres sont exportés(neutre, déviation max )
x=4 INIT des paramètres
Les opérations utilisent les paramètres comme des variables numériques
ordinaires, référencées par un index dans la table des variables
numériques.
L'opération
PHASE détermine la phase active, note son nom et met à True une ou
plusieurs variables logiques . Par exemple, si la phase active est
vol.lent.spirale il y a trois variables mises à la valeur True:
vol.lent.spirale ,vol.lent et vol. Elles sont utilisées ici .
Prenons opération INIT comme exemple:
diff: INIT 10 vol.vitesse
Quelle est sa représentation dans le fichier ?
4 I 036 030 020
- le code 'I' lié à "INIT"
- 036 est l'index dans N_tx de la valeur courante du paramètre diff: Les
autres instructions qui font appel à diff: se réfèrent à cet index. Appelons ceci la variable pvar
- 030 est l'index d'une variable initialisée à 10.0, appelons ceci une des variables vvar associées au paramètre
- l'index d'une variable logique (ou 255 si il n'y a pas de condition)
La boucle de calcul transfère vvar vers pvar si la condition est vraie.
Avant de quitter, le programme écrit les paramètres dans un fichier . mdp !
x=5 Libellés de phases
x= 6 libellés de paramètres
Un libellé est annexé à certaines variables, comme le nom d'une phase ou d'un paramètre, pour l'afficher à l'écran LCD.
Cette
ligne comporte la variable ( index dans la table, logique pour les
phases, numérique pour les paramètres)) , un espace puis un libellé qui
ne comporte aucun espace.
Ces lignes sont à la fin du fichier, triées selon le libellé.
5 045 libellé
Format du fichier des paramètres modelname.mdp
Ce
fichier comporte des paramètres d'un modèle qui sont modifiables sur l'émetteur et autres
données à conserver entre deux vols . Eventuellement, le programme de simulation sur le PC peut les lire.
Il est sauvé sur la carte SD avant le chargement d'un autre modèle ou lors de la procédure d'arrêt de l'émetteur.
Ce
fichier comporte les paramètres numériques qui ne sont pas initialisées
à zéro lors de chaque cycle de calcul.
Format
de transfert: un code (char) indique la nature des données, il est
suivit par des valeurs numériques séparées par un espace:
Ce fichier porte le nom du modèle, suivi par l'extension .mdp
Le fichier modelname.txt
Il comporte la le programme source après insertion des modules . Ce fichier est fourni à titre d'information; il n'est pas utilisé par l'émulateur.
Format du fichier des paramètres RCCLinit.mdp
Ce
fichier comporte le nom du dernier modèle, ainsi lorsqu'on allume
l'émetteur, le dernier modèle est chargé automatiquement.
Format du fichier des paramètres RCCLcal.mdp
Ce fichier comporte les paramètres de l'émetteur et n' a aucune utilité pour le programme de simulation du PC.
On le prépare sur le PC après avoir utilisé le menu ADC value qui fournit les valeurs lues par l'ADC.
Il comporte les données de calibrage des manches, chaque ligne comporte
c aaaa ccccc hhhh
c= voie analogique
aaaa = valeur lue par l'ADC lorsque le stick est à la position -100%
ccccc = valeur lue lorsque le stick est centré
hhhh = valeur lue lorsque le stick est à la position +100%
Les fichiers et leur mise à jour
Fichier | PC | carte SD | maj |
source .mdx | créé manuellement, lu par le simulateur | - | PC |
.md | créé par le simulateur | utilisé | PC |
paramètres .mdp | lu optionnellement, pour simuler avec les paramètres réels | créé lors de l'arrêt de l'émetteur | émetteur et simulateur
|
RCCLinit.mdp | - | créé lors de l'arrêt lu au démarrage | émetteur |
© Copyright 2008-2009 Robert Spilleboudt - Tous droits réservés.
Projet rcopensource - Licence GPL V2