Connexion d’un écran LCD1602 sur un Raspberry sans utilisation de l’I2C
L’écran LCD 1602 est un produit connu, peu onéreux, disponible sur tout les sites et utilisable sur Arduino et Raspberry.
Il est souvent fourni avec une interface I2C
Son utilisation avec I2C est largement documentée sur internet, ce qui l’est moins c’est son utilisation sans I2C, c’est ce qu’on va voir.
Voici un exemple de projet dans lequel on a un accéléromètre MPU6050 sur le port I2C et l’écran LCD en direct (sans utiliser I2C). Certe, on peut piloter plusieurs périphériques I2C en même temps mais supposons qu’on ne sache pas le faire. Voici comment s’en sortir.
L’écran LCD possède 16 connecteurs qui sont de gauche à droite :
Le choix des ports GPIO 18,23,24,25,8 et 7 n’est pas imposé, mais il faut indiquer ceux que l’on a choisis dans le code qui affichera des messages sur l’écran. |
Pour le module occupant le port I2C (que ce soit un MPU6050 ou tout autre chose), c’est très simple :
- VC = +5V
- GND = Masse
- SDA = SDA
- SCL = SCL
- XDA = non utilisé
- XDL = non utilisé
Remarque : le montage fonctionnera en 3.3V mais vous n’aurez presque pas de contraste, l’écran sera très difficile à lire.
Le code python de gestion de l’écran :
Déclaration des variables (ports GPIO etc…)
import time import RPi.GPIO as gpio RS = 18 EN = 23 D4 = 24 D5 = 25 D6 = 8 D7 = 7 gpio.setwarnings(False) gpio.setmode(gpio.BCM) gpio.setup(RS,gpio.OUT) gpio.setup(EN,gpio.OUT) gpio.setup(D4,gpio.OUT) gpio.setup(D5,gpio.OUT) gpio.setup(D6,gpio.OUT) gpio.setup(D7,gpio.OUT)
Function cmd de basse couche (envoie de données binaires à l'écran)
def cmd(ch): gpio.output(RS,0) gpio.output(D4,0) gpio.output(D5,0) gpio.output(D6,0) gpio.output(D7,0) if ch&0x10==0x10: gpio.output(D4,1) if ch&0x20==0x20: gpio.output(D5,1) if ch&0x40==0x40: gpio.output(D6,1) if ch&0x80==0x80: gpio.output(D7,1) gpio.output(EN,1) time.sleep(0.005) gpio.output(EN,0) gpio.output(D4,0) gpio.output(D5,0) gpio.output(D6,0) gpio.output(D7,0) if ch&0x01==0x01: gpio.output(D4,1) if ch&0x02==0x02: gpio.output(D5,1) if ch&0x04==0x04: gpio.output(D6,1) if ch&0x08==0x08: gpio.output(D7,1) gpio.output(EN,1) time.sleep(0.005) gpio.output(EN,0)
Function clear (vider l’écran de tout contenu)
def clear(): cmd(0x01)
Function write (écrire un caractère à l’écran)
def write(ch):
gpio.output(RS,1)
gpio.output(D4,0)
gpio.output(D5,0)
gpio.output(D6,0)
gpio.output(D7,0)
if ch&0x10==0x10:
gpio.output(D4,1)
if ch&0x20==0x20:
gpio.output(D5,1)
if ch&0x40==0x40:
gpio.output(D6,1)
if ch&0x80==0x80:
gpio.output(D7,1)
gpio.output(EN,1)
time.sleep(0.005)
gpio.output(EN,0)
gpio.output(D4,0)
gpio.output(D5,0)
gpio.output(D6,0)
gpio.output(D7,0)
if ch&0x01==0x01:
gpio.output(D4,1)
if ch&0x02==0x02:
gpio.output(D5,1)
if ch&0x04==0x04:
gpio.output(D6,1)
if ch&0x08==0x08:
gpio.output(D7,1)
gpio.output(EN,1)
time.sleep(0.005)
gpio.output(EN,0)
Fonction de positionnement du curseur
def setCursor(x,y): if y==0: n=128+x elif y==1: n=192+x cmd(n)
Afficher une chaîne de caractère (pour chaque caractère de la chaîne, on affiche son code ascii via la fonction write)
def Print(Str): i=0 l=len(Str) for i in range(l): write(ord(Str[i]))
Initialisation de l’écran (mise en mode 4bits, positionnement du curseur, vider l’écran de tout affichage etc..)
def begin(): cmd(0x33) cmd(0x32) cmd(0x06) cmd(0x0C) cmd(0x28) cmd(0x01) time.sleep(0.005)
Exemple d’utilisation (programme principal)
begin() setCursor(0,0) Print("TEST") setCursor(0,1) Print("REUSSI")
Le résultat
Le code complet :
Le code est inspiré d’un exemple de projet publié dans la revue « Inside Raspberry » auquel j’ai apporté quelques corrections.
Il est téléchargeable ici mpu6050lcd
Pour utiliser I2C, il faut bien sûr l’activer via l’utilitaire raspi-config
Et il existe une bibliothèque python pour le composant mpu6050 disponible via pip, elle se nomme mpu6050-raspberry (et non pas mpu6050) et donc s’installe via :
pip install mpu6050-raspberry.
Par contre, je ne comprends toujours pas comment exploiter scientifiquement le composant mpu6050 :
visiblement, il affiche des valeurs dans des unités curieuses : les accélérations ne sont ni des « G », ni des mètres par seconde carré.
Quand au Gyro, comment dire, ce ne sont ni des radians, ni des degrés, ni des grades qu’il fournit.
Par contre, la température elle est en degré Celsius et donne une valeur fiable.
Les valeurs de l’accéléromètre et du Gyro ne sont exploitables que par un mécanisme mais inutile de penser en tirer des mesures à but scientifique.