Cours d’Arduino Elaboré par : - Mr MATINE Salim
2 Plan : 1- Introduction 2- Les entrées et sorties Numériques 3- Les entrées et sorties Analogiques 4- La communication série 5- Utilisation du librairie liquidcrystal 6- Le codeur incrémental 7- Asservissement avec moteur à courant continu
3 1- Introduction A)Qu’est ce qu’un microcontrôleur Les cartes Arduino font partie de la famille des microcontrôleurs. Un microcontrôleur est une petite unité de calcul accompagné de mémoire, de ports d’entrée/sortie et de périphériques permettant d’interagir avec son environnement. Parmi les périphériques, ont recense généralement des Timers, des convertisseurs analogique-numérique, des liaisons Séries, etc. On peut comparer un micro contrôleurs à un ordinateur classique, mais système d’exploitation et avec une puissance de calcul considérablement plus faible.
4 1- Introduction B)Caractéristiques techniques de l’Arduino UNO Un des modèles les plus répandu de carte Arduino est l’Arduino UNO. C’est la première version stable de carte Arduino. Elle possède toutes les fonctionnalités d’un microcontrôleur classique en plus de sa simplicité d’utilisation. Elle utilise une puce ATmega328P cadencée à 16Mhz. Elle possède 32ko de mémoire flash destinée à recevoir le programme, 2ko de SRAM (mémoire vive) et 1 ko d’EEPROM (mémoire morte destinée aux données). Elle offre 14 pins (broches) d’entrée/sortie numérique (données acceptée 0 ou 1)dont 6 pouvant générer des PWM, Elle permet aussi de mesurer des grandeurs analogiques grâce à ces 6 entrées analogiques. Chaque broche est capable de délivré un courant de 40mA pour une tension de 5V.
5 1- Introduction B)Caractéristiques techniques de l’Arduino UNO
6 2- Les entrées et sorties Numériques La carte Arduino Uno possède 14 entrées sorties numérique TOR, il s’agit d’une part des broches numérotées de 0 à 13. -Une entrée : Le programme peut lire une tension présente sur cette broche en utilisant digitalRead(,,,), comme cette tension est interprétée comme un chiffre binaire (0 ou 1), la datasheet du uC de l’Arduino Uno garantit que toute tension inférieur à 1V sera comprise comme 0 et toute tension supérieur à 3,5V sera comprise comme 1, Entre les deux c’est flou état indéterminé -Une sortie : Le programme peut écrire un chiffre binaire, au moyen de digitalWrite(,,,), chiffre qui dans le programme sont nommées HIGH pour 1 et LOW pour 0, qui sera traduit par une tension de 5V ou 0V. -Certaines entrées peuvent également être utilisées en sortie PWM, les broches 0 et 1 servent aussi à la communication série.
7 2- Les entrées et sorties Numériques Exemple d’une application: Clignotement d’un Led et commande d’un relais sous ISIS Proteus
8 2- Les entrées et sorties Numériques Exemple d’une application: Clignotement d’un Led et commande d’un relais sous ISIS Proteus
9 3- Les entrées et sorties Analogiques Les Arduino sont pourvus de 6, pour le Uno, à 16 entrées analogiques, pour le Mega. Ce sont les broches étiquetées A suivie d’un nombre. Les tensions, toujours entre 0 et 5V, présentes sur ces broches, peuvent être numérisées via un convertisseur analogique-numérique ou ADC (Analog Digital Converter). La fonction analogRead(,,,) remplit ce rôle,
10 3- Les entrées et sorties Analogiques Le convertisseur des Arduino à base d’AVR effectue une conversion sur 10 bits, c’est à dire qu’il convertit la tension en un nombre entier ayant une valeur de 0 à correspond au 0V de la tension et 1023 au 5V. La résolution, c’est à dire la différence entre deux valeurs successives de la tension correspondant à une différence de 1 sur l’entier résultat, est donc d’environ 5mV. Il est possible de changer la tension de référence de la conversion analogique-numérique, c’est à dire la tension comprise comme Le MCU des Arduino possède une référence de tension interne de 1,1V qui peut être sélectionné à la place de la tension d’alimentation. Cela permet une meilleure résolution, environ 1mV, sur les faibles valeurs de tension à convertir. Il est également possible de sélectionner la tension fournie sur la broche AREF comme tension de référence.
11 3- Les entrées et sorties Analogiques Convertisseur Analogique/Numérique Un convertisseur analogique-numérique (CAN, parfois convertisseur A/N, ou en anglais ADC pour Analog to Digital Converter ou plus simplement A/D) est un montage électronique dont la fonction est de traduire une grandeur analogique en une valeur numérique (codée sur plusieurs bits), proportionnelle au rapport entre la grandeur analogique d'entrée et la valeur maximale du signal.
12 3- Les entrées et sorties Analogiques Convertisseur Analogique/Numérique Un convertisseur analogique-numérique (CAN, parfois convertisseur A/N, ou en anglais ADC pour Analog to Digital Converter ou plus simplement A/D) est un montage électronique dont la fonction est de traduire une grandeur analogique en une valeur numérique (codée sur plusieurs bits), proportionnelle au rapport entre la grandeur analogique d'entrée et la valeur maximale du signal.
13 3- Les entrées et sorties Analogiques Exemple d’une application: Lire une valeur depuis un capteur de température et puis faire allumer ou éteindre une LED
14 4- La communication série En communication série, on découpe l'information à transmettre en petits blocs de taille fixe avant de la transmettre. La taille des blocs correspond au nombre des lignes disponibles pour la transmission des données. Ce type de communication s'oppose à la communication parallèle. En communication parallèle, il y a une ligne par bits à transmettre. Tous les bits sont donc transmis en même temps. Pour une même fréquence de communication, la communication parallèle est donc plus rapide. L'avantage de la communication série sur la communication parallèle est qu'elle nécessite moins de lignes, donc moins de broches, donc moins de composants. Son coût est donc plus faible. Présentation
15 4- La communication série Vocabulaire Ascii : c'est l'acronyme de American Standard Code for Information Exchange, soit code américain pour l'échange d'information. Ce code permet de représenter avec des nombres compris entre 0 et 127 les caractères utilisés dans l'alphabet américain soit : Les lettres, minuscules et majuscules Les symboles de ponctuation :., ; Des caractères spéciaux : $ # * + Pas les accents Baud (Bd) : Unité de mesure du nombre de symboles transmissibles par seconde. Il ne faut pas le confondre avec le nombre de bits par seconde (bps). Par exemple, considérons que l'on souhaite transmettre le symbole ascii a en 1 seconde exactement. D'après la table ascii a s'écrit en binaire Pour transmettre ce symbole en 1 seconde, il faut communiquer avec une vitesse de 1 Bd mais de 8 bps.table ascii
16 4- La communication série Communication avec le moniteur série Avant de rentrer vraiment dans la communication, je vous signale que deux diodes présentes sur la Arduino, peuvent être utiles : TX : s'allume lors d'une transmission RX : s'allume lors d'une réception
17 4- La communication série Exemple de communication Il consiste à envoyer des données sur le port série de la Arduino de d'utiliser l'outil intégré à l'IDE pour voir les données envoyées. Lancez l'éditeur Arduino et entrez le code ci-dessous : Dans la fonction setup, on initialise simplement le port série en donnant sa vitesse avec Serial.begin(9600). En effet, pour que la carte et l'ordinateur communique correctement, ils doivent « parler » à la même vitesse. Une vitesse différente est une erreur fréquente au début. Pensez à la vérifier si vous rencontrez des problèmes. Dans la fonction loop, on se contente d'envoyer "Coucou" avec Serial.println("Coucou").
18 4- La communication série Exemple de communication Vérifiez dans Outils > Carte que la bonne carte est sélectionnée et dans Outils > Port série que le bon port est choisi. Si tout est bon, utilisez le bouton Téléchargements pour envoyer le code sur la carte. Ouvrez le moniteur série avec Outils > Moniteur série. Vérifiez en bas à droite que la valeur est bien à 9600 Bd. Si tout va bien, vous devriez voir le moniteur se remplir de Coucou.
19 4- La communication série Exemple d’une communication série avec la carte Arduino et le PC
20 5- Utilisation de la librairie LiquidCrystal LCD signifie « Liquid Crystal Display » et se traduit, en français, par « Écran à Cristaux Liquides » Ces écrans sont PARTOUT ! Vous en trouverez dans plein d’appareils électroniques disposant d’afficheur : les montres, le tableau de bord de votre voiture, les calculatrices, etc. Cette utilisation intensive est due à leur faible consommation et coût. Mais ce n’est pas tout ! En effet, les écrans LCD sont aussi sous des formes plus complexes telles que la plupart des écrans d’ordinateur ainsi que les téléviseurs à écran plat. Tableau significatif du LCD
21 5- Utilisation de la librairie LiquidCrystal Tableau significatif du LCD
22 5- Utilisation de la librairie LiquidCrystal Montage à 8 Pins
23 5- Utilisation de la librairie LiquidCrystal Déclaration des constantes de broches Déclaration des constantes pour les broches utilisées dans le programme : les broches de commandes RS et E, les broches de données D4 à D7. const int RS=2; //déclaration constante de broche const int E=3; //déclaration constante de broche const int D4=4; //déclaration constante de broche const int D5=5; //déclaration constante de broche const int D6=6; //déclaration constante de broche const int D7=7; //déclaration constante de broche Déclarations des objets utiles pour les fonctionnalités utilisées Liquidcrystal lcd(RS, E, D4, D5, D6, D7);// Création d'un objet Liquidcrystal = initialisation LCD en mode 4 bits
24 5- Utilisation de la librairie LiquidCrystal Au niveau de la fonction d'initialisation setup( ) : Initialisation de l'utilisation de l'afficheur LCD alphanumérique lcd.begin(20,4); // Initialise le LCD avec 20 colonnes x 4 lignes delay(10); // pause rapide pour laisser temps initialisation Test de l'afficheur LCD alphanumérique // Test du LCD lcd.print("LCD OK") ; // affiche la chaîne texte - message de test delay(2000); // pause de 2 secondes lcd.clear(); // // efface écran et met le curseur en haut à gauche delay(10); // pour laisser temps effacer écran
25 5- Utilisation de la librairie LiquidCrystal Exemple d’application pour un afficheur LCD
26 6- Le codeur incrémental La croissance de la puissance des systèmes de traitement ainsi que les impératifs de productivité appellent dans tous les domaines de production industrielle un besoin d’information continue sur le déplacement, la position, la vitesse des outils ou des produits.
27 6- Le codeur incrémental Les systèmes de détection conventionnels (interrupteurs et détecteurs de positions), qui ne peuvent fournir que des informations Tout Ou Rien à des endroits prédéterminés ne répondent que partiellement aux besoins de précision et de flexibilité. Dans le cas d’un codeur, le positionnement du mobile est entièrement maîtrisé par les systèmes de traitement et non plus réalisé physiquement par le positionnement d’un interrupteur de position sur la machine. Traitement de surface :Permet de déterminer la position des différents bacs de traitement Découpe de pièces à longueur prédéfinie
28 6- Le codeur incrémental Le codeur optique est lié mécaniquement à un arbre qui l’entraîne en rotation. Ce sont des informations sur la rotation de cet arbre que l’on souhaite connaître (vitesse ou valeur de la rotation, nouvelle position angulaire atteinte…) Le codeur émet divers signaux électriques à destination de la partie commande chargée de les exploiter et de leur donner un sens (par décodage, comptage, mesure de la fréquence…) Principe de fonctionnement Ils sont constitués d’un disque comportant des zones opaques et des zones translucides. Le nombre de ces zones et leur disposition dépendent de la nature du codeur et du type d’information que l’on souhaite obtenir.
29 6- Le codeur incrémental Principe de fonctionnement Des diodes électroluminescentes (LED) émettent une lumière qui peut traverser les zones translucides. Des phototransistors, situés de l’autre côté du disque en regard des LED, captent cette lumière lorsqu’ils sont face à une ouverture et délivrent un signal électrique, image de la présence de cette ouverture.
30 6- Le codeur incrémental Types de codeurs Il existe deux principaux types de codeurs optiques: Les codeurs incrémentaux qui délivrent une information de déplacement angulaire du disque sous forme d’un train d’impulsions. Les codeurs numériques de position (codeurs absolus), pour lesquels chaque position du disque correspond à une valeur numérique différente identifiable par la partie commande. Le codeur incrémental le codeur incrémental est destiné à des applications où l’information de position est obtenue par mesure du déplacement de l’objet. Le codeur délivre un train d’impulsions dont le nombre permet de déduire la valeur du déplacement ainsi que la vitesse car cette dernière est proportionnelle à la fréquence des impulsions.
31 6- Le codeur incrémental Le codeur incrémental Il est constitué d’un disque comportant deux à trois pistes : A et Z. Piste intérieure (Z: top zéro), qui ne comporte qu’une seule fe nêtre et qui délivre qu’un signal par tour du disque. Ce « top zéro » permet de réinitialiser la partie commande et de connaître une position d’origine. Piste extérieure (A),divisée en intervalles d’angles égaux, alternativement opaques et transparents. C’est le nombre de fenêtres ainsi créées qui détermine la résolution du capteur.
32 7- Asservissement avec moteur à courant continu
33 7- Asservissement avec moteur à courant continu Régler les coefficients du PID Le réglage des coefficients Kp, Ki et Kd d'un PID peut se faire expérimentalement par essais/erreurs. Tout d'abord, sachez qu'il ne sert à rien de vouloir régler les trois coefficients en même temps ! Il y a trop combinaisons possibles et trouver un triplet performant relèverait de l'exploit. Il vaut mieux y aller par étape.
34 7- Asservissement avec moteur à courant continu - Tout d'abord, il faut mettre en place un simple régulateur proportionnel (les coefficients Ki et Kd sont donc nuls). Par essais/erreurs, il faut régler le coefficient Kp afin d'améliorer le temps de réponse du système. C'est-à-dire qu'il faut trouver un Kp qui permette au système de se rapprocher très vite de la consigne tout en faisant attention de garder la stabilité du système : il ne faut pas que le système réponde très vite tout en oscillant beaucoup ! Une fois ce coefficient réglé, on peut passer au coefficient Ki. Celui-là va permettre d'annuler l'erreur finale du système afin que celui-ci respecte exactement la consigne. Il faut donc régler Ki pour avoir une réponse exacte en peu de temps tout en essayant de minimiser les oscillations apportées par l'intégrateur ! Enfin, on peut passer au dernier coefficient Kd qui permet de rendre le système plus stable. Son réglage permet donc de diminuer les oscillations.
35 7- Asservissement avec moteur à courant continu En général, pour régler ces coefficients, on donne au système une consigne fixe (exemple : pour un moteur : tourne à 3 tours par seconde) et on observe la réponse du système (exemple : l'évolution du nombre de tours par seconde du moteur au cours du temps). Le graphe résultant possède donc cette forme :
36 7- Asservissement avec moteur à courant continu Le PID parfait n'existe pas, tout est une question de compromis. Certaines applications autoriseront un dépassement afin d'améliorer le temps de stabilisation, alors que d'autres ne l'autoriseront pas (exemple, contrôler un stylo pour écrire sur une feuille. S'il y a dépassement dans le PID, le stylo traversera la feuille). Tout dépend donc du cahier des charges. Chacun des coefficients à un rôle à jouer sur la réponse à une consigne : L'erreur statique, c'est l'erreur finale une fois que le système est stabilité. Cette erreur doit être nulle. Pour diminuer l'erreur statique, il faut augmenter Kp et Ki. Le dépassement, c'est le rapport entre le premier pic et la consigne. Ce dépassement diminue si Kp ou Ki diminuent ou si Kd augmente. Le temps de montée correspond au temps qu'il faut pour arriver ou dépasser à la consigne. Le temps de montée diminue si Kp ou Ki augmentent ou si Kd diminue. Le temps de stabilisation, c'est le temps qu'il faut pour que le signal commette une erreur inférieure à 5% de la consigne. Ce temps de stabilisation diminue quand Kp et Ki augmentent.
37 7- Asservissement avec moteur à courant continu Le moteur et la codeuse Le moteur que l'on va utiliser est un motoréducteur 29:1 avec une roue codeuse monté sur l'arbre moteur. Les caractéristiques intéressantes à noter sont : 350 tours de roue minutes tours d'arbre moteur minute (environ 170 par seconde) 32 transitions montante et descendante de la codeuse par tour d'arbre moteur 928 transitions montante ou descendante de la codeuse par tour de roue Câblage du moteur à l'Arduino Si on ne dispose pas de shield Arduino pour contrôler un moteur à courant continue, il suffit de câbler une petite interface de puissance très basique.
38 7- Asservissement avec moteur à courant continu Câblage du moteur à l'Arduino
39 7- Asservissement avec moteur à courant continu Câblage du moteur à l'Arduino Le transistor Q2 pilote le MOSFET de puissance. Lorsque la sortie 9 de l'arduino est à l'état haut, Q1 est bloqué et le moteur ne tourne pas. A l'inverse, lorsque la sortie 9 de l‘Arduino est à l'état bas, alors Q1 devient passant et le moteur tourne à plein régime. Le moteur se contrôle donc en "tout ou rien", ce qui tombe bien, car la sortie "analogique" de l'Arduino est en réalité une sortie PWM de rapport cyclique ajustable. Décodage d’un signaux en quadrature d’un codeur incrémental Un codeur incrémental est un capteur renvoyant deux signaux carrés entre 0 et 5V, en quadrature de phase, permettant de compter ou décompter des incréments de déplacement, ou de mesurer une vitesse de déplacement. Ils sont généralement optiques
40 7- Asservissement avec moteur à courant continu Décodage d’un signaux en quadrature d’un codeur incrémental Les deux signaux proviennent de deux capteurs (phototransistors ou capteurs à effet Hall) en décalage d'un quart de période. Les figures ci-contre représentent les deux voies d'acquisition pour un sens de rotation horaire et trigonométrique. Lors d'une inversion de sens, les signaux inversent leur déphasage relatif. Chaque front du signal correspond à un évènement que le microcontrôleur est capable de détecter (un top).
41 7- Asservissement avec moteur à courant continu Décodage d’un signaux en quadrature d’un codeur incrémental Il y a donc 4 front (4 tops) par période des signaux provenant du capteur. Les deux voies du capteur sont branchées sur des entrées “interruption” du microcontrôleur, c'est-à dire des entrées susceptibles de détecter le changement d'état du signal (le front). Lorsqu'un changement d'état est détecté, le programme principal est temporairement arrêté pour traiter une fonction “interrupt”, puis reprend à la suite. Cette fonction d'interruption peut traiter le comptage ou décomptage en fonction de l'état des signaux. En notant A et B les états des signaux juste après le front détecté, et MA et MB les états des signaux mémorisé avant le front détecté (variable logiques 0 ou 1), exprimer la condition booléenne conduisant à incrémenter le compteur de top (sens horaire) ou à décrémenter le compteur de tops (sens trigonométrique), noté “cpt”. Ecrire le code en C à l'aide d'une structure “if” (les opérations booléennes s'écrivent || pour le OU logique et && pour le ET logique)
42 7- Asservissement avec moteur à courant continu Décodage d’un signaux en quadrature d’un codeur incrémental Il suffit pour cela d’observer les courbes ci-dessus, obtenues alors que le moteur tourne dans le sens positif. On constate que : – Lorsque la voie A passe au niveau haut, la voie B est au niveau bas – Lorsque la voie A passe au niveau bas, la voie B est au niveau haut Quand le moteur tourne dans le sens positif, lors d’une interruption sur la voie A, les niveaux de A et B sont donc inversés. Si le moteur tourne dans le sens négatif. On constate que : – Lorsque la voie A passe au niveau haut, la voie B est au niveau haut. – Lorsque la voie A passe au niveau bas, la voie B est au niveau bas.
43 Le programme d’acquisition des impulsions se base sur la fonction suivante : attachInterrupt ( interruption, fonction, mode) Lorsqu’une interruption externe survient cette instruction spécifie la fonction à appeler. La plupart des cartes Arduino ont deux interruptions externes : interruption externe n°0 sur la broche numérique 2 et interruption externe n°1 sur la broche numérique 3. Les paramètres de cette fonction sont : – interruption : le numéro de l’interruption (type int) – fonction : la fonction à appeler quand l’interruption survient ; la fonction doit recevoir aucun paramètres et ne renvoie rien. Cette fonction est également appelée une routine de service d’interruption (ou ISR). – mode : définit la façon dont l’interruption externe doit être prise en compte. Quatre constantes ont des valeurs prédéfinies valables : – LOW : pour déclenchement de l’interruption lorsque la broche est au niveau BAS – CHANGE : pour déclenchement de l’interruption lorsque la broche change d’état BAS/HAUT – RISING : pour déclenchement de l’interruption lorsque la broche passe de l’état BAS vers HAUT (front montant) – FALLING : pour déclenchement de l’interruption lorsque la broche passe de l’état HAUT vers l’état BAS (front descendant) 7- Asservissement avec moteur à courant continu Décodage d’un signaux en quadrature d’un codeur incrémental
44 7- Asservissement avec moteur à courant continu Décodage d’un signaux en quadrature d’un codeur incrémental int pinA = 2 ; //Channel A connecte sur l ’ i nterruption externe numero 0 ( pin2 ) int pinB = 3 ; //Channel B connecte sur pin3 int iValue = 0 ; // initialisation 0 void setup ( ) { Serial. begin (9600) ; pinMode ( pinA, INPUT) ; pinMode ( pinB, INPUT) ; attachInterrupt ( 0, encoderClick, RISING) ; // routine de service d ’ interruption ( ou ISR ). } void loop ( ) { Serial. println ( iValue ) ; // lecture des implusions sur le moniteur serie delay ( 1 0 ) ; // periode d ’ echantillonage
45 7- Asservissement avec moteur à courant continu Décodage d’un signaux en quadrature d’un codeur incrémental } void encode rCl i ck ( )// la fonction appelee par l ’ i n terruption externe numero 0 { // read value from both encoder pins int valA = digitalRead ( pinA) ; int valB = digitalRead ( pinB ) ; // compare pins to determine in which direction encoder was turned i f ( valA != valB ){ // pinA just changed but pinB had not yet changed // Direction must be clockwise if A changes before B iValue++; } e l s e { // pinA just changed and pinB had already done so. // Direction must be counter−clockwise i f B changes before A iValue−−; }
46 7- Asservissement avec moteur à courant continu Commande du moteur avec la carte Arduino La carte Arduino Uno dispose de 6 sorties (3,5,6,9,10 et 11) qui peuvent être utilisées en mode PWM, c’est-à-dire en modulation de largeur d’impulsion. Ce sont des signaux logiques binaires de fréquence constante (500Hz) mais de rapport cyclique variable. Lorsqu’un moteur ou une lampe est alimenté par ce type de tension, tout se passe comme si il était alimenté par une tension continue ajustable entre 0V (rapport cyclique= 0) et 5V (rapport cyclique=255).Ces sorties doivent être initialisées comme des sorties digitales.
47 7- Asservissement avec moteur à courant continu Commande du moteur avec la carte Arduino La syntaxe de l’instruction permettant de générer le signal PWM est la suivante : analogWrite(pin, valeur) ; – pin : la pin sur la quelle on souhaite envoyer le signal (3,5,6,9,10 ou 11). – valeur : le rapport cyclique entre 0 et 255.
48 7- Asservissement avec moteur à courant continu Présentation du schéma électronique Le circuit électronique ci-dessous permet de contrôler un moteur à courant continue à partir des sorties PWM de la carte Arduino. Ce circuit doit amplifier le courant de sortie de la carte Arduino avec la résistance de protection 1K) et doit aussi supporter la variation du rapport cyclique du signal PWM. Parmi les transistors pouvant satisfaire ces conditions on a choisit le TIP121. Les composants utilisés sont les suivants :
49 – Le transistor TIP122 : C’est un transistor Darlington NPN qui d’après la fiche technique permet d’amplifier le courant jusqu’à 5A avec son gain d’amplification ”au minimum” = 1000 – La diode 1N4004 : Dans une charge inductive (bobines), le courant ne peut pas se stopper instantanément. Cette diode joue le rôle d’une diode de roue libre qui permet au courant de s’arrêter progressivement. 7- Asservissement avec moteur à courant continu Présentation du schéma électronique Exemple de programme pour la commande de moteur – Commande direct du moteur avec la carte Arduino
50 7- Asservissement avec moteur à courant continu Exemple de programme pour la commande de moteur – Commande direct du moteur avec la carte Arduino int cmd=90 ; //commande void setup ( ) { pinMode ( 6,OUTPUT) ; // Configuration du pin 6 comme s o r t i e void loop ( ) { analogWrite ( 6,cmd) ;// Transfert de ces donnees sur l a pin 6 pour genererle }