Les méthodes d'affichage avec les cartes Arduino
La carte Arduino ne dispose pas nativement d'un afficheur. Dans le cadre de l'utilisation d'un microcontrôleur en physique-chimie, il est indispensable de pouvoir afficher le résultat d'une mesure.
Cette partie aborde deux méthodes distinctes :
l'utilisation du moniteur série.
l'utilisation d'un afficheur LCD additionnel.
Le moniteur série
Méthode :
La platine Arduino ne possède pas d'écran. Même s'il est possible d'en connecter un, on peut se contenter dans certains cas du moniteur série.
Si l'Arduino est connecté à l'ordinateur par son câble USB, il peut envoyer des données sur le moniteur série, qui est une fenêtre d'affichage accessible en cliquant sur dans la fenêtre du logiciel de programmation de l'Arduino.
Pour utiliser le moniteur série en tant qu'afficheur, les trois instructions de la bibliothèque dédiée sont :
Serial.begin(9600); pour initialiser la communication avec le moniteur série, de place dans la boucle void Setup() du programme.
Serial.print(variable ou texte entre " "); pour afficher la valeur d'une variable ou du texte.
Serial.println(variable ou texte entre " "); comme précédemment mais avec un retour à la ligne.
Serial.write(CodeCaractère); pour afficher un caractère spécial à partir de son code.
Exemple : Retour sur le clignotement de la DEL
On se propose de reprendre le programme permettant de faire clignoter la DEL et d'ajouter les lignes de programme pour afficher son état (« Allumee »
ou « Eteinte »
) dans le moniteur série. Pour des raisons d'encodage, on n'affiche pas de caractères accentués.
Le code modifié ci-dessous permet l'affichage sur le moniteur série.
int pinLed = 3;//Numéro de la sortie numérique alimentant la DEL
void setup() {
// put your setup code here, to run once:
pinMode(pinLed, OUTPUT);//L'E/S est utilisée en SORTIE
Serial.begin(9600);//Initialisation de la communication
//avec le moniteur série
}
void loop() {
// put your main code here, to run repeatedly:
analogWrite(pinLed, 50); //On allume la DEL
Serial.println("Allumee");//Affichage de l'état de la DEL
delay(2000);//On attend 2 secondes
digitalWrite(pinLed, 0); //On éteint la DEL
Serial.println("Eteinte");//Affichage de l'état de la DEL
delay(2000);//On attend 2 secondes
}
Pour tester l'affichage de la valeur d'une variable :
Modifiez le code précédent pour obtenir l'affichage ci-contre sur le moniteur série en provoquant l'affichage de la valeur de la variable pinLed
et non directement du caractère « 3 »
.
Utiliser un afficheur LCD
Les afficheurs LCD additionnels
Les afficheurs LCD les moins onéreux sont les écrans 2 lignes - 16 colonnes ou 4 lignes - 20 colonnes comme ci-contre.
Sans module additionnel, leur câblage est fastidieux et ne peut être réalisé dans de bonnes conditions et dans un temps court par les élèves qui découvrent ce type de matériel (voir schéma ci-dessous).
Conseil : Afficheur LCD avec module I2C (À PRIVILÉGIER)
Il est possible de ne pas avoir à connecter 12 broches de l'écran LCD en lui adjoignant un module I2C. On trouve l'ensemble déjà soudé comme sur les photographies ci-contre.
Seules quatre broches sont alors nécessaires :
Vcc pour le +5V
GND à la masse
SCL sur l'entrée analogique A5 de la carte Arduino ou sur la borne marquée SCL
SDA sur l'entrée analogique A4 de la carte Arduino ou sur la borne marquée SDA
L'utilisation d'un composant avec module I2C interdit l'utilisation des entrées analogiques A4 et A5.
Le potentiomètre du module I2C (en bleu sur la photographie) permet d'ajuster le contraste de l'écran.
L'utilisation de ce type de module LCD nécessite une bibliothèque dédiée. Vous pouvez la récupérer en cliquant sur ce lien : LiquidCrystal_I2C.zip [zip]. Sa compatibilité a été testée avec les cartes Arduino Uno Rev 3 et l'IDE en version 1.8.9. Il s'agit d'une version modifiée de ce qui est téléchargeable sur le site DFRobot afin de corriger un bug d'affichage (seule la première lettre d'un mot s'affiche).
Pour ajouter la bibliothèque à l'environnement de programmation
Lancer Arduino IDE, puis cliquer sur Croquis -> Inclure une bibliothèque -> Ajouter la bibliothèque .ZIP
.
Pour inclure les bibliothèques dans le programme
Deux bibliothèques sont nécessaires pour faire fonctionner ce type d'affichage. On les inclut par les deux lignes suivantes dans la zone de déclaration des variables (en début de code) :
Dans cette même zone du code (avant setup() et loop()), on déclare l'écran LCD avec son adresse de communication, son nombre de colonnes et de lignes :
LiquidCrystal_I2C lcd(0x20, 16, 2); //Pour une adresse de communication 0x20 et un écran 16 colonnes, 2 ligne
Fondamental : Le commandes essentielles
Pour gérer l'affichage des grandeurs mesurées, seules quelques commandes sont nécessaires, le préfixe lcd
est lié à ce qui est déclaré dans la ligne de commande précédente :
lcd.init();
pour initialiser l'écran LCD, à placer dans la bouclesetup()
.lcd.backlight();
pour allumer le rétroéclairage, à placer dans la bouclesetup()
.lcd.clear();
pour effacer l'écran LCD.lcd.setCursor(colonne,ligne);
pour positionner le curseur.lcd.print(variable ou "chaîne de caractère");
pour afficher une valeur ou une chaîne de caractère.lcd.write(code_caractère);
pour afficher un caractère particulier dont on connaît le code. Exemplelcd.write(223)
affiche le symbole °.
Remarque : il n'existe pas l'équivalent du println
du moniteur série. Pour changer de ligne il faut utiliser la commande lcd.setCursor(colonne,ligne)
.
Méthode : Afficher l'état de la DEL sur l'écran LCD
On reprend le même objectif qu'avec le moniteur série mais en affichant l'état de la DEL sur un écran LCD avec module I2C.
Câblez l'écran LCD comme indiqué précédemment puis testez le programme
//Ajout de la bibliothèque LCD
int pinLed = 3;//Numéro de la sortie numérique alimentant la DEL
LiquidCrystal_I2C lcd(0x20,16,2);//Déclaration de l'écran LCD
void setup() {
// put your setup code here, to run once:
pinMode(pinLed, OUTPUT);//L'E/S est utilisée en SORTIE
lcd.init();//On initialise l'écran
lcd.backlight();//Allumage du rétroéclairage
}
void loop() {
// put your main code here, to run repeatedly:
lcd.clear();//On efface l'écran
analogWrite(pinLed, 50); //On allume la DEL
lcd.print("Allumé");//Affichage de l'état de la DEL
delay(2000);//On attend 2 secondes
lcd.clear();
digitalWrite(pinLed, 0); //On éteint la DEL
lcd.print("Eteinte");//Affichage de l'état de la DEL
delay(2000);//On attend 2 secondes
}
Complément : Connaître l'adresse de communication du port I2C de l'écran
Pour vérifier l'adresse de communication du bus I2C utilisé par l'écran, on peut utiliser le programme suivant avec l'écran connecté à la carte Arduino.
Le moniteur série affiche les adresses des interfaces I2C détectées.
// --------------------------------------
// i2c_scanner
//
// Version 1
// This program (or code that looks like it)
// can be found in many places.
// For example on the Arduino.cc forum.
// The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
// Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26 2013
// V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
// by Arduino.cc user Krodal.
// Changes by louarnold removed.
// Scanning addresses changed from 0...127 to 1...119,
// according to the i2c scanner by Nick Gammon
// http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
// As version 4, but address scans now to 127.
// A sensor seems to use address 120.
// Version 6, November 27, 2015.
// Added waiting for the Leonardo serial communication.
//
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//
void setup()
{
Wire.begin();
Serial.begin(9600);
while (!Serial); // Leonardo: wait for serial monitor
Serial.println("\nI2C Scanner");
}
void loop()
{
byte error, address;
int nDevices;
Serial.println("Scanning...");
nDevices = 0;
for(address = 1; address < 127; address++ )
{
// The i2c_scanner uses the return value of
// the Write.endTransmisstion to see if
// a device did acknowledge to the address.
Wire.beginTransmission(address);
error = Wire.endTransmission();
if (error == 0)
{
Serial.print("I2C device found at address 0x");
if (address<16)
Serial.print("0");
Serial.print(address,HEX);
Serial.println(" !");
nDevices++;
}
else if (error==4)
{
Serial.print("Unknown error at address 0x");
if (address<16)
Serial.print("0");
Serial.println(address,HEX);
}
}
if (nDevices == 0)
Serial.println("No I2C devices found\n");
else
Serial.println("done\n");
delay(5000); // wait 5 seconds for next scan
}