TP n°8 Mesure et Instrumentation Bilan Arduino [1] 1) Mesure : CAN et capteur 1.1) Caractéristiques d’un CAN : Exemple de CAN 4 bits : Un convertisseur analogique / numérique (CAN) est un circuit hybride qui transforme une grandeur analogique d'entrée E (souvent une tension) en une valeur numérique N exprimée sur n bits. Vref+ et Vref- représentent les tensions de références du convertisseur. Elles permettent de fixer les amplitudes maximales et minimales de la grandeur d'entrée à convertir. RESOLUTION : Elle est donnée par la valeur du quantum « q ». La résolution est la plus petite variation en entrée correspond à un changement de code en sortie. PRECISION : C'est l'écart entre la valeur réelle d'entrée et la valeur discrétisée. 1.2) Caractéristiques d’un Capteur : Un capteur est un organe de prélèvement d'information qui élabore à partir d'une grandeur physique, une autre grandeur physique de nature différente (très souvent électrique). Cette grandeur représentative de la grandeur prélevée est utilisable à des fins de mesure ou de commande. * Etendue de mesure : Valeurs extrêmes pouvant être mesurée par le capteur. (Ex : 0°C – 100 °C) Résolution : Plus petite variation de grandeur mesurable par le capteur. Sensibilité : Variation du signal de sortie par rapport à la variation du signal d'entrée. Ex : Le capteur de température LM35 a une sensibilité de 10mV / °C. Précision : Aptitude du capteur à donner une mesure proche de la valeur vraie. Rapidité : Temps de réaction du capteur. La rapidité est liée à la bande passante. Mesure et Instrumentation TP n°8 Bilan Arduino [2] Exercice d’application : Dans le laboratoire nous disposons de PT100 (capteur de température) et de son conditionneur afin d’obtenir une tension de sortie adaptée au microcontrôleur. - grandeur de mesure Température - gamme de mesure T = 0 à 100 °C - sortie courant : 4 - 20 mA ; résistance de charge <1000 Ω si VPS = 28 V. A l’aide d’une résistance de charge RL = 250 Ω, nous transformons la sortie courant en sortie tension (cf schéma) 1. Déterminer la gamme de sortie tension. Est-elle adaptée à un microcontrôleur ? 2. Exprimer T(Vs) 3. Calculer la sensibilité de l’ensemble PT100+conditionneur. Cet ensemble vous semble-t-il plus performant qu’un LM35 ? L’Arduino dispose d’un CAN 10 bits avec une tension de référence de 5 V ou 1,1 V (référence de tension interne) 4. Quelle est la référence de tension la mieux adaptée à notre PT100 + Conditionneur. Calculer le quantum q de l’Arduino. 5. A une température T on associe une tension numérisée codée par le nombre entier A. Que vaut A pour T = 0°C, puis pour T = 100 °C ? 6. Exprimer T(A) 7. Quelle est la résolution de l’ensemble PT100+Conditionneur+Arduino ? Nous pouvons aussi utiliser une carte SysamSP5 (avec Latis Pro) : 8. Quel est le calibre d’entrée le mieux adapté à notre PT100 + Conditionneur. Calculer alors le quantum q. 9. Quelle est la résolution de l’ensemble PT100 + Conditionneur + SP5 ? 10. Quelle est la précision de l’ensemble PT100 + Conditionneur + SP5 ? Mesure et Instrumentation TP n°8 Bilan Arduino [3] 2) Instrumentation : le langage de programmation Arduino Le langage Arduino est basé sur les langages C/C++. Avec Arduino, nous devons utiliser un code minimal lorsque l'on crée un programme. Ce code permet de diviser le programme que nous allons créer en deux grosses parties. void setup() { //fonction d'initialisation de la carte //contenu de l'initialisation } void loop() { //fonction principale, elle se répète (s’exécute) à l'infini //contenu de votre programme } La fonction setup() est appelée au démarrage du programme. Cette fonction est utilisée pour initialiser les variables, le sens des broches, les librairies utilisées. La fonction setup n'est exécutée qu'une seule fois, après chaque mise sous tension ou reset (réinitialisation) de la carte Arduino. Après avoir créé une fonction setup(), qui initialise et fixe les valeurs de démarrage du programme, la fonction loop () (boucle en anglais) fait exactement ce que son nom suggère et s'exécute en boucle sans fin, permettant à votre programme de s'exécuter et de répondre. Utiliser cette fonction pour contrôler activement la carte Arduino. 2.1 La syntaxe de base • • • • • • Chaque instruction se termine par un « ; » ; Les accolades « {« et « } » sont les "conteneurs" du code du programme. Elles sont propres aux fonctions, aux conditions et aux boucles. Les instructions du programme sont écrites à l'intérieur de ces accolades ; Les commentaires sont des lignes de texte incluses dans le programme et qui ont pour but de vous informer vous-même ou les autres de la façon dont le programme fonctionne. Ces lignes ajoutées sont ignorées par le compilateur. Les commentaires sont précédés des caractères « // » ou bien encadrés par « /* » et « */ » ; Il est formellement interdit de mettre des accents en programmation, sauf dans les commentaires. Un nombre en binaire doit être précédé de la lettre « B » ; Un nombre écrit en hexadécimal doit être précédé par les caractères « 0x ». 2.2 Les constantes Constante HIGH LOW INPUT OUTPUT TRUE FALSE Description niveau haut logique niveau bas logique entrée sortie vrai faux TP n°8 Mesure et Instrumentation Bilan Arduino [4] 2.3 Les variables Une variable est un nom que vous donnez à un emplacement en mémoire RAM dans lequel vous stockerez des données. Une variable est définie par son nom et son type. Les variables acceptées par Arduino sont : Type boolean int long byte unsignedint word unsignedlong float double char Tailleenmémoire 1 octet(8 bits) 2 octets(16 bits) 4 octets(32 bits) 1 octet(8 bits) 2 octets(16 bits) 2 octets(16 bits) 4 octets(32 bits) 4 octets(32 bits) 4 octets(32 bits) 1 octet(8 bits) Typededonnées Valeur binaire 0 ou 1 Valeur entière Valeur entière Valeur entière Valeur entière Valeur entière Valeur entière Valeur à virgule Valeur à virgule Valeur entière – Code ASCII 2.4 Les opérations simples • • • Les opérateurs mathématiques sont: = égalité + addition - soustraction * multiplication / division % modulo Les opérateurs de comparaison sont: == Egal à != différend de < Inférieur à > Supérieur à <= Inférieur ou égal à >= Supérieur ou égal à Les opérateurs booléens && ET booléen || OU booléen ! NON booléen signe Non signée signée signée Non signée Non signée Non signée Non signée signée signée signée Valeursmin/max 0/1 -32 768 / +32767 -2 147 483 648/ +2147483 647 0 / +255 0 / +65535 0 / +65535 0/+4294 967 295 -3.4028235E+38 / +3.4028235E+38 -3.4028235E+38 / +3.4028235E+38 -128 / +127 TP n°8 Mesure et Instrumentation Bilan Arduino [5] 2.5 Les instructions conditionnelles algorithme Si condition alors action fin si Si condition alors action 1 sinon action 2 fin si Programmation en langage Arduino if ( … ) { …; } if ( … ) { …; } else { …; } Exemple if (x==2) { y=x; } if (x==2) { y=x; } else { y=x+1; } Les accolades peuvent être omises après une instruction if. Dans ce cas, la suite de la ligne (qui se termine par un point-virgule) devient la seule instruction de la condition. Tous les exemples suivants sont corrects : if (x > 120) digitalWrite (LEDpin, HIGH); if (x > 120) digitalWrite (LEDpin, HIGH); if (x > 120){digitalWrite (LEDpin, HIGH); } // toutes ces formes sont correctes algorithme Programmation en langage Arduino switch (var) { case 1 : ... break; case 2 : ... break; default: } //début de la structure //cas 1 //l'instruction break est en option //cas 2 //l'instruction break est en option //cas par défaut (non-obligatoire) Exemple switch (entree){ case 1: a=10;break; case 2: a=15;break; case 3: a=20;break; default: a=0; } 2.6 Les boucles algorithme tant que condition faire action fin tant que répéter action tant que condition Pour indice de Vi à Vf par pas de x faire action fin pour Programmation en langage Arduino while( … ) { …; } do { …; } while (…) ; while (x<10) { x++; } do { x++; } while (x<10); for( indice = …; indice <Vi; indice = indice +x) { …; } for(i=0;i<10;i++) { x=x+2 ; } Gestion du temps : Réalise une pause dans l'exécution du programme pour la durée (en millisecondes ou microsecondes) indiquée en paramètre. delay (ms); delayMicroseconds (us) Mesure et Instrumentation TP n°8 Bilan Arduino [6] 2.7 Les fonctions prédéfinies les plus utilisées Fonctions pinMode(broche,mode) Description Configure la broche spécifiée pour qu'elle se comporte soit en entrée, soit en sortie. Cette fonction est placée dans le Setup. Met un niveau logique HAUTou BAS sur digitalWrite(broche,valeur) une broche numérique. int digitalRead(broche) int analogRead(broche) Paramètres broche: le numérode la broche de la carte Arduino dont le mode de fonctionnement (entrée ou sortie) doit être défini. Pour les entrées analogiques on utilise les références A0,A1 etc.,à la placedu simple numéro de la broche. mode: INPUTou OUTPUT broche: le numéro de la broche de la carte Arduino valeur: HIGH ou LOW(ou bien 1 ou 0) Lit le niveau logique d'une broche en entrée numérique, et renvoie la valeur HIGH ou LOW. broche: le numéro de la broche numérique que vous voulez lire Lit la valeur de la tension présente sur la broche spécifiée. La carte Arduino Uno comporte 6 voies analogiques connectées à un convertisseur analogique- numérique 10 bits. Cela signifie qu'il est possible de transformer la tension d'entrée entre 0 et 5V en une valeur numérique entière comprise entre 0 et 1023. broche: le numéro de la broche analogique sur laquelle il faut convertir la tension analogique appliquée (0 à 5 sur la carte Arduino Uno). broche: la broche utilisée pour "écrire" l'impulsion. Cette broche Génère une impulsion de largeur / période devra être une broche ayant la voulue sur une broche de la carte Arduino analogWrite(broche,valeur) (PWM- Pulse Width Modulation en anglais ou fonctionPWM, Par exemple, sur la UNO, ce pourra être une des MLI- Modulation de Largeur d'Impulsion en broches 3,5 ,6,9,10 ou 11. valeur: la largeur du "duty français). cycle" (proportion de l'onde Ceci peut être utilisé pour faire briller une carréequi estau niveauHAUT): LED avec une luminosité variable ou entre 0 (0% HAUT donc toujours contrôler un moteur à des vitesses variables. au niveau BAS) et 255 (100% Le signal obtenu peut servir de commande à un HAUT donc toujours au niveau montage de type hacheur à transistor. HAUT). map(value, fromLow, fromHigh, toLow, toHigh) Ré-étalonne un nombre d'une fourchette de value: le nombre à ré-étalonner valeur vers une autre fourchette. fromLow : bas de la fourchette de Cette fonction est très utile pour effectuer des départ changements d'échelle automatiques. fromHigh : haut fourchette de Cette fonction ne contraint pas les valeurs à départ rester dans les limites indiquées, car les valeurs toLow : fourchette de destination en dehors de la fourchette sont parfois toHigh : fourchette de destination attendues et utiles. Mesure et Instrumentation Fonctions Serial.begin(debit); TP n°8 Bilan Arduino [7] Description Fixe le débit de communication en nombre de caractères par seconde (l'unité est le baud) pour la communication série. En cas d'utilisation du terminal série, IL FAUDRA FIXER LE MEME DEBIT dans la fenêtre du Terminal ! Cette fonction est placée dans le Setup. Paramètres int debit: debit de communication en caractères par seconde (ou baud). Pour communiquer avec l'ordinateur, utiliser l'un de ces débits : 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, or 115200. val: la valeur à afficher. N'importe quel type de données. Affiche les données sous le port série sous forme lisible pour les humains (texte ASCII). Serial.print(val, format) Serial.println() ajoute un retour de chariot CR format : spécifie la base utilisée (code ASCII : 13) et un saut de ligne LF (10). (pour les nombres entiers) ou le Serial.println(val) nombre de décimales (pour les nombres de type float) Serial.print(val) Serial.write(val) Serial.available(); Serial.parseInt() Serial.read(); pulseIn(broche, valeur, delai_sortie) Ecrit des données binaires sur le port série. Ces val : une valeur à envoyer sous données sont envoyées comme une série d'octet; forme d'octet simple (code ASCII) pour envoyer les caractères correspondants aux chiffres d'un nombre, utiliser plutôt la fonction print(). Renvoi le nombre d'octet disponible pour lecture dans la file d'attente (buffer) du port série, ou 0 si aucun caractère n'est disponible. Si Aucun une donnée est arrivée, Serial.available() sera supérieur à 0. La file d'attente du buffer peut recevoir jusqu'à 128 octets. Retourne le premier entier (format unsigned long : de 0 à 4 294 967 295 = 232 - 1 ) contenu dans le buffer série. Les caractères qui ne sont Aucun pas des chiffres (notamment le signe -) sont ignorés. Serial.parseInt() arrête de lire le buffer série au premier caractère qui n'est plus un chiffre. Lit les données entrantes sur le port Série. Renvoi le premier octet de donnée entrant Aucun disponible dans le buffer du port série, ou -1 si aucune donnée n'est disponible. (int) Lit la durée d'une impulsion (soit niveau HAUT, broche: le numéro de la broche sur laquelle vous voulez lire la soit niveau BAS) appliquée sur une broche durée de l'impulsion. (type int) (configurée en ENTREE). valeur: le type d'impulsion à L'instruction renvoie la durée de l'impulsion en "lire" : soit HIGH (niveau HAUT) ou LOW (niveau BAS). (type int) microsecondes. L'instruction s'arrête et renvoie delai_sortie (optionnel): le nombre 0 si aucune impulsion n'est survenue dans un de microsecondes à attendre (1 temps spécifié. seconde par défaut)