13 Décembre 2013

Arduino leçon 5 : entrée analogique

Nous allons étudier les entrées analogiques. Ensuite nous aborderons le fonctionnement de l'afficheur qui s'emboîte sur la plaquette Arduino.
pas FB

nombres décimaux

Jusqu'à maintenant, nous n'avions utilisé que des nombres entiers.
Un nombre décimal se déclare par "float", abréviation de nombre en virgule flottante.
Pour avoir un résultat en float, la déclaration n'est pas suffisante. Il faut aussi qu'un terme de l'opération soit exprimé sous forme décimale.
exemple


float reponse;
...
reponse = 3 / 2 ;       reponse vaudra 1
reponse = 3 / 2.0 ;    réponse vaudra 1.5

Le programme float.ino vous montre l'emploi de nombres décimaux

        /* essai pour découvrir les 'float' */

int a;
float b;
float c;

void setup()   {
      Serial.begin(9600);
      a = 3/2 ;
      b = 3/2 ;
      c = 3/2.0 ;
      Serial.print ("a vaut ");
      Serial.println (a);
      Serial.print ("b vaut ");
      Serial.println (b);
      Serial.print ("c vaut ");
      Serial.println (c);
}

void loop()   {
      // on ne fait rien
}




entrée analogique

Nous connaissons les entrées digitales qui valent soit 0 (0 volt) soit 1 (5 volts).
Nous allons voir l'autre type d'entrées, celles qui varient progressivent entre 0 et 5 volts.
Nous utilisons un potentiomètre entre le +5 et la masse, avec le curseur relié à la broche analogique A10.
On choisit une broche de numéro > 7 parce que les premières seront inaccessibles quand on utilisera l'afficheur.

afficheur SLC

mesure d'une entrée analogique

La tension présente sur une broche analogique est lue par Arduino avec une précision sur 10 bits.
Puisque 2 à la puissance 10 vaut 1024, on lit un nombre entre 0 et 1023.

On relie le curseur d'un potentiomètre à la borne analogique 10 d'Arduino.
Les autres broches du potentiomètre sont reliées au +5 et à la masse.

/* entrée analogique et Serial */

int valeurLue;
long temps=0;

void setup()   {
      Serial.begin(9600);
}

void loop()   {
      if ( millis() > temps) {
            valeurLue = analogRead(10);
            Serial.println(valeurLue);
            temps += 2000;
      }
}




calcul de tension

Puisqu'on a une amplitude de 1023 pour mesurer un intervalle de 5 volts, on obtient le nombre de volts en divisant le nombre lu par 204.6 (1023/5). Pour avoir un nombre décimal, on déclare une variable en virgule flottante et le programme devient.

le programme

/* entrée analogique et Serial 2 */

int valeurLue;
long temps=0;
float tension;

void setup()   {
      Serial.begin(9600);
}

void loop()   {
      if ( millis() > temps) {
            valeurLue = analogRead(10);
            tension = valeurLue / 204.6 ;
            Serial.println(tension);
            temps += 2000;
      }
}




Suggestion pour ceux qui veulent améliorer ce programme

N'afficher la tension que si elle a varié depuis le dernier affichage




l'afficheur

description

depuis le haut vers le bas, nous voyons:
       -    Le potentiomètre qui sert à règler le contraste de l'affichage.
       -    l'afficheur
       -    6 boutons poussoirs
celui de droite est équivalent au bouton reset de la carte, les autres sont programmables.


afficheur et ses boutons

initialisation

Il existe une bibliothèque de fonctions Arduino que nous devons ajouter à notre programme par la directive #include pour pouvoir utiliser les afficheurs.
Cette bibliothèque est contenue dans le fichier LiquidCrystal.h .
Une directive est une information pour le compilateur.
Une bibliothèque est un ensemble de fonctions spécifiques à un type d'applications. La bibliothèque s'appelle LiquidCrystal.h
Dans cette bibliothèque, il existe un type de variables objets qui s'appelle LiquidCrystal.
Nous déclarons une telle variable que nous appelons afficheur.
En même temps que nous déclarons cette variable, nous indiquons les bornes utilisées.
C'est pour pouvoir travailler avec les fonctions qui étaient écrites pour les afficheurs standard du commerce.

1er programme : un seul affichage

On se contente d'afficher dans le setup() et on ne fait rien dans la boucle

/* hello décembre 2013 */

#include <LiquidCrystal.h>
LiquidCrystal afficheur(8, 9, 4, 5, 6, 7);
void setup() {
       afficheur.begin(16, 2);
       afficheur.print("Hello World !");
}
void loop() {
       // la boucle est vide
}




2ème programme : on compte les secondes

On va afficher un compteur de secondes.

/* bonjour décembre 2013 */

#include <LiquidCrystal.h>
LiquidCrystal afficheur(8, 9, 4, 5, 6, 7);
long temps = 0;
void setup() {
        afficheur.begin(16, 2);
        afficheur.print("Bonjour à tous.");
}
void loop() {
        if (millis() >= temps) {
            afficheur.setCursor(0, 1);     // position x=0, y=1
            afficheur.print (temps / 1000);
            temps=millis() + 1000;
        }
}




3ème programme : on affiche la tension

On réunit les informations des programmes vus pour afficher la tension présente sur l'entrée analogique 10.

Cette fois je vous laisse faire le programme tous seuls.

méthode :
  -   ouvrez le programme bonjour_dec_2013.ino et sauvegardez le immédiatement sous un autre nom,
  -   ouvrez à côté le programme entree_analogique_et_serial.ino,
  -   faites un copier-coller des commandes utiles de ce programme dans l'autre.
  -   Vérifiez que votre programme est correct (1er bouton de la fenêtre) même si vous n'avez pas la plaquette Arduino.

Si vous êtes en forme, gérez le pluriel du mot volt(s).


Les bibliothèques

Un grand nombre de fonctions d'Arduino ne sont pas présentes par défaut. Quand on en a besoin, on précise au compilateur d'aller les chercher dans une bibliothèque par la directive #include. Nous avons appelé ici la blibliothèque LiquidCrystal.h qui contient les fonctions liées aux afficheurs à cristaux liquides.
Elle est dans le sous-répertoire "libraries" d'Arduino.

attention aux faux amis

Library veut dire bibliothèque.
Une librairie se dit en anglais a bookseller's.

27 Juin 2014

Les boutons de la carte afficheurs

Pour économiser des entrées de la carte, les 5 boutons sont reliés à la même entrée de la carte, l'entrée analogique 0.
Chacun envoie sur cette entrée une tension différente. la lecture de cette tension nous indique quel bouton est enfoncé.
On ne traitera pas les cas de plusieurs boutons enfoncés en même temps.

bouton appuyétension sur A0valeur lue
aucun 4,991023
select 3,61741
up 0,69142
down 1,59326
right 0,000
left 2,46504

Il suffit de tester la valeur lue sur A0 pour savoir quel bouton est enfoncé.
Faites un programme qui testera si on a une de ces valeurs sur l'entrée analogique 0.
On se donnera une marge d'incertitude de 1 bit en plus ou en moins, par exemple 740 et 742 seront considérés comme 741.

le programme

cliquez ici pour récupérer le programme

Utilisez ce programme pour vérifier votre montage.
Essayez de l'améliorer en écrivant un sous programme auquel on passe une chaîne en paramètre au lieu d'écrire plusieurs fois des lignes qui se ressemblent.

autre afficheur

Il existe une ancienne version de cette page. Elle ne concerne pas l'afficheur spécial pour Arduino mais l'afficheur générique sans boutons. Allez la consulter si votre afficheur est de ce modèle :

afficheur 16x2

sinon vous pouvez passer à la leçon suivante.



haut de la page


flèche gauche Page Précédente : le moniteur série et l'aiguillage (switch)           Page Suivante : sorties analogiques PWM flèche droite

Valid XHTML 1.0 Transitional