Projet QUAD - Lise Nicolas | Engineer
Transcription
Projet QUAD - Lise Nicolas | Engineer
Lise NICOLAS Stéphane LESSIEU-DUFOUR _______ ____ _ _ Projet QUA D _______ __ _ __ 1/15 ET3 Tuteur de Projet: Mr. Samir Bouaziz Sommaire Introduction ......................................................................................................... 3 Présentation des outils......................................................................................... 4 Le MBED NPX LCP1768 ..................................................................................... 4 Le Signal RS232 .................................................................................................... 5 Démarches et contraintes .................................................................................... 6 PROGRAMMATION DE LA CARTE MBED .................................................... 6 INTEGRATION DE LA TELECOMMANDE ................................................... 11 Répartition du travail ....................................................................................... 14 Conclusion .......................................................................................................... 15 2/15 ET3 Tuteur de Projet: Mr. Samir Bouaziz Introduction Le projet Quad étant un nouveau projet lancé cette année par monsieur Bouaziz est le projet qui nous a semblé le plus attractif. Nous l’avons donc choisi, les outils du projet étant la programmation C sur ARM7, Visual C++ pour la partie PC, CAO pour les cartes à réaliser. Comme nous n’avons eu que peu de cours d’informatique lors de ce semestre, nous avions envie de consolider nos bases dans ce langage. Le projet consistait à rendre autonome un Quad électrique. La première étape est de déporter certaines commandes de ce Quad pour le contrôler à partir d’une radiocommande. C’est dans cette partie que nous sommes intervenus. L’émetteur radiocommande transmet plusieurs voies qui commandent plusieurs grandeurs physiques (direction,…). Le récepteur est embarqué sur le Quad. Cette année, les groupes travaillant sur le quad se sont occupés de créer une partie de l’électronique qui contrôle ses voies et les convertit en des grandeurs permettant de piloter les actionneurs. D’autre part, dans les années futures des élèves permettront aux données capteurs embarqués sur le Quad d’être remontés vers le pilote grâce à la transmission sans fil et affichées sur PC. Nous étions 4 binômes sur ce projet et nous nous sommes répartis les tâches en 4 étapes. Le premier binôme, le nôtre, à simulé un récepteur radio 2.4GHz. (Nous y reviendrons plus tard.) Le second a codé l’émission : le passage du RS232 à Pwm. Le troisième a codé la réception : le passage de Pwm à RS232 Le quatrième, a tiré les canaux du récepteur et les a convertis en différents signaux. 3/15 ET3 Tuteur de Projet: Mr. Samir Bouaziz Présentation des outils Pour réaliser ce projet nous avons dû utiliser des outils que nous ne connaissions pas. Tout d’abord le microcontrôleur utilisé : nous avons programmé sur un microcontrôleur Arm7 MBED et plus particulièrement sur le MBED NPX LCP1768. Nous avons donc dû nous renseigner (principalement sur www.mbed.org ) pour apprendre les différentes bibliothèques et fonctions dont nous disposions. Le MBED NPX LCP1768 Le microcontrôleur MBED de NXP LPC 1768 est conçu pour le prototypage de toutes sortes de dispositifs, particulièrement ceux comprenant l’Ethernet, USB et la flexibilité d’un nombre d’interfaces périphériques et de mémoire instantanée. L’avantage de ces composant est qu’ils peuvent utiliser une multitude d’interfaces et de périphériques (par exemple des bus USB, des ports séries et Ethernet,…). Nous disposions d’un « CookBook » et d’un « HandBook » qui nous ont permis de comprendre 4/15 ET3 Tuteur de Projet: Mr. Samir Bouaziz Le Signal RS232 Nous allons simuler l’émission d’une trame de la radio commande. Pour cela, voici un petit rappel sur cette trame. Cette trame est un signal RS232. Elle est composée de 21 octets dont 2 bits de start et un bit de fin. Elle est transmise avec le format : 2 bits de start 2x9 FF FF 00 00 _ _ _ _ _ _ _ _ _ _ _ _ _ _ 1 bit de fin EE T= 115 200 bts/µs Cette trame est émise durant une période T de 115 200 bits/µsecondes. Elle est répétée sur un temps t. T t= 20000 µs Le RS232 est une norme standardisant un bus de communication de type série sur trois fils minimum. Les ports RS-232 sont désignés par les noms COM1, COM2, etc. Cela leur a valu le surnom de « ports COM », encore utilisé de nos jours. Cependant, il est de plus en plus souvent remplacé par le port USB. . 5/15 ET3 Tuteur de Projet: Mr. Samir Bouaziz Démarches et contraintes PROGRAMMATION DE LA CARTE MBED Notre objectif était donc de simuler un récepteur radio 2,4GHz. Pour cela nous avons donc codé un programme qui se lancera sur la carte MBED. Nous avons donc utilisé le compiler intégré à la page internet sur www.mded.org . En commençant par ajouter la bibliothèque « mbed.h », afin d’utiliser toutes les fonctionnalités de la carte pré installée. Nous avons utilisé les constantes suivantes : /**********************************************/ /*** BIBLIOTHEQUE ***/ /**********************************************/ #include "mbed.h" /***********************************************/ /*** CONSTANTES ***/ /***********************************************/ #define PERIODE = 20000 #define VITESSE_TRANS = 115200 #define PAS = 100 // microsecondes // bits/secondes La période correspond au ‘t’ et la vitesse de transition au T vu sur le schéma page 5(Le RS232). Le pas est l’indice que l’on peut modifier afin de faire varier plus ou moins la voie sélectionnée. Nous avons dû utiliser comme terminal TeraTerm, pour visualiser les données que l’on affiche dans notre programme. Pour pouvoir utiliser un terminal sur le PC, il faut intégrer le PC dans notre programme sur la MBED. Nous l’avons donc déclaré sous la forme : Serial pc (USBTX, USBRX); //tx,rx 6/15 ET3 Tuteur de Projet: Mr. Samir Bouaziz On déclare ensuite un port série sur les pattes p9 et p10 simulant le récepteur : Serial sercom (p9, p10); Pour finir on a également besoin d’un ticker, c’est une interface utilisée pour initialiser une interruption périodique qui appelle à plusieurs reprises une fonction à une période t choisie. (Nous reviendrons sur son utilité ultérieurement). Ticker periode_emission ; La génération de trame série simulant un récepteur radio 2.4GHZ s’effectue par l’intermédiaire d’une trame RS 232. Pour ce faire, nous avons travaillé avec le binôme Michaël/Anas pour obtenir la trame RS 232 qui est envoyée par la télécommande sur le récepteur. Grâce à leur algorithme qui permet d’afficher la trame en format RS 232 qui est émise par la télécommande, lorsque que l’on place tous les boutons à zéro, on obtient une trame que l’on supposera par défaut ; on prend désormais en compte la trame suivante : unsigned char trame[21] = {0xFF, 0xFF, 0xFF, 0xFF, 0x2B, 0x19, 0x2B, 0x86, 0x2B, 0x0B, 0x2B, 0x09, 0x2B, 0x4D, 0x2B, 0x0F, 0x2B, 0x4D, 0x2B, 0x33, 0xEE}; Pour nous permettre une visualisation de cette trame lors de la réalisation de notre programme, et de mieux voir où nous réalisions des erreurs, nous avons créé une fonction basique qui affiche la trame : /***************************************************************/ /*** Fonction qui affiche la trame ***/ /***************************************************************/ void affiche_trame( unsigned char *trame) { for(int i=0; i<21;i++) { pc.printf("0x%02X ",trame[i]); } pc.printf( "\r\n" ); } 7/15 ET3 Tuteur de Projet: Mr. Samir Bouaziz Suite à cette acquisition, on a exploré quel bouton/variateur agissait sur telle ou telle voie de la trame. Nous avons alors mis en évidence que les joysticks, les paramètres qui nous intéressent le plus pour le quad, occupent deux voies chacun. Comme nous avons configuré la télécommande de telle sorte que nous utilisons uniquement 5 voies, nous avons déterminé que la dernière voie correspond au bouton/variateur situé sur le côté latéral gauche de la télécommande. Nous avons ensuite testé les valeurs obtenues sur les voies en se positionnant sur les maximums et les minimums pour le variateur gauche, et les positions : haut, bas, droite, gauche. Nous nous sommes alors attaqué au cœur du programme. Le plus important est la liaison entre la carte et l’ordinateur avec les bons paramètres, notamment la vitesse de transmission qui doit correspondre à celle du format RS 232, celle par défaut étant pour l’ordinateur 9600 b/s. Nous avons donc utilisé la fonction baud qui nous permet d’initialiser cette vitesse à 115200b/s. Nous l’avons codé par définition de la manière suivante : sercom.baud (VITESSE_TRANS); Nous avons ensuite créé une fonction qui permet d’intégrer notre trame courante dans la MBED, c’est notre fonction émission, on utilise donc « sercom.putc (trame[i]); : /************************************************************************/ /*** Fonctions utilisées pour gérer le module de sortie ***/ /************************************************************************/ void emission() { unsigned short i; for(i=0;i<21;i++) { sercom.putc(trame[i]); } } Ensuite, nous avons utilisé la fonction attach qui est une fonction appelée par le ticker (vu cidessus qui rappelons-le répète une fonction avec une période donnée). Celle-ci prend donc en paramètre l’adresse de la fonction à répéter et l’intervalle de temps souhaité. periode_emission.attach_us (&emission, PERIODE); 8/15 ET3 Tuteur de Projet: Mr. Samir Bouaziz On demande ensuite à l’utilisateur de sélectionner la voie à modifier et la valeur souhaitée, étant donné que chaque voie s’échelonne sur 2 octets et que notre trame contient un seul octet dans chaque case du tableau trame. Ainsi, on a fait en sorte que la valeur entrée par l’utilisateur s’implémente correctement dans le tableau. /*******************************************************/ /*** MAIN ***/ /*******************************************************/ int main() { unsigned int val, voie; sercom.baud(VITESSE_TRANS); periode_emission.attach_us(&emission, PERIODE); affiche_trame(trame); while(1) { pc.scanf(" %u %u",&voie,&val); pc.printf("voie : %u, valeur : %u\r\n",voie, val); voie=voie*2; // trame[voie]= (val>>8)&0xFF; // on récupère le bit de poids fort et le modifie trame[voie+1]= val&0xFF; // on récupère le bit de poids faible et le modifie } return 0; } 9/15 ET3 Tuteur de Projet: Mr. Samir Bouaziz Quand le programme sur la MBED a été réalisé, nous avons visualisé sur l’oscilloscope le signal série. Nous avons pu alors observer le signal série suivant : Figure 1 – Signal Série RS232 de la MBED Figure 2-‐ Signal Série Zoomé RS232 de la MBED Il nous fallait, une fois la MBED programmée, intégrer un substitut de télécommande. 10/15 ET3 Tuteur de Projet: Mr. Samir Bouaziz INTEGRATION DE LA TELECOMMANDE Une fois que l’utilisateur peut saisir la voie et la valeur, nous pouvons alors intégrer le pavé numérique du clavier afin de simuler la télécommande, à l'aide des touches de direction du clavier. Cela nous permet une approche plus intuitive de la saisie d'une valeur pour une voie donnée. Il est donc indispensable de communiquer entre la carte et le clavier. La carte étant sur notre machine branchée au COM4. On ouvre à partir d'un nouveau programme, cette fois-ci codé avec Visual C 2008 et non plus l'interface de compilation du site mbed.org. Cette opération d'ouverture et d'écriture nécessite l'intégration de la librairie « Windows.h », qui intègre les paramètres principaux des fonctions importantes. Nous avons donc commencé par écrire la fonction init_port(char* pcComPort) qui retourne un port (type HANDLE). Cette fonction ouvre le port de nom pcComPort et écrit un message par défaut avec les vérifications nécessaire pour n'importe quel port. /********************************************************************/ /*** Fonctions qui ouvre le port serie de la mbed ***/ /********************************************************************/ HANDLE init_port(char* pcComPort) { DWORD rw; DCB dcb; BOOL b; HANDLE hCom; hCom = CreateFile(pcComPort, GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0); //On ouvre le port serie COM4 if( hCom == INVALID_HANDLE_VALUE) { // HANDLE invalide ? printf("Erreur lors de la création du HANDLE hCom. " ); printf("Le port ne peut pas être ouvert ?\n" ); return NULL; } BuildCommDCB("9600,n,8,1", &dcb); b=SetCommState(hCom, &dcb); if(!b) { printf( "Erreur lors du SetCommState" ); return NULL; } b = WriteFile(hCom, trame, strlen(trame), &rw, NULL); if(!b) { printf( "Erreur lors de l ecriture de la trame par defaut" ); return NULL; } return hCom; } 11/15 ET3 Tuteur de Projet: Mr. Samir Bouaziz Ensuite nous avons gérés la gestion des changements de valeurs à partir des touches directionnelles du pavé numérique dans la fonction reception( ). Nous avons assigné un pas déclaré constant. Ce pas nous permet pour chaque appuie sur une touche d'augmenter la valeur par défaut de la voie, gérée par cette touche. Puis nous récupérons les appuies grâce à la fonction getche( ) qui permet d'obtenir la saisie clavier (sans avoir a appuyer sur le retour chariot). Pour pouvoir utiliser cette fonction il nous a fallut inclure la bibliothéque « conio.h ». Puis pour finir nous avons dû ajuster notre code pour qu'il corresponde à celui programmer sur la mbed, notamment au niveau de la saisie par l'utilisateur de la voie et de la valeur que l'on automatise ici. On utilise la fonction WriteFile pour écrire la nouvelle trame modifiée par le switch suivant la valeur de getche. /************************************************************************/ /*** Fonction qui traite la voix sélectionnée au clavier ***/ /************************************************************************/ char reception() { BOOL success; DWORD BytesWriten; char c; c=getche(); switch(c) { case '8' : // corespond au joystick gauche en haut valtab[2]+= PAS; sprintf(trame,"3 %u\n\r",valtab[2]); //voie 3 break; case '2' : // corespond au joystick gauche en bas valtab[2]-= PAS; sprintf(trame,"3 %u\n\r",valtab[2]); //voie 3 break; case '4' : // corespond au joystick droit a gauche valtab[0]+= PAS; sprintf(trame,"1 %u\n\r",valtab[0]); //voie 1 break; case '6' : // corespond au joystick droit a droite valtab[0]-= PAS; sprintf(trame,"1 %u\n\r",valtab[0]); //voie 1 break; case '+' : // corespond au bouton lateral gauche au max (+) valtab[6]+= PAS; sprintf(trame,"7 %u\n\r",valtab[6]); //voie 7 break; case '-' : // corespond au bouton lateral gauche au min (-) valtab[6]-= PAS; sprintf(trame,"7 %u\n\r",valtab[6]); //voie 7 break; case 'q' : //quitter 12/15 ET3 Tuteur de Projet: Mr. Samir Bouaziz return 1; break; default : return 0; break; } /* Ecrit la voie modifiee dans le port COM */ success = WriteFile(mycom, trame, strlen(trame), &BytesWriten, NULL); if (!success) /* Verifie si il y a une erreur */ { printf("ERREUR EMISSION\n"); return 1; } return 0; } Nous avons aussi par la suite commencés à intégrer une manette de XBOX 360 de la même manière que nous avions codés l’ouverture du port du clavier. Cependant par manque de temps nous n’avons pas pu terminer cette démarche mais somme parven, après maintes recherches sur internet, à afficher les coordonnées des joysticks de la manette sur le pc. 13/15 ET3 Tuteur de Projet: Mr. Samir Bouaziz Répartition du travail Le but de ce projet était de réaliser un travail d’équipe. Nous avons unanimement décidé de travailler ensemble. Le projet a donc été réalisé à deux du début à la fin. Le travail en groupe nous paraît essentiel et bien plus instructif pour ce genre de projet De cette manière nous avons pu nous aider mutuellement sur nos lacunes et progresser. Chacun d’entre nous a donc participé à l’élaboration chaque fonction : en cherchant l'idée générale, en la traduisant en langage C ou bien encore en trouvant l'idée qui nous débloque après l'écriture d'une mauvaise fonction ou d’une fonction incomplète. 14/15 ET3 Tuteur de Projet: Mr. Samir Bouaziz Conclusion Notre programme C pour ce projet a été mené à son terme. Nous avons rencontré quelques difficultés que nous avons réussi à contourner ou à régler et nous avons également eu la volonté et le temps nécessaire pour commencer l’ajout d’une manette XBOX 360 comme substitut de télécommande pour contrôler notre MBED. Cette dernière étape nous permet de finaliser le projet en le rendant plus concret et plus attrayant. L’enseignement Projet C nous a permis d’une part de nous améliorer en programmation C et de pousser plus loin nos connaissances dans ce langage. D’autre part, on a pu voir en quoi consiste la réalisation d’un projet du début jusqu’à la fin en respectant un cahier des charges, c’est-à-dire les critères, volontés et contraintes imposées par le « client » tout en respectant également le temps imparti pour sa réalisation. 15/15 ET3 Tuteur de Projet: Mr. Samir Bouaziz