Premiers montages

Entrées analogiques

Un montage un peu plus complexe que le précédent, support d'une unique application.

Le schéma électrique est donné à titre indicatif.

L'objectif est de déclencher l'allumage d'une LED en fonction d'un seuil lié à la luminosité ambiante. Ce seuil sera ajustable via un potentiomètre.

Montage

Impossible d'afficher l'image
Vue de la platine d'essai.
Impossible d'afficher l'image
Schéma électrique.

Liste des composants

Nom Type
Composant1 Arduino Uno (Rev3)
LED1 LED Rouge
LED2 LED jaune
Photorésistance Photorésistance (LDR)
R1 Résistance 330 Ω
R2 Résistance 330 Ω
R3 Résistance 10k Ω
R4 Potentiomètre rotatif

Le montage est composé de deux LED 5mm, une jaune et une rouge, toutes deux reliées à la masse via une résistance de 330 Ω. La première, commandée par la sortie 6, sert à informer que le système est en fonction, alors que la seconde, commandée par la sortie 9, s'allumera si la luminosité captée par la photorésistance passe en dessous un certain seuil. Cette photorésistance est montée en diviseur de tension avec une résistance fixe de 10k Ω. Le seuil de déclenchement est ajustable à l'aide d'un potentiomètre (ici un potentiomètre rotatif de 10k Ω).

Programme et commentaires

Programme

/**
 * Branchement de résistances variables
 * (ici une photo résistance et ensuite un
 * potentiomètre).
 * Asservissement d'une LED à la valeur
 * analogique lue.
 * Réglage du seuil de déclenchement en
 * fonction d'un potentiomètre.
 */
#define LED_R 9
#define LED_J 6

int lumiere ;
int consigne ;

void setup() {
 /* Initialisation des ports en sortie.
  * Il n'est pas nécessaire de configurer
  * les ports analogiques, qui sont en entrée
  * par défaut.
  */
  pinMode(LED_R, OUTPUT) ;
  pinMode(LED_J, OUTPUT) ;
  
  digitalWrite(LED_R, LOW) ;
  digitalWrite(LED_J, HIGH) ;
}

void loop() {
  // la valeur de la luminosité se lit sur le 4eme port analogique
  lumiere = analogRead(A3) ;
  // la valeur du seuil se lit sur le 5eme port analogique
  consigne = analogRead(A4)

  if (lumiere < consigne) {
      digitalWrite(LED_R, LOW) ;
  } else {
      digitalWrite(LED_R, HIGH) ;
  }
}
Asservissement de l'allumage d'une LED à la luminosité ambiante.

La nouveauté dans ce programme est l'utilisation de la fonction analogRead() qui permet de convertir une valeur analogique sur un port d'entrée en une valeur numérique que l'on peut facilement traiter. La valeur analogique doit être comprise entre 0 V et 5 V. La valeur numérique résultante sera comprise entre 0 et 1 023. La conversion est linéaire entre ces deux bornes, c'est à dire qu'une tension d'entrée de 0 V correspondra à une valeur numérique de 0, qu'une tension d'entrée de 5 V correspondra à une valeur numérique de 1 023 et qu'entre les deux, ça varie de manière linéaire.

La valeur maximale de 1 023 est due au convertisseur analogique numérique de l'Arduino qui a une précision de 10 bits, soit 210 valeurs qui commencent à 0 et se terminent à 1 023.

Le paramètre que l'on passe à analogRead() est le nom du port d'entrée que l'on désire utiliser. Sur les Arduino Duemilanove, UNO et Leonardo, il y a six ports d'entrée analogique (A0 à A5). Ceci est dû à l'utilisation du micro-contrôleur ATMega 328 qui en possède lui-même six.

La fonction retourne une valeur entière, résultat de la conversion.

Attention, il n'y a qu'un seul convertisseur dans les Arduino, à se partager entre tous les ports. Si l'on désire faire des conversions rapides et rapprochées, il risque d'y avoir un effet fantôme de la conversion précédente qui va venir altérer la valeur de la conversion courante. Si on laisse passer quelques millisecondes (10 à 20) entre deux conversions, cet effet disparaît (se reporter à la documentation technique des micro-contrôleurs ATMega pour plus de détail sur ce point).

Commentaires

Ce qu'il faut retenir ici, c'est que quelque soit le dispositif analogique branché, la méthode de lecture est la même. L'utilisation d'une photorésistance et d'un potentiomètre sont présentés à titre d'exemple. Il sera possible, avec cette même méthode, de lire la valeur de n'importe lequel des autres nombreux capteurs qui donnent une information analogique (température, distance, ...)

Cependant, un phénomène qui apparaît souvent lors de ce type de lecture est une légère oscillation des valeurs autours de la moyenne et ce, même s'il n'y a aucune modification en entrée. Ceci est lié aux imprécisions de conversion (convertir une infinité de valeurs comprises entre 0 et 5, en seulement 1 024 valeurs ne peut se faire sans quelques imprécisions). Selon le type d'application il sera intéressant de pouvoir lisser les valeurs (appliquer un filtre passe bas), de pouvoir créer un hystérésis, ou les deux, qui permettront de limiter l'apparition de ce phénomène.