Pilotage du Drone via la télécommande
Réception de la télécommande par le micro-contrôleur
Afin de pouvoir comprendre comment la télécommande envois ses données, il est nécessaire de connaitre quelques détails.
La télécommande, prévue pour l'aéromodélisme (41 Mhz), envois les commandes sur un certains nombre de canaux, définis par un décalage temporel. Une fois les 14 canaux émis, le protocole stipule une pause de 8ms minimum.
Signal en sortie du récepteur
Notre récepteur a été modifié afin que tout ces canaux ne sortent pas séparés mais les uns à la suite des autres, nous donnant ce signal.
Le canal 1 correspond donc au 1er état haut ainsi qu'a l'état bas qui suis.
Chaque canal a une durée comprise entre 1 et 2 ms. L'état neutre se situe à 1.5 ms. Ainsi, un servomoteur (utilisé sur le drone comme gouverne), peux se positionner directement à la position voulue. La position est proportionnelle au temps.
Notre télécommande, une Graupner 4014, est capable d'envoyer sur 14 canaux différents, mais seulement 4 ont étés utilisés pour ce projet.
N° de canal | Rôle |
1 | Commande des gaz |
2 | Ailerons |
3 | Gouvernail de profondeur |
4 | Gouvernail de direction |
Le M32 était connecté au simulateur via une liaison RS232 afin de transmettre les commandes voulues par l'utilisateur.
Le récepteur était ici relié au micro-contrôleur par une entrée de timer. Ce timer est capable de compter la durée totale entre 2 fronts, ici 2 fronts montants. La télécommande envoyant sur plus de 4 canaux, il n'était pas difficile de les mesurer tout les 4 sans aucune perte.
Nous avons réalisé ceci grâce à une interruption.
void signal(void)
{
unsigned short buf = 0;
static short compteur = 0;
buf = tb0>>2;//sauvegarde de la mesure et mise a l'echelle en µs
if( compteur++ == 8 )
{
compteur = 0;
if (buf < 8000) // Mettre tb0 dans une var
if ( ipsnd_dtq(ID_mesure, buf) == E_OK); //envois des mesures pour controle (valeur entre 1k et 2k tps en microsecs)
else
if ( ipsnd_dtq(ID_mesure, 0) == E_OK); //envois d'un 0 pour signaler le temps mort
}
}
Voici cette interruption. Gérée par le noyau temps réel du M32C83, elle se déclenche a chaque front montant, et mesure le temps jusqu'au prochain front montant.
Nous avons configuré le timer (Timer de type B) en microsecondes, afin d'avoir des mesures precises.
Une tâche sert à gérer la synchronisation.
Elle rempli un tableau de canaux, avec les valeurs reçues si celles ci sont bonnes, et considère que la télécommande est désynchronisée si une de ces valeurs n'est pas comprise entre 970 et 2030, ou qu'un zéro est reçu à la place d'une valeur.
Le zéro (temps mort), s'il est reçu en fin d'émission, garanti que la liaison est bonne.
Si le tableau de canal est bon, la tâche controleur() est lancée.
Envois des commandes par le micro-contrôleur
void controleur()
{
int i;
static unsigned short anciencanal[4]= { 0,0,0,0}; //tableau contenant les anciennes consignes
wai_sem(ID_protec_canal);
for( i = 0; i <4;i++) //copie des valeurs
anciencanal[i]=canal[i];
sig_sem(ID_protec_canal);
for ( i = 0; i < 4; i++)
{
switch (i)
{
case 0 :
periph_write('T', anciencanal[i]); //envois de la commande moteur
break;
/* AUTRES CAS A TRAITER*/
}
}
}
Cette fonction commence par utiliser un sémaphore (wai_sem et sig_sem) afin de copier les valeur de canal[]. En effet, l'OS étant temps réel et la tâche pouvant être interrompue, il est nécessaire de fonctionner avec des valeurs stables pour garder toute cohérence.
Ensuite, selon le canal sur lequel est la valeur, elle est envoyée au servomoteur correspondant du simulateur.
Le M32 sers pour le moment seulement à transmettre les commandes, mais différents comportements étaient envisagés en début de projet, mais abandonnés par manque de temps. Ainsi, on pourrais rajouter sur cette base un comportement à adopter en cas de perte prolongée de liaison radio, un atterrissage automatique...
Retour