Raspberry + Ecran LCD 1602S sans I2C

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 :

  • VSS qui se connecte à la masse
  • VDD qui se connecte à un +5V
  • VO qui se connecte à un +5V  derrière un potentiomètre (réglage du contraste)
  • RS : on le connectera au port GPIO 18
  • RW : on le connectera à la masse
  • E : on le connectera au port GPIO 23
  • D0 : Non utilisé ici
  • D1 : Non utilisé ici
  • D2 : Non utilisé ici
  • D3 : Non utilisé ici
  • D4 : on le connectera au port GPIO 24
  • D5 : on le connectera au port GPIO 25
  • D6 : on le connectera au port GPIO 8 (=CE0)
  • D7 : on le connectera au port GPIO 7 (=CE1)
  • A : Anode qui se connecte à un +5V
  • K : Cathode qui se connecte à la masse
  • Les 2 autres bornes du potentiomètre iront au +5V et à la masse

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.

 

 

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.