LCD 2*16 en I²C (PCF2119)

J’ai eu l’occasion de récupérer un petit écran LCD basé sur le driver PCF2119. Il s’agit d’un petit écran cd 2*16 caractères disposant d’une interface I²C.

Après quelques recherches, j’ai trouvé quelques liens intéressants:

Le datasheet : pcf2119datasheet
Un userland driver sur Bitbucket, avec quelques info: userlandDriver
La seule info manquante : comment connecter l’écran sur le RaspberryPi?

Certes, c’est très simple, il suffit d’une alimentation (Vdd + Gnd) et des deux signaux I²C (SDA et SCL). Mais pour un informaticien ayant très peu de connaissances en électronique, ce n’est pas si simple.

Après avoir pris mes renseignement, j’ai effectué le cablage suivant, qui fonctionne parfaitement :

Rpi GPIO Pin LCD Pin
2 – (5V Power) VDD
3 – (GPIO0 – SDA) SDA
5 – (GPIO1 – SCL) SCL
6 – (GND) GND

Mon écran fonctionne en 5V, le RaspberryPi en 3.3V. Mais cela n’empêche pas de connecter directement les pins I²C de l’écran sur le Raspberry (une histoire de résistance pull-up machin-truc auquel je n’ai pas tout compris :D).

Une fois que les connexion sont faites, il suffit de démarrer le rPi, de charger les modules I²C:

sudo modprobe i2c-bcm2708
sudo modprobe i2c-dev

Puis de communiquer avec l’écran, par exemple en utilisant le code de furyfire (petit programme en C), ou le miens, en python :

import smbus

class pcf2119x():
    def __init__(self):
        self.address = 0x3b
        self.device = smbus.SMBus(0)
    self.asciiOffset = 0x80

    def setup(self):
        buffer = [0x34, 0x0C, 0x06, 0x35, 0x04, 0x10, 0x42, 0x9f, 0x34, 0x80, 0x02]
        self.device.write_i2c_block_data(self.address,0,buffer)

    def write(self, asciiStr, line=None, col=None, clear = False):
        if clear:
        self.clear()
        if line is not None and col is not None:
            self.setPosition(line, col)

            buffer = self.asciiToLcd(asciiStr)
                self.device.write_i2c_block_data(self.address,0x40,buffer)

    def setPosition(self, line, col):
        buffer = [0x80 + (line*0x40)+col]
        self.device.write_i2c_block_data(self.address,0x00,buffer)

    def clear(self):
        self.setPosition(0,0)
        self.write("                ")
        self.setPosition(1,0)
        self.write("                ")

    def asciiToLcd(self, asciiStr):
        lcdStr=[]
        for asciiChar in asciiStr:
            lcdChar = 0xA0
            if asciiChar >= ' ' and asciiChar <= '?':
                lcdChar = ord(asciiChar) + self.asciiOffset
            if asciiChar >= 'A' and asciiChar <= 'Z':
                lcdChar = ord(asciiChar) + self.asciiOffset
            if asciiChar >= 'a' and asciiChar <= 'z':
                lcdChar = ord(asciiChar) + self.asciiOffset

            lcdStr.append(lcdChar)
        return lcdStr

if __name__ == '__main__':
    lcd = pcf2119x()
    lcd.setup()
    lcd.clear()
    lcd.write("Coucou",0, 3)
    lcd.write("Hello", 1, 4)

Ce code contient donc la classe pcf2119x qui permet d’initialiser l’écran, de l’effacer et d’écrire une chaine de caractères. Pour l’exécuter :

sudo python pcf2119x.py

Je n’ai pas encore trouvé (ni cherché) comment faire pour ne pas devoir exécuter les programmes accédant au bus I²C en root… Ce sera pour une prochaine fois!

Laisser un commentaire

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