TP4 - Afficheur LCD - Aix Marseille Université

TP4 – Afficheur LCD
Objectifs :
- Savoir relier un afficheur LCD sur la Raspberry Pi
- Programmer en C l’affichage sur le LCD en utilisant les fonctions de la bibliothèque
« wiring pi ».
- Programmer en C un affichage défilant.
1. « Hello World » sur l’afficheur LCD
1.1 Branchement entre Raspebrry Pi et afficheur LCD
Nous voulons relier un afficheur LCD 2x16 à la Raspberry Pi en utilisant le connecteur de
prototypage « Pi Cobbler ». Le mode de connexion utilisée est le « mode 4 bits ». Les 4 bits de
données utilisées au niveau du SoC (BCM 2835) sont ceux indiqués dans le tableau de câblage
donné ci-dessous.
Par ailleurs, pour éviter de détériorer le SoC par des signaux de niveau 5 V en provenance de
l’afficheur LCD, nous utiliserons uniquement le mode écriture vers ce périphérique : la broche
R/W de ce dernier sera donc fixée à ‘0’, c’est-à-dire à la masse (mode écriture).
N° de
broche LCD
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Fonction sur LCD
Connexion extérieure
Masse
Masse
VCC
+ 5V
VO : tension ajustement du contraste
Point
milieu
d’un
potentiomètre (10 KΩ)
RS : Sélection du registre (Register Select)
GPIO22
R/W : Mode lecture lorsque ‘1’ (Read) ou Masse
écriture lorsque ‘0’ (Write)
E : Signal de validation (Enable), actif sur GPIO17
front descendant
DB0 : Bit de donnée 0 (Data Bit 0)
Non connecté
DB1 : Bit de donnée 1 (Data Bit 1)
Non connecté
DB2 : Bit de donnée 2 (Data Bit 2)
Non connecté
DB3 : Bit de donnée 3 (Data Bit 3)
Non connecté
DB4 : Bit de donnée 4 (Data Bit 4)
GPIO25
DB5 : Bit de donnée 5 (Data Bit 5)
GPIO18
DB6 : Bit de donnée 6 (Data Bit 6)
GPIO24
DB7 : Bit de donnée 7 (Data Bit 7)
GPIO23
A : Anode de la led de l’éclairage arrière
Non connecté
K : Cathode de la led de l’éclairage arrière
Non connecté
F. Aubépart ([email protected])
Formation par apprentissage – IUT Aix-Marseille, Dept Geii, Marseille
1
>> A partir des informations données, compléter le dessin ci-dessous en établissant les liens à
établir entre l’afficheur LCD et le connecteur d’expérimentation « Pi Cobbler ».
Avant le câblage vérifier le mode d’éclairage du LCD utilisé (« Réceptif », « Transmissif » ou « transflectif »). Dans
les deux derniers cas, il sera nécessaire d’alimenter l’éclairage arrière à une source de tension (broches 15 et 16).
S’il s’agit d’une Led, sa consommation sera limitée entre 10 mA et 40 mA, dans le cas d’un éclairage électrique
plus conventionnel, la consommation peut atteindre 200 mA. Pour un éclairage à Led, il sera nécessaire de
connecter une résistance d’environ 1 Kohm en série entre la broche 15 (l’anode) et le + 5V ou entre la broche 16
(la cathode) et la masse.
F. Aubépart ([email protected])
Formation par apprentissage – IUT Aix-Marseille, Dept Geii, Marseille
2
1.2 Affichage d’un message
Le programme C que nous allons réaliser va permettre d’afficher un court message envoyé
par la fonction « lcdPuts » de la bibliothèque « Wiring Pi ».
>> Créer un nouveau projet nommé « ProjetLCD » sous geany.
>> Créer un nouveau fichier (selon le modèle main.c) et taper le programme ci-dessous.
>> Nommer ce programme « LCD_v1.c »
Quelques commentaires par n° de lignes :
1 > Le fichier d’en-tête wiringPi.h est obligatoire pour utiliser les fonctions de la bibliothèque
wiring Pi
2 > le fichier d’en-tête lcd.h est obligatoire pour pouvoir utiliser les fonctions wiring Pi
spécifiques aux afficheurs LCD
3 > stdio.h déclaré parce que printf utilisé dans le programme sinon pas indispensable !
F. Aubépart ([email protected])
Formation par apprentissage – IUT Aix-Marseille, Dept Geii, Marseille
3
17 > LA fonction wiringPiSetup permet d’initialiser wiringPi en utilisant les numéros de broches
GPIO du SoC.
18 > Cette fonction initialise le LCD (voir documentation wiringPi). Elle retourne une valeur qui
doit être récupérée. Si cette valeur est -1, la fonction n’a pas pu initialiser l’afficheur comme
il faut : les lignes 20 à 24 permettent d’afficher un message d’erreur dans ce cas.
26 > Le curseur est positionné sur la 1ère ligne, 1ère colonne (position : 0,0)
27 > Affichage d’une chaîne de caractère à partir de la position courante
28 > Attente d’un appui sur une touche suivie de la touche « Entrée »
29 > Efface l’écran.
>> Dans le Terminal de « geany », compiler le programme :
-
Taper : gcc –Wall LCD_v1.c –l wiringPi –l wiringPiDev –o LCD_v1
Attention, l’ajout de la bibliothèque « wiringPiDev » est ici obligatoire puisque elle contient
les fonctions spécifiques à l’utilisation du LCD.
>> Corriger éventuellement les erreurs et recompiler de nouveau si nécessaire.
>> Exécuter le programme en mode super-utilisateur (droits utilisateurs insuffisants pour
certaines fonctions de « wiringPiDev ») :
-
Taper : sudo ./LCD_v1
>> Que s’affiche-t-il sur l’écran LCD ? Remarques sur un texte à plus de 16 et 32 caractères ?
2. Affichage d’un texte défilant
Nous allons désormais afficher un texte long qui devra défiler de la gauche vers la droite si le
texte est supérieur à 16 caractères.
Nous réaliserons une fonction de traitement « scrollText » dont le rôle est justement le
déplacement du texte sur l’écran du LCD.
Nous utiliserons également plusieurs fonctions C, normalisées ANSI, travaillant sur les chaînes
de caractères.
Longueur d’une chaîne de caractères : strlen
Une chaîne de caractères est une suite de caractère dont le début est repéré par un pointeur
et la fin par un zéro binaire. Le nombre de caractères (sans le 0) est déterminé par la
fonction strlen (string.h) dont le prototype est :
size_t strlen(char *str) ;
Le type ‘size_t’ est défini dans string.h est correspond à un entier non signé.
Le paramètre d’entrée est un pointeur vers la chaîne de caractères dont l’on veut connaître
la longueur.
F. Aubépart ([email protected])
Formation par apprentissage – IUT Aix-Marseille, Dept Geii, Marseille
4
Copie d’une chaîne de caractères : strncpy
Cette fonction permet de copier les n premiers caractères d’une chaîne de caractères vers
une autre chaîne. Son prototype (string.h) est :
char *strncpy(char *destination, char *source, size_t n) ;
Le type ‘size_t’ est défini dans string.h est correspond à un entier non signé.
Les paramètres d’entrée sont des pointeurs vers les chaînes de destination et d’origine. Si
la chaîne source a un nombre de caractères inférieur à n, la chaîne destination sera
complétée par des 0 binaires.
La fonction retourne un pointeur vers la nouvelle chaine de caractères, destination.
Une fonction de temporisation sera utilisée pour suspendre le programme momentanément.
Elle n’est cependant pas normalisée ANSI et correspond à l’équivalent de la fonction delay
utilisé par le compilateur C18 de la famille des microcontrôleurs PIC18.
Suspension temporaire : sleep et usleep
La fonction sleep permet de suspendre pendant un certain nombre de secondes un
programme. La fonction usleep est identique mais la suspension sera en microseconde. Leur
prototype (unistd.h) est :
unsigned int sleep (unsigned int nb_sec);
unsigned int usleep (unsigned int nb_usec);
Le paramètre d’entrée est un entier non signé correspondant au nombre de seconde de la
suspension.
La valeur retournée est un entier non signé et sera soit 0 si le nombre de seconde
(microseconde) écoulée est égal au nombre contenu dans le paramètre ou alors, le nombre
de secondes (microsecondes) restantes si la fonction est interrompue par un signal.
2.1 Première version
Les algorithmes de la fonction « principale » et de la fonction « scrollText » sont les suivants :
ACTION PRINCIPALE
Var : lcd (entier), Message[100] (caractères) = « Formation par apprentissage – 2eme annee »
DEBUT
wiringPiSetupGpio()
lcd ← foncWon iniWalisaWon lcdInit
affiche à écran « lcd = » lcd
SI (lcd = -1) ALORS
Affiche à écran « Erreur sur LCD Init »
FIN SI
scrollText(lcd, Message)
FIN PRINCIPALE
F. Aubépart ([email protected])
Formation par apprentissage – IUT Aix-Marseille, Dept Geii, Marseille
5
ACTION scrollText
P.E. : handle (entier), ptMessage[100] (caractères)
P.S. : A.V. : i (entier), Affiche[17] (caractères), LongueurMessage (entier)
DEBUT
LongueurMessage ← longueur chaîne (ptMessage)
SI (LongueurMessage > 16) ALORS
POUR i allant de 0 jusqu’à (LongueurMessage-16) par incrément de 1
Temporisation de 300 ms
Affiche ← Copie des 16 caractères à partir de la position i de ptMessage1
Affiche[16] ← 0
Curseur du LCD (handle) à la 1ère ligne, 1ère colonne (position 0,0)
Affichage sur LCD (handle) de la chaîne de caractères Affiche
FIN POUR
SINON
Affiche ← Copie des 16 caractères de ptMessage
Curseur du LCD (handle) à la 1ère ligne, 1ère colonne (position 0,0)
Affichage sur LCD (handle) de la chaîne de caractères Affiche
FIN SI
FIN scrollText
>> Créer un nouveau fichier (selon le modèle main.c) et taper le programme C tiré de
l’algorithme ci-dessus.
>> Nommer ce programme « LCD_v2.c »
>> Dans le Terminal de « geany », compiler le programme :
-
Taper : gcc –Wall LCD_v2.c –l wiringPi –l wiringPiDev –o LCD_v2
>> corriger éventuellement les erreurs et recompiler de nouveau si nécessaire.
>> Exécuter le programme en mode super-utilisateur :
-
Taper : sudo ./LCD_v2
>> Que s’affiche-t-il sur l’écran LCD ?
1
ptMessage est un pointeur sur une chaîne de caractères. L’adresse donnée à ce pointeur doit correspondre à
la première adresse de la première case d’indice 0 du tableau « pointé » (par exemple &Message[0] ou suivant
une écriture réduite Message).
Néanmoins, il est possible d’avoir une adresse de n’importe quelle case i du tableau « pointé » par ptMessage
en écrivant : &ptMessage[i]. Ainsi, cette adresse pourra être passée à un autre pointeur, par exemple lors de
l’appel à la fonction de copie strncpy !
F. Aubépart ([email protected])
Formation par apprentissage – IUT Aix-Marseille, Dept Geii, Marseille
6
2.2 Deuxième version
Dans cette deuxième version, nous désirons que le texte à afficher sur le LCD soit saisit en
ligne de commande juste après le nom du programme.
Modifier le programme précédent de manière à considérer également les particularités
suivantes :
- Un texte long, incluant notamment des espaces, devra être encadré par des guillemets.
Sans cela un message devra indiquer une erreur et préciser que le texte doit être entouré
de guillemets.
Exemple de mauvaise exécution du programme :
$ sudo ./LCD_v3 il y a trop de texte pas mis entre guillemets
Exemple de l’exécution du programme corrigée :
$ sudo ./LCD_v3 "il y a trop de texte pas mis entre guillemets"
-
Un appel du programme non suivi de texte devra également indiquer un message d’erreur
et préciser qu’un texte doit suivre le nom du programme.
Exemple de mauvaise exécution du programme :
$ sudo ./LCD_v3
Exemples de l’exécution du programme corrigée :
$ sudo ./LCD_v3 coucou
$ sudo ./LCD_v3 "coucou encadré de guillemets si espaces utilisés"
Conseil : Penser à utiliser argc et argv, les paramètres d’entrées de la fonction principale.
>> Créer un nouveau fichier (selon le modèle main.c) et taper le programme C tiré de
l’algorithme ci-dessus.
>> Nommer ce programme « LCD_v3.c »
>> Dans le Terminal de « geany », compiler le programme :
-
Taper : gcc –Wall LCD_v3.c –l wiringPi –l wiringPiDev –o LCD_v3
>> corriger éventuellement les erreurs et recompiler de nouveau si nécessaire.
>> Exécuter le programme en mode super-utilisateur avec les exemples donnés ci-dessus.
F. Aubépart ([email protected])
Formation par apprentissage – IUT Aix-Marseille, Dept Geii, Marseille
7