Cours:ArduinoPlaqueEssais

De troyesGEII
Aller à : navigation, rechercher

Retour à la liste des Tps

Éléments de correction

Matériel nécessaire

ArduinoNanoPinout.png

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

CommandeLed.png

Nous utiliserons lors de ce TP 2 leds (verte et rouge) qui resteront donc connectées jusqu'à la fin.

Question.jpg 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'

Todo.jpg Câbler alors ces leds sur la carte de la façon suivante :

Couleur Pin arduino
Rouge 8
Verte 9

Question.jpg É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.

Todo.jpg 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

Commandeldr.png

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
arduinoPin numéro de la patte dont on souhaite lire la valeur de tension
val valeur renvoyée par le convertisseur dans la plage [0 1023]

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

Todo.jpg Connecter la photorésistance (LDR) tel qu'indiqué sur la figure. Vous utiliserez l'entrée analogique A5.

Question.jpg É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.

Question.jpg 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

Question.jpg É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);

Question.jpg Modifier votre programme pour utiliser la fonction valPourcent(), que vous devrez bien entendu déclarer.

Mesure d'une résistance

MesureR.png

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.

Question.jpg Donner l'expression de la tension Vm en fonction de R1, Vcc et Rm.

Question.jpg 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.

Question.jpg 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.

Question.jpg 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)

Question.jpg 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.

Question.jpg É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

Question.jpg 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".

Question.jpg 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.