Cours:ArduinoPlaqueEssais
Sommaire
Matériel nécessaire
Nous utiliserons :
- 1 carte arduino nano
- 1 plaque à essais
- 1 led Rouge
- 1 led verte
- résistances
- 2 x 330Ω
- 2 x 330kΩ
- 2 x 100Ω
- 1 x 100kΩ
- 2 x 1kΩ
- 1 photorésistance (ldr)
+ 1 lot de résistances en vrac
Quelques leds
Nous utiliserons lors de ce TP 2 leds (verte et rouge) qui resteront donc connectées jusqu'à la fin.
Calculer la valeur de la résistance avec les données suivantes :
- On prendra Vf = 2 V (tension directe (Forward) aux bornes de la led : lorsqu'elle s'éclaire)
- On souhaite If = 10 mA (intensité du courant dans la led)
- On rappelle que la tension d'alimentation arduino UNO est de 5V => cette tension représente donc un niveau logique '1'
Câbler alors ces leds sur la carte de la façon suivante :
Couleur | Pin arduino |
---|---|
Rouge | 8 |
Verte | 9 |
Écrire (et vérifier !) un programme tel que :
- les leds sont allumées en alternance
- chaque led reste allumée pendant 500ms
Grandeur analogique
Dans le premier tp, nous avons utilisé uniquement des entrées/sorties binaires. Nous allons découvrir ici les mesures analogiques.
Une explication du monde analogique peut se trouver sur wikipedia au besoin.
Affichage sur liaison série
Afin de pouvoir afficher les valeurs lues, mais également pour écrire des programmes plus complexes, nous allons utiliser la liaison série.
Vous allez découvrir le principe de la liaison série sur le site ladyada.
Lire/comprendre/exécuter les programmes jusqu'à la partie Pythagore.
Rque : Il convient de terminer la lecture de la page pour les prochains TPs
Mesure analogique, principe
La page dédiée du site arduino donne quelques détails sur l'utilisation et les caractéristiques du convertisseur analogique-numérique de la carte arduino UNO.
Syntaxe | val = analogRead(arduinoPin) | ||||
---|---|---|---|---|---|
Paramètres |
|
Le code suivant donne la structure minimum permettant d'utiliser le Convertisseur Analogique Numérique
const char analogPin = A0;
unsigned int analogVal;
void setup()
{
}
void loop()
{
// lecture de la tension sur la patte "analogPin"
analogVal = analogRead(analogPin);
// utilisation de cette valeur
}
Mesure de luminosité
Vérification du fonctionnement
Connecter la photorésistance (LDR) tel qu'indiqué sur la figure. Vous utiliserez l'entrée analogique A5.
Écrire un programme qui lit la valeur de la tension aux bornes de la LDR et affiche la valeur convertie sur la liaison série
Extremums
Sachant que les capteurs ne peuvent être strictement identiques, ils donneront tous des valeurs (normalement légèrement) différentes pour un même éclairement.
Le programme doit donc être capable de s'adapter automatiquement au capteur. Pour se faire, il est nécessaire de trouver les valeurs maximum et minimum renvoyées.
Réaliser un programme permettant de trouver ces extrêmes, en vous appuyant sur l'algorithme suivant :
- initialiser maxi à la plus petite valeur possible (ici 0)
- initialiser mini à la plus grande valeur possible (ici 1023)
- répéter
- lire la valeur du capteur => val
- si val > maxi
- changer la valeur de maxi
- si val < mini
- changer la valeur de mini
Jour, nuit ?
Utilisons maintenant les leds à disposition de la façon suivant :
- s'il fait jour, allumer la led verte
- s'il fait nuit, allumer la led rouge
Écrire un programme répondant au cahier des charges, en utilisant les valeurs extrêmes.
Luminosité en %
L'objectif est d'afficher la valeur mesurée en pourcentage de la valeur maximum d'éclairement mesurée.
Si la valeur actuellement mesurée est
- la valeur min, on affichera 0%.
- la valeur max, on affichera 100%.
Une valeur en pourcentage ne dépend que des valeurs minimum, maximum et de la mesure. On peut donc écrire le prototype de la foncion comme suit :
// les paramètres sont des "int" car : 0 < val,min,max < 1024 (car conversion sur 10 bits)
// par contre on retourne unsigned char car entre 0 et 100
unsigned char valPourcent(int val, int min, int max);
Modifier votre programme pour utiliser la fonction valPourcent(), que vous devrez bien entendu déclarer.
Mesure d'une résistance
Principe .... le pont diviseur !?
Soit le schéma ci contre, vous allez dans cette partie écrire un programme permettant de trouver la valeur de la résistance inconnue.
Vous constatez qu'il s'agit d'un simple montage appelé communément "pont diviseur".
On notera Vm la tension de mesure, soit la tension aux bornes de la résistance (Rm) à mesurer.
Donner l'expression de la tension Vm en fonction de R1, Vcc et Rm.
Donner ensuite l'expression de la valeur numérique donnée par le convertisseur (tension de référence 5v).
Mesure de la résistance
Présence de la résistance ?
- allumer led rouge si pas de résistance
- allumer led vert sinon
Correspondance mesure, valeur de résistance
Comme déjà indiqué dans ce TP, la valeur numérique mesurée est un nombre entre 0 et 1023 (valeur sur 10 bits). 0 correspond à une tension de 0V et 1023 correspond à une tension de 5V.
Il vous est donc possible de modifier la formule du pont diviseur pour prendre en compte ces valeurs sur 10 bits. On notera désormais CAN la valeur retournée par le convertisseur analogique numérique.
Donner l'expression de la valeur de CAN (avec donc CAN entre 0 et 1023) en fonction de R1, 1023 et Rm. En déduire la valeur de l'expression de Rm en fonction des autres paramètres.
Réaliser un programme qui lit la valeur analogique correspondant à la résistance à mesurer, la convertit en une valeur en Ohms et envoie cette valeur sur la liaison série.
Valeur normalisée
On désire maintenant améliorer le programme précédent pour qu'il soit capable de retrouver quelques valeurs normalisées et donc le code des couleurs correspondant. Pour simplifier on va d'abord se contenter des valeurs [10k,100k] (bornes comprises).
Valeurs de la série E12 associée
On vous demande de chercher (sur internet) les 12 valeurs de la série E12. Vous allez ensuite précalculer les valeurs CAN pour cette série et les ranger dans un tableau de 13 cases (puisque 100k fait partie de ce qui est demandé).
int valeurs[]={30,36,44,53,64,... a completer....} // 1023.Rm/(Rm+R)
Compléter le tableau ci-dessus.
Recherche de la valeur la plus proche du tableau
Étant donné que vos résistances ne sont pas forcément très précises, une lecture d'une valeur sur le convertisseur ne donnera pas forcément une valeur exacte du tableau précalculé. Il vous faut donc écrire un programme qui trouve dans le tableau la valeur la plus proche de votre lecture du convertisseur.
Écrire un programme dans lequel le tableau précédent est présent. Puis après lecture du convertisseur analogique numérique, vous allez parcourir le tableau à la recherche de la valeur précalculée la plus proche et une fois trouvée, noter le numéro de la case dans laquelle elle se trouve et envoyez-le par la liaison série pour un test.
Indication : Ne vous faites pas piéger, la valeur la plus proche doit être calculée avec une distance, c'est à dire une valeur absolue autrement vous aurez des problèmes. En effet, une distance négative -23 serait plus petite qu'une distance positive +2 !!!!!
const char analogPin = A0;
int valeurs[13]={30,36,44,53,64,... A COMPLETER.....}; // 1023.Rm/(Rm+R)
void setup() {
// a compléter
}
void loop() {
int can,distanceMINI=1024,distance;
unsigned char i,numeroCase;
// lecture de la tension sur la patte "analogPin"
can = analogRead(analogPin);
// recherche du numero de case dans le tableau
for (i=0;i<13;i++) {
distance = can - valeurs[i];
if (distance <0) distance = -distance;
if (distance < distanceMINI) {
distanceMINI = distance;
numeroCase = i;
} // if
} // for
// sortie sur la liaison série à compléter
// attente d'une seconde
delay(1000);
Affichage du code des couleurs
Compléter le programme précédent pour un envoi du code des couleurs en lieu et place du numéro de la case du tableau.
Indication :
Vous pourrez faire cela avec un switch du genre
switch(numero_de_case) {
case 0 : Serial.println("Marron Noir Orange");break;
case 1 : Serial.println("Marron Rouge Orange");break;
//..... a completer .....
case 12 : Serial.println("Marron Noir Jaune");break;
Plus loin encore pour les plus rapides
Comment étendre le travail réaliser à une gamme plus grande de résistance ? Une technique consiste à ranger les seules 12 valeurs normalisées (plutôt que les valeurs précalculées du CAN) dans le tableau. On calculera ensuite au fur et à mesure les valeurs attendues et l'on cherchera la résistance qui donne la valeur la plus proche. Les valeurs du tableau seront multipliées par 1000, puis 10000 puis 100000 pour balayer les multiplicateurs (Orange, Jaune et Vert).
Indication : La seule grande différence avec l'exercice précédent est donc que le tableau nous sert à faire les calcules au fur et à mesure avec les multiplicateurs qui augmentent. Une fois trouvé le minimum, il vous faut noter la valeur de la résistance et le coefficient multiplicateur. Les valeurs du "switch" ne seront plus les même mais le principe peut rester. Trouver la couleur multiplicative peut elle aussi se faire à l'aide d'un autre "switch".
Réaliser le programme correspondant et le tester.
ATTENTION ! Le calcul 1023*valeurE12 ne peut pas se faire dans une variable de type int car cela peut dépasser le 32567 maximum de ce type de variable.