1ère année Module INFORMATIQUE INDUSTRIELLE 2ème partie Cours 2 2012-2013 Philippe Morenton COURS 2 - PREPARATION AU TD2 ET AU TD3 1 DEPLACEMENT D'UN PETIT ROBOT DONT LE FONCTIONNEMENT EST SIMULE EN TD Durant les TDs, on simule le fonctionnement d'un petit robot dont la base est la suivante : La carte Arduino ne peut pas fournir la puissance nécessaire au fonctionnement des moteurs. On intercale donc entre la carte Arduino et les moteurs une carte interface de puissance Ardumoto. VIN D5 D4 D3 D2 D1 D0 PWMB DIRB M GND A5 A4 A3 A2 A1 A0 GND VIN 5V Le schéma d'interconnexion des cartes et des Commande des moteurs simplifiée, en tout ou moteurs est le suivant : rien Pour simplifier, les alimentations ne sont pas représentées. PWMn DIRn 0 depuis X Moteur à l’arrêt MOTA_1 D13 longtemps D12 PWMA M D11 DIRA 1 0 Sens 1 de rotation. D10 D9 MOTA_2 ARDUINO Avance D8 ARDUMOTO D7 D6 MOTB_1 1 1 Sens 2 de rotation. Recul MOTB_2 2 DETECTION ET EVITEMENT D'OBSTACLES Pour détecter les obstacles, 3 capteurs sont montés à l'avant du robot. On retient 2 types de capteurs, mais il en existe d'autres. Pour la détection d'obstacles par contact, on utilise des interrupteurs avec de longues languettes. Pour la détection par infrarouge, on utilise des modules constitués d'un émetteur et d'un récepteur infrarouge. Un tel module délivre une tension qui dépend de la distance capteur/obstacle. 1 Le fonctionnement retenu pour le déplacement avec évitement d'obstacle est extrêmement simple: S'il n'y a pas d'obstacles détectés, le robot avance tout droit. S'il y a un obstacle détecté d'un côté, le robot recule en tournant plus du côté opposé à l'obstacle pendant une certaine durée, puis il continue à avancer tout droit. Si l'obstacle est détecté au centre, le fonctionnement est le même que si la détection se fait sur un des côtés choisi au hasard. Avec des capteurs plus élaborés, on peut retenir des algorithmes qui permettent un meilleur déplacement au milieu d'obstacles. Voir par exemple http://www.ensta-paristech.fr/~filliat/Courses/2011_projets_C102/BURLOT_FLORINS_PASCAL/evitement_obstacles.html http://wwwdfr.ensta.fr/Cours/docs/C10-2/chapitre6.pdf 3 COMMANDE DES MOTEURS AVEC UNE VITESSE VARIABLE Sous certaines conditions, un moteur à courant continu peut être commandé avec une tension rectangulaire ou « hachée ». Ci-contre l’allure de la commande et de la vitesse en fonction du temps. On se place dans le cas où DIR = 0 Le moteur tourne pour que le robot avance. Période du signal de commande PWM = T. Fréquence du signal de commande : F = 1/T PWM 1 0 Vitesse de rotation TB TH T T t Tracé simplifié Pour une fréquence suffisamment élevée t de PWM, les ondulations sont négligeables Si T (période du signal PWM) est suffisamment faible Ce n’est pas tout à fait le cas dans la figure ci-dessus. T est suffisamment faible si << constante de temps principale du moteur + charge entrainée () est lié à l’inertie. Lors d’un changement de commande pour la vitesse, celle-ci se stabilise après quelques . Ordre de grandeur de pour le moteur d'un petit robot : 0,1s il faut T < 1ms soit F > 1 KHz. T est constante. TH (= largeur d’impulsion ou durée à l’état haut) change. 2 La commande est de type On peut utiliser une fonction pour commander le rapport cyclique de PWM. Voir TD2. 4 FONCTIONNEMENT DE LA COMPILATION AVEC LA BIBLIOTHEQUE ARDUINO Le fonctionnement simplifié de la compilation est le suivant : Le fichier objet contient la traduction des instructions en langage machine. Un appel de fonction est traduit par un saut à un sous-programme. Le code de la fonction n'est pas dans le fichier objet. Ce code est extrait de la bibliothèque précompilée et placé dans le fichier pour la programmation. Le compilateur et l'éditeur de liens font partie d'AVR-GCC. 5 PROGRAMMATION SANS LA BIBLIOTHEQUE ARDUINO Si on n'utilise pas la bibliothèque Arduino, il faut se contenter des fonctions fournies avec AVR-GCC. Celles-ci sont peu nombreuses en ce qui concerne les spécificités du µC : gestion des E/S, des périphériques intégrés, etc. Sans la bibliothèque Arduino, il faut connaitre la structure interne du µC pour pouvoir écrire le programme. 6 LES ENTREES / SORTIES DU µC ATMEGA328P Comme chacune des entrées ou des sorties du µC correspond à une variable logique (ou binaire ou booléenne) qui a pour valeur uniquement 0 ou 1, on appelle fréquemment une connexion un bit = binary digit (chiffre binaire). On parle de bit d’entrée ou de bit de sortie. 3 Les entrées et sorties du µC sont regroupées par paquets. Chaque paquet peut être manipulé directement par le programme et s’appelle un port. En général les ports sont constitués de 8 connexions ou 8 bits. Le µC utilisé a les ports suivants : PORTB de 8 bits. Sur la carte Arduino, 6 bits sont disponibles sur connecteur : PB0 à PB5 PORTC de 7 bits. Sur la carte Arduino, 6 bits sont disponibles sur connecteur : PC0 à PC5. PORTD de 8 bits. Sur la carte Arduino, les 8 bits sont disponibles sur connecteur : PD0 à PD7. PORTB PORTC ARDUINO VIN Le schéma ci-contre monte la relation entre les ports et les repères des broches des connecteurs Arduino. 5V PORTD µC PB5 PORTC PC5 PC4 PC3 PC2 PC1 PC0 D13 D12 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 PORTB PORTD GND A5 A4 A3 A2 A1 A0 PB4 PB3 PB2 PB1 PB0 PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0 Sur le µC ATmega328p, 3 registres sont associés à chaque port, dont : Sur une entrée d’un port, il faut qu’un circuit extérieur puisse appliquer une tension 0V ou 5V. Sur une sortie d’un port, c’est le µC qui impose une tension 0V ou 5V Les repères des bits d’un port utilisent le rang car on peut associer une valeur numérique au mot binaire disponible sur un port. Exemple : Mot binaire appliqué en entrée du port D Repères des bits du port Poids des bits du port 1 0 1 1 0 0 1 0 PD7 27 PD6 26 PD5 25 PD4 24 PD3 23 PD2 22 PD1 21 PD0 20 4 La valeur numérique en base 10 est : Pour la plus grande souplesse possible, chaque broche de chaque port peut être utilisée en sortie ou en entrée. Dans ce dernier cas, on peut ajouter une résistance de rappel interne. Exemple : DDRD= 0b00001111; // les bits 7 à 4 sont en entrées, les autres en sortie Le registre DDR permet de réaliser un aiguillage. Data Direction Register = Registre sens de transfert x est le repère du port (B, C, D) y est le rang de l’E/S (0..7) DDRx0 DDRxy = 1 DDRx1 … DDRx7 Registre de données sortantes ou d’option PORTx0 PORTx1 Broches du µC PINxy Px0 Px1 La valeur de PORTxy sort en PxY … Registre de données entrantes Bus de données PORTx7 Pxy PORTxy DDRxy = 0 Px7 PORTxy = 0 PINx0 PINxy PINx0 … DDRxy = 0 +5V PINx0 R de rappel rajoutée PORTxy = 1 PINxy lorsque la broche est configurée en entrée. Voir la synthèse de la documentation constructeur traduite en français. Un dessin qui résume le fonctionnement extrait de : http://www.cours.polymtl.ca/inf1995/logiciel/progAvr/inf1995_comp lement.pdf 5 7 STRUCTURE D'UN PROGRAMME SANS LA BIBLIOTHEQUE ARDUINO La structure du programme le plus simple possible est la suivante : Inclusion de fichiers. Ici le fichier io.h permet d’inclure d’autres fichiers, dont le fichier de définition des registres (DDRD, PORTD, …) Fonction principale. Elle ne retourne pas de valeur. Cependant si on met void, il y a une erreur à la compilation. Les noms des registres apparaissent dans le programme #include <avr\io.h> int main(void) { DDRB=0b00001111; DDRD =0; PORTD=0b11111111; while(1) { PORTE=PIND; } } L'utilisation de la bibliothèque Arduino permettait de masquer des éléments de la structure précédente. La structure d'un programme Arduino est la suivante : L'utilisateur n'a qu'à définir setup() et loop(). Le code de main() est inséré lors de l'édition de liens. main est constitué de 2 parties : Une partie initialisation et configuration Une boucle sans fin réalisée avec while (1) {…} ou for( ;;) {…} #include <Arduino.h> int main(void) { … setup(); for (;;) { loop(); … } return 0; } 8 RAPPELS DE LOGIQUE La plupart des entrées sorties (E/S) sont de type logique (0 ou 1). On utilise de façon similaire les termes variable logique, binaire ou booléenne. Dans le 3ème TD, on utilise les opérations logiques pour que le programme réagisse à une entrée isolée parmi plusieurs ou pour commander une seule sortie. 6 8.1 NOTIONS DE BASE Tables de vérités Le tableau ci-dessous correspond aux tables de vérités des fonctions de bases. Les symboles des opérateurs sont ceux les plus utilisés en électronique. E1 E2 0 0 1 1 0 1 0 1 E1 ET E2 E1.E2 E1 OU E2 E1 + E2 E1 OU exclusif E2 E1 E2 NON /E1 0x= 1x= Identités remarquables x est une variable binaire quelconque 0.x= 1.x= 0+x= 1+x= Les opérateurs logiques du C ET OU OU exclusif Les opérateurs agissent bit à bit sur les opé& | ^ randes Remarque pour une variable de type booléenne, il faut utiliser ! pour l'opérateur NON. NON ~ 8.2 UTILISATION DES OPERATIONS LOGIQUES Mise à 1 de bits en sortie PORTB = PORTB | 0b01100011 ; valeur initiale b7 b6 b5 b4 b3 b2 b1 b0 | 0 1 1 0 0 0 1 1 ou PORTB |= 0b01100011 ; Résultat Remarque : si seul bit b5 à mettre à 1 : PORTB |= (1<<5); // 0000 0001 0010 0000 après 5 déc. Identique à PORTB |= 0b00100000; Mise à 0 de bits en sortie PORTB = PORTB & 0b01100011 ; valeur initiale b7 b6 b5 b4 b3 b2 b1 b0 & 0 1 1 0 0 0 1 1 ou PORTB &= 0b01100011 ; Résultat Remarque : si seul bit b5 à mettre à 0 : PORTB &= ~(1<<5); // 0000 0001 0010 0000 après 5 déc. // puis 1101 1111 après complémentation Identique à PORTB &= 0b11011111 ; Comlémentation de bit en sortie PORTB = PORTB ^ 0b01100011 ; ou PORTB ^= 0b01100011 ; valeur initiale ^ Résultat b7 0 b6 1 b5 1 b4 0 b3 0 b2 0 b1 1 b0 1 7 Test de bits en entrée if (PINA & 0b00000011 == 0b00000001) valeur PINA & Résultat pris en compte pour le test b7 0 b6 0 b5 0 b4 0 b3 0 b2 0 b1 1 b0 1 Les bits b7 .. b2 ne sont pris en compte pour le test. 9 FONCTIONNEMENT INTERNE SIMPLIFIE DU µC SUR UN EXEMPLE SIMPLE 9.1 EXEMPLE UTILISE Programme source : unsigned char var; int main(void) { DDRB = 0b00001111; while(1) { // Infinite loop var = PIND; PORTB = var; } PIND est le registre d'entrée du var est rangée en emplacement port D. Son adresse est 0x09 mémoire automatiquement (ou $09) attribué par le compilateur. PORTB est le registre de sortie. Son adresse est 0x04 (ou $04) 9.2 FONCTIONNEMENT INTERNE TRES SIMPLIFIE On ne s'intéresse qu'à la boucle sans fin. Pour introduire au fonctionnement, on peut représenter de façon très simplifiée la structure interne du µC et les échanges d'informations. Unité Centrale de Traitement + Mémoires PIND port D, vu comme un ensemble de registres port B, vu comme un ensemble de registres Le compilateur traduit le programme source comme ci-dessous. La variable var est placée dans le registre R24. PORTB 8 Prog. source Ad. mém. prog. var = PIND; 004A Contenu mém. prog. B189 Etiquette Mnémonique Champ opérande Commentaire l_004a in R24, $09 B985 out $05, R24 CFFD rjmp l_004a lire le registre d’adresse 10 (PIND) et mettre le contenu dans le registre R24 de la CPU Mettre le contenu de R24 dans le registre d’adresse 05 (PORTB) saut (jump, jmp) à l’étiquette l_004a. Le code du saut + le déplacement est dans CFFD PORTB=var; 004B 004C Le contenu de la mémoire programme est le code machine ou code exécutable. Les colonnes en grisé correspondent au langage d'assemblage. Le compilateur traduit d'abord le programme source en langage C en langage d'assemblage, puis ensuite en langage machine. En langage d'assemblage, il y a 1 instruction élémentaire du µC par ligne. Chaque instruction est désignée par son mnémonique. Ex : jmp pour jump. Le µC sait exécuter quelques dizaines d'instructions élémentaires : transferts entre registres, comme ici, addition, soustraction, etc. in R24, $09 est une instruction d'entrée. Elle est suivie de 2 opérandes: la destination et la source. out $05, R24 est une instruction de sortie. Elle est suivie de 2 opérandes: la source et la destination. rjmp est un saut (jmp = jump) La simulation en pas à pas dans VMLAB permet d'analyser le fonctionnement La fenêtre Ports permet d'observer les registres des ports. Port B PORTB DDRB Voir TD3. X : indéfini (entrée non connectée PINB I : Input O: Output P : Input + R Pullup 9 9.3 FONCTIONNEMENT INTERNE SIMPLIFIE 9.3.1 STRUCTURE INTERNE SIMPLIFIEE Le µC utilisé a une structure de type Harvard. Seuls les éléments utiles pour les explications qui suivent apparaissent : Sélection du circuit qui a accès au bus de données Bus d’adresses 14 liaisons = 14 bits instructions Décodeur d’adresses Bus d’adresses Données CPU = Unité Arithmétique et Logique + Registres + Compteur programme + … Mémoire programme (FLASH) Bus d’instructions Mémoire Données (RAM) Interface d’E/S (registres) Bus de données 16 bits 8 bits On ne représente que 2 Bus de contrôle ports d’E/S alors que le (lect. / écr., etc) µC en a plus 9.3.2 FONCTIONNEMENT PAR CYCLES On suppose que le µC a déjà exécuté tout ce qui précède les lignes de l’exemple. Recherche (Fetch) de l’instruction 1 (PIND R24). Décodeur d’adresses Adresse délivrée par le B189 B985 CFFD Mémoire Données (RAM) Vers le registre B189 Bus de données Code instruction + opérande (ad. reg. PIND) 10 Recherche de l’instruction 2 (R24 PORTB) et exécution de l’instruction 1 (PIND R24). Décodeur d’adresses Adresse délivrée à partir du registre instruction B189 B985 CFFD Vers le registre Seul le registre PIND d’adresse est sélectionné et a accès au bus de données Mémoire Données La valeur provenant (RAM) est de l’extérieur transférée sur le bus de données Registre B983 Code instruction + opérande (ad. registre PORTB) Recherche de l’instruction 3 (Saut) et exécution de l’instruction 2 (R24 PORTB) Décodeur d’adresses Adresse délivrée à partir du registre instruction B189 B985 CFFD Du registre Seul le registre PORTE d’adresse est sélectionné et a accès au bus de données Mémoire Registre Données (RAM) La valeur provenant de R24 est transférée à l’extérieur CFFD Code instruction + opérande (valeur du saut) Exécution de l’instruction 3 (Saut) = recherche de l’instruction à l’adresse 004A. 11 9.3.3 SIMULATION VMLAB permet de visualiser les registres de la CPU, avec la fenêtre Registers. Le registre instruction n'est pas visible. Voir TD3. Registres de la CPU R24 Compteur Programme (PC : Program Counter) Délivre l'adresse de la mémoire programme 10 DUREE D'EXECUTION D'UN PROGRAMME Chaque instruction prend un ou deux cycles machine pour s'exécuter. La plupart des instructions prennent 1 cycle machine. C'est l'avantage de la structure Harvard. La durée d'un cycle machine dépend d'une horloge de séquencement : l'horloge système. Cette horloge système est elle-même issue de l'oscillateur à quartz. Un système de division de fréquence permet d'obtenir la fréquence de l'horloge système. Pour la simulation, la fréquence du quartz est de 16MHz. Le µC est livré sortie d'usine avec une division en fréquence de 8. L'horloge système est de 2MHz, soit une période de 0,5µs. C'est cette valeur qui est prise en compte par le simulateur. Lors de la simulation, on peut observer la durée d'exécution des instructions dans la barre d'état. Barre d'état de VMLAB en bas à droite Pour, afficher le temps en µs, il faut utiliser le menu Options > Display Control 12