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
© Copyright 2024 ExpyDoc