2) Instrumentation : le langage de programmation Arduino

publicité
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)
Téléchargement