Support :
Transcription
Support :
STI2D Option SIN AP2.2: commande robot par arduino Première Informatique Durée prévue : 4h. Problématique : Mise en application programme Arduino pour commander le déplacement d’un Robot (matériel et programmation) Compétences visées Être capable de modifier et de créer des programmes Arduino Savoirs associés Plan de l’étude 1. Découverte du robot et différents cartes 2. Fonctionnement des ports de la carte Arduino 3. Analyse d'un programme 4. Améliorations du programme 5. Télécommande Nunchuk 6. En bonus Logiciels Arduino Mode de distribution Dossier technique associé Dossier ressource associé Fichiers programmes Remarque Explication du matériel Matériels Carte Arduino Uno Circuit Shield Arduino commande moteur de Sparkfun Chassis Robot+ alimentation Telecommande Nunchuk Format papier et numérique Classeur Shield ou schema_Danger_Shield.pdf Classeurs Arduino ou language Arduino.pdf et schema_carte_Arduino_Uno.pdf Programme1.txt et test_NUNCHUK.txt Matériels nécessaires : 1 module Arduino UNO 1 Platine Motor Driver Shield Découverte du robot et de sa carte de commande « Motor driver Shield » 1. a. Motor Driver Shield Il existe plusieurs Shield de commande de moteur. Le Shield utilisé ici est le Ardumoto de Sparkfun. Les plans, le principe de fonctionnement et un programme de démonstration est disponible à l’adresse suivante : https://learn.sparkfun.com/tutorials/ardumoto-shield-hookup-guide/introduction Cette carte permet de contrôler 2 moteurs à courant continu de manière indépendante. Chaque moteur est commandé par 2 ports de la carte Arduino : - Un port numérique (0 ou 1) permet de définir le sens de rotation du moteur (DIRA et DIRB dans le programme). - Un port PWM (Pulse Width Modulation : Modulation de largeur d’impulsion) permet de définir la vitesse du moteur. AP2.2 commande robot par arduino_eleves.odt Page 2 sur 13 b. Le robot Les deux moteurs sont totalement indépendants, l’un peut tourner dans un sens et le second dans l’autre sens et à des vitesses différentes. Chaque moteur se connecte à Motor driver Shield comme indiqué sur la photo ci-dessous Les fils de moteur peuvent être connecte de n’importe quelle façon. En cas d’inversion, le contrôle de direction du moteur est échangé aussi. À côté de chaque connexion des moteurs se trouve une paire de LEDS bleu et jaune, qui indique la connexion de votre moteur b. Le Robot Leds c. Assemblage des différents éléments Vérifier que la carte Arduino Uno, le shield Ardumoto et le robot sont connectés comme sur la photo. N'oubliez pas de connectez une alimentation extérieure (pile 9V, alim 7à12V, …) afin de fournir la puissance nécessaire aux moteurs (ce que ne peut faire le port USB) Afin d'avoir tous les mêmes références il faut monter la carte de cette façon : Moteur B Moteur A AP2.2 commande robot par arduino_eleves.odt Page 3 sur 13 2. Fonctionnement des ports de la carte Arduino Rappel : La carte Arduino commande chaque moteur par l’intermédiaire de 2 ports : DIR qui détermine le sens et PWM la vitesse Fonction DIR : Ressource : https://learn.sparkfun.com/tutorials/ardumoto-shield-hookup-guide/board-overview 12 DIR A A digital signal to control the rotation direction of motor A (e.g. HIGH=CW, LOW=CCW). 13 DIR B A digital signal to control the rotation direction of motor B (e.g. HIGH=CW, LOW=CCW). Fonction PWM : Lire document « La génération d'impulsion modulée en largeur (ou PWM - Pulse Width Modulation) » L'exemple montre comment utiliser une sortie "analogique" (PWM) pour atténuer la luminosité d'une LED ou la vitesse d’un moteur. La modulation de la largeur d'impulsion (MLI ou PWM), est une technique pour obtenir des effets d'allure analogique avec des broches numériques. Le contrôle numérique est utilisé pour créer une onde carrée, un signal basculant entre un niveau HAUT et BAS, 0V et 5V. Cette succession de niveaux HAUT/BAS peut simuler des tensions entre le niveau HAUT (5 Volts) et le niveau BAS (0 Volts) en faisant varier la proportion du temps où le signal est HAUT sur la proportion de temps où le signal est BAS. La durée du temps du niveau HAUT est appelé largeur d'impulsion, ou encore "duty cycle" (cycle de travail en français). Pour obtenir une variation analogique, il suffit de changer ou de modifier cette largeur d'impulsion. En répétant la succession de niveaux HAUT/BAS assez rapidement avec une LED par exemple, le résultat est semblable à celui que l'on obtiendrait en contrôlant la luminosité de la LED avec une tension régulière entre 0 et 5V. Dans le graphique ci-dessous, les lignes vertes représentent une période de temps régulière. Cette durée, ou période, est l'inverse de la fréquence du signal PWM (qui est une onde carrée). En d'autres termes, avec une fréquence PWM générée par la carte Arduino de l'ordre de 500hz, l'espace entre 2 lignes mesure 2 1 1 T= = =0 .002 s=2ms F 500 millisecondes. Un appel de la fonction analogWrite(valeur) utilise une valeur comprise entre 0 et 255, tel que analogWrite(255) utilise 100% du cycle (toujours au niveau HAUT), . La valeur 0 correspond ainsi à 0% du cycle de travail (duty cycle). AP2.2 commande robot par arduino_eleves.odt Page 4 sur 13 a) Déterminer la valeur de la fonction analogWrite si l’on souhaite une « vitesse moteur » à N/2. ………………………………………………………………………………. ………………………………………………………………………………. b) Quel est dans ce cas, l’allure du cycle ? 5v 0v c) Soit le cycle de PWM 3. - Déterminer le contenu de la fonction analogWrite : - Déterminer la valeur de la tension moyenne envoyée : ………..... - Quel est la vitesse du moteur dans ce cas ? analogWrite( N°PIN, ..…….) N/4 N/2 3N/4 Analyse d'un programme (programme1.txt) Ouvrir le fichier « programme1.txt ». Copier le contenu de ce fichier dans un Sketch Arduino (il s'agit du logiciel de programmation Arduino). A. Dans une partie du programme, on trouve : driveArdumoto(MOTOR_A, CCW, 255); delay(1000); driveArdumoto(MOTOR_A, CW, 127); delay(1000); stopArdumoto(MOTOR_A); a) Que signifient les lignes de programme précédentes ? ………………………………………………………………………………. ………………………………………………………………………………. ………………………………………………………………………………. ………………………………………………………………………………. ………………………………………………………………………………. ………………………………………………………………………………. AP2.2 commande robot par arduino_eleves.odt Page 5 sur 13 b) Quel mouvement fait le robot ? ………………………………………………………………………………. ………………………………………………………………………………. ………………………………………………………………………………. ………………………………………………………………………………. B. Charger le et analyser le programme par rapport au mouvement. ………………………………………………………………………………. ………………………………………………………………………………. ………………………………………………………………………………. ………………………………………………………………………………. C. Faire l’algorithme complet du programme 4. Améliorations du programme A. Nous nous proposons d'améliorer le programme. Pour cela vous allez créer 3 nouvelles fonctions, une fonction 'marche_AV', une fonction 'marche_AR' et une fonction 'arret' (on se servira des fonctions 'driveArdumoto' et 'stopArdumoto' déjà présentes dans le programme). La variable Vitesse sera rajoutée. Modifier le programme pour que le robot avance à pleine vitesse pendant 2 seconde, s'arrête 1 seconde, recule à 1/3 de la vitesse max pendant 3 Validation professeur : seconde et s'arrête 2 secondes tout cela grâce à ces nouvelles fonctions. Faites les essais et ensuite faites valider par le professeur B. On va maintenant créer les fonctions qui vont permettre de faire tourner notre véhicule. Faire des essais pour trouver la meilleure solution pour tourner. Créer les fonctions 'tourne_AV_droite', 'tourne_AV_gauche', 'tourne_AR_droite' et Validation professeur : 'tourne_AR_gauche'. Faites les essais et ensuite faites valider par le professeur. AP2.2 commande robot par arduino_eleves.odt Page 6 sur 13 Pensez à faire une sauvegarde de votre programme. Il sera réutilisé dans la 2ème partie de la question 5. 5. Télécommande Nunchuk On va maintenant utiliser une télécommande filaire Nunchuck. Données techniques : La carte Arduino Uno est capable de communiquer avec des périphériques par bus I2C à l’aide de ses entrées analogiques 4 et 5 avec la configuration suivante : Entrée analogique 4 (A4) : SDA (serial data line) Entrée analogique 5 (A5) : SCL (serial clock line) Depuis la version Uno R3 (celle que l'on possède nous), deux nouvelles broches SDA et SCL peuvent être utilisées pour cela. Elles se trouvent à côté de la broche AREF. Remarque : le bus I²C (Inter Integrated Circuit) fait partie des bus série (les données passent à la queue leu leu, c'est à dire les une à la suite des autres). La connexion sera réalisée avec un adaptateur : 4 fils sont nécessaires pour connecter la Nunchuk à un circuit électronique, ou une carte arduino : • 2 fils pour l’alimentation de la manette : +3,3 Vcc Masse (la masse doit être commune à tous les composants branchés sur le bus I2C) • 2 fils pour la communication par bus I2C : SDA -> serial data line (par où transitent les données) SCL -> serial clock line (horloge de synchronisation) AP2.2 commande robot par arduino_eleves.odt Page 7 sur 13 Ce qui donne sur notre adaptateur : - : relié à la masse (ground ou GND) + : relié au 3,3V d : relié au SDA c : relié au SCL cela donne : Cette manette contient un joystick 2 axes, 2 boutons et un accéléromètre 3 axes à ±2G. Les données issues des capteurs de la nunchuk sont codées sur 6 octets (voir tableau ci-après): •1 er Octet (adresse 0x00) : Valeur de l’axe X du joystick analogique (0 à 255). AP2.2 commande robot par arduino_eleves.odt Page 8 sur 13 •2 ème Octet (adresse 0x01) : Valeur de l’axe Y du joystick analogique (0 à 255). •3 ème Octet (adresse 0x02) : Valeur de l’axe X de l’accéléromètre. Cette valeur est codée sur 10 bit et dans cet octet sont inscrits les 8 bit de poids fort (bit 9 à 2). •4 ème Octet (adresse 0x03) : Valeur de l’axe Y de l’accéléromètre. Cette valeur est codée sur 10 bit et dans cet octet sont inscrits les 8 bit de poids fort (bit 9 à 2). •5 ème Octet (adresse 0x04) : Valeur de l’axe Z de l’accéléromètre. Cette valeur est codée sur 10 bit et dans cet octet sont inscrits les 8 bit de poids fort (bit 9 à 2). •6 ème Octet (adresse 0x05) : bit 0 → Etat du bouton Z (0: appuyé ; 1: relâché) bit 1 → Etat du bouton C (0: appuyé ; 1: relâché) bit 2 et 3 → 2 bit de poids faible de la valeur de l’accéléromètre en X (bit 1 et 0) bit 4 et 5 → 2 bit de poids faible de la valeur de l’accéléromètre en Y (bit 1 et 0) bit 6 et 7 → 2 bit de poids faible de la valeur de l’accéléromètre en Z (bit 1 et 0) 5.1 Essai de la télécommande Nunchuk AP2.2 commande robot par arduino_eleves.odt Page 9 sur 13 Vous allez essayer le programme présent dans le fichier : test_NUNCHUK.txt Copiez ce programme dans le programme Arduino Sketch. Essayez ce programme (on visualise les donner dans la console « moniteur série » (menu « outils). 1. Essayer de voir ce qui se passe quand on fait toutes les actions possibles sur la manette. Comme par la suite on ne va utiliser que le joystick, on va travailler sur la partie du programme le concernant. 2. Relevez dans le programme le nom des variables des valeurs de position du joystick. ………………………………………………………………………………………. ………………………………………………………………………………………. 3. Faites des essais et relevez les différentes positions (x,y) de la manette (compléter ci dessous) positions: (….. , …..) (….. , …..) (….. , …..) (….. , …..) positions: (….. , …..) (….. , …..) ( ….. , …..) (….. , …..) En résumé : sur le déplacement sur l'axe des x : gauche centre droite …….. ………. …….... valeur : AP2.2 commande robot par arduino_eleves.odt sur l'axe des y : (….. , …..) Haut …….... centre ……... bas …….. Page 10 sur 13 4. Compléter les phrases suivantes : La marche avant va donc est validée par la position y entre ………. et ………. La marche arrière va donc est validée par la position y entre ………. et ………. On tourne à droite quand la position x est entre ………. et ………. On tourne à gauche quand la position x est entre ………. et ………. 5.2 Application avec notre véhicule à chenilles Maintenant vous allez intégrer la gestion de la télécommande nunchuk à votre programme de gestion du véhicule à chenilles de telle sorte que celui-ci soit commandé par le joystick de la télécommande (marche avant, marche arrière, tourner, vitesses proportionnelles à la position du joystick, …). Il peut être intéressant d'utiliser la fonction Arduino MAP() pour calculer la vitesse en fonction de la position de la manette. Etape 1 : différents modes d'action Il y a 9 modes d'actions possibles suivant la position de la manette : compléter le graphe ci-dessous Marche Avant Tourner à droite en avançant …………………………….... ………………….…………... Tourner à droite (surplace) ………………...……………. ………………….…………... ……………………….. Arrêt AP2.2 commande robot par arduino_eleves.odt Page 11 sur 13 Etape 2 : quand lancer ces différents modes d'action ? Il faut donc savoir laquelle de ces actions on doit faire. Par exemple : (compléter les conditions) •Arrêt : 120<joy_x_axis<140 et 120<joy_y_axis<140 •Marche avant : 120<joy_x_axis<140 et joy_y_axis>140 •Tourner à droite en avançant : ……………………………………………… •Tourner à droite (surplace) : ……………………………………………… •…………………………….. : ……………………………………………… •…………………………….. : ……………………………………………… •…………………………….. : ……………………………………………… •…………………………….. : ……………………………………………… •…………………………….. : ……………………………………………… Etape 3 : écriture en langage Arduino Pour l'arrêt : ou if (joy_x_axis>120) if (joy_x_axis>120 && joy_x_axis<140 && ….) { if (joy_x_axis<140) { if (joy_y_axis>120) Remarque : la fonction logique ET est possible avec Arduino à condition de l'écrire : && { if (joy_y_axis<140) { ARRET Modifier le programme et essayer. Quand tout fonctionne, Faire valider par le professeur. Validation professeur : AP2.2 commande robot par arduino_eleves.odt Page 12 sur 13 6. En bonus Créer les fonctions 'accélération_AV' et 'accélération_AR' (la vitesse part de 0 jusqu'à celle spécifiée) et les fonctions 'décélération_AV' et 'décélération_AR' (la vitesse part de la vitesse en cours jusqu'à 0). Vous utiliserez une boucle For et une fonction Delay. Le réglage de la vitesse d'accélération ou de ralentissement sera réglable (3=lent (environ 5-6sec), 2=plus rapide, 1=rapide, 0=très rapide) et réalisée grâce à la fonction Delay placée dans la boucle For). Faites les essais et ensuite faites valider par le professeur. Validation professeur : AP2.2 commande robot par arduino_eleves.odt Page 13 sur 13