RASP-PiOLED-Utiliser

De MCHobby - Wiki
Sauter à la navigation Sauter à la recherche

Introduction

Nous allons utiliser Python pour contrôler l'afficheur. En théorie, vous pouvez utiliser n'importe quel langage offrant un accès au bus I2C de l'ordinateur mais Adafruit ne fournit qu'une bibliothèque Python!

Etape 1. Les dépendances

Avant d'utiliser la bibliothèque Adafruit, vous devez vous assurer d'avoir les différentes dépendances installées. Connectez vous en SSH sur votre Pi et suivez les étapes suivantes:

Installer la bibliothèque RPi.GPIO en exécutant la ligne de commande:

sudo apt-get update
sudo apt-get install build-essential python-dev python-pip

sudo pip install RPi.GPIO

Pour finir, installer la bibliothèque Python Imaging Library (PIL) et bibliothèque smbus en exécutant :

sudo apt-get install python-imaging python-smbus

Vous pouvez maintenant instlaller la dernière version de la bibliothèque Python SSD1306 d'Adafruit (et les exemples). Exécutez les commandes suivantes:

sudo apt-get install git
git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git

cd Adafruit_Python_SSD1306
sudo python setup.py install

RASP-PiOLED-Utiliser-01.png
Crédit: AdaFruit Industries www.adafruit.com

Etape 2. Activer I2C

Suivez ce guide pour activer le support I2C sur votre Raspberry-Pi.

Après avoir activer le support I2C, il sera nécessaire d'arrêter le Pi à l'aide de la commande sudo halt.

Une fois à l'arrêt, branchez le PiOled puis remettez le Pi sous tension.

Connectez vous à nouveau sur votre Pi et exécutez la commande suivante dans un terminal pour scanner et détecter les périphériques I2C.

sudo i2cdetect -y 1

Vous devriez voir le résultat suivant indiquant que l'adresse 0x3c (l'afficheur OLED) à été trouvé.

RASP-PiOLED-Utiliser-02.png
Crédit: AdaFruit Industries www.adafruit.com

Etape 3. Vérifier le périphérique I2C

Une dois dans le répertoire Adafruit_Python_SSD1306, vous pouvez exécuter l'exemple stats d'Adafruit. Cet exemple extrait des données statistiques sur la charge CPU du Pi, l'espace disque, etc -ET- affiche ces informations sur l'OLED.

Exécutez sudo python examples/stats.py pour démarrer la démo, vous devriez vois quelque-chose comme ceci:

RASP-PiOLED-Utiliser-03.png
Crédit: AdaFruit Industries www.adafruit.com

RASP-PiOLED-Utiliser-04.jpg
Crédit: AdaFruit Industries www.adafruit.com

Démarrer stats.py au Boot

Raspbian Wheezy - avant SystemD

Il est très facile de démarrer le script à chaque au boot du Raspberry-Pi.

L'approche la plus simple est de le mettre dans /etc/rc.local

Exécuté sudo nano /etc/rc.local et ajouter la ligne

sudo python /home/pi/Adafruit_Python_SSD1306/examples/stats.py  &

juste avant le exit 0

Puis sauver et quitter l'éditeur nano. Redémarrer le Pi afin de voir si l'information apparaît à l'écran!

RASP-PiOLED-Utiliser-05.png
Crédit: AdaFruit Industries www.adafruit.com

Raspbian Jessy - avec SystemD

Sur base des informations ci-dessus, vous pouvez adapter le démarrage pour SystemD.

Nous avons un tutoriel dévolu au démarrage de script Python avec SystemD.

Démarrage automatique

Tlogo-autostart-script.jpg

Démarrer automatiquement un script Python sous Raspbian.

 

Utilisation de la bibliothèque

Vous trouverez des scripts python d'exemple dans le sous répertoire examples qui montre comment utiliser la bibliothèque. Adafruit Ce guide OLED d'Adafruit (anglais) couvre plus de détails concernant l'utilisation des afficheurs, n'hésitez pas à le consulter.

Pour débuter plus facilement, nous allons réviser le code de stats.py. De sorte, vous pourrez utiliser ce script comme base de départ pour vos propres projets.

import time

import Adafruit_GPIO.SPI as SPI
import Adafruit_SSD1306

from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

import subprocess

Nous commençons par importer quelques modules, y compris le module Adafruit_SSD1306 qui contient le pilote de l'afficheur OLED.

Vous pouvez également noter l'importation de quelques éléments de la bibliothèque Python Imaging Library comme Image, ImageDraw et ImageFont. Comme vous pouvez l'imaginer, ces éléments servirons a dessiner des images, des formes et du texte/font!

Ci dessous les différentes valeurs de configuration et classe pour les afficheurs OLED. Il y a 4 variantes d'afficheur OLED, avec 128x32 pixels ou 128x64 pixels -ET- avec I2C ou avec SPI.

# Commentaire traduis par Meurisse D. pour faciliter la compréhension du code.
# -- shop.mchobby.be -- 

# Configuration des broches du Raspberry Pi:
RST = None
# Note: uniquement utilisé avec bus SPI:
DC = 23
SPI_PORT = 0
SPI_DEVICE = 0

# Afficheur 128x32 sur bus I2C matériel:
disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST)

# Afficheur 128x64 sur bus I2C matériel:
# disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)

# Alternativement, vous pouvez spécifier le n° de bus I2C, par exemple
# avec l'afficheur 128x32, vous pouvez utiliser:
# disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, i2c_bus=2)

# Afficheur 128x32 avec bus SPI matériel:
# disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=8000000))

# Afficheur 128x64 avec bus SPI matériel:
# disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE, max_speed_hz=8000000))

# Vous pouvez également spécifier un SPI logiciel en fournissant
# les numéros de broches GPIO digital (pour toutes les broches 
# utilisées par l'afficheur). Par exemple:
# Sur un Raspberry Pi avec afficher 128x32 vous pourriez utiliser:
# disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, dc=DC, sclk=18, din=25, cs=22)

Etant donné que l'afficheur PiOLED est un afficheur OLED 128x32 sur bus (uniquement), vous devez uniquement utiliser le code:

# afficheur 128x32 avec bus I2C matériel:
disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST)

Le restant du code peut rester en commentaire.

Notez que ci-dessus, nous avons initialisé RST = None parce que le PiOLED ne nécessite pas l'utilisation de la broche "reset".

# initialiser la bibliothèque d'affichage.
disp.begin()

# Effacer l'affichage.
disp.clear()
disp.display()

# Créer une image vierge pour dessiner dessus.
# L'image doit être créé avec mode '1' (couleur 1-bit).
width = disp.width
height = disp.height
image = Image.new('1', (width, height))

# Obtenir un objet ImageDraw (dessiner sur l'image)
# pour l'image.
draw = ImageDraw.Draw(image)

# Dessiner un rectangle noir (rempli) pour effacer
# le fond de l'image (sinon cela allumera les Pixels).
draw.rectangle((0,0,width,height), outline=0, fill=0)

La portion de code ci-dessus, initialise la bibliothèque d'affichage avec begin() et efface le contenu avec clear() et display() .

Ensuite, nous configurons une classe PIL drawing pour dessiner des graphiques. La mémoire tampon de l'image est crée avec un bit de profondeur (mode avec paramètre '1'. Ce mode est important puisque l'afficheur ne propose que deux couleurs noir et blanc.

Ensuite nous redessinons un grand rectangle noir pour effacer effacer le contenu de l'écran (éteindre tous les pixels). En théorie, il n'est pas nécessaire d'effacer une seconde fois l'écran... mais c'est toujours un bonne idée de savoir comment dessiner une forme!

# Charger la font par défaut.
font = ImageFont.load_default()

# Chargement d'une autre font TTF.
# D'autres fonts sont disponibles sur: http://www.dafont.com/bitmap.php
#font = ImageFont.truetype('Minecraftia.ttf', 8)

Une fois l'afficheur initialisé et un objet dessin (ImageDrawing) préparé, vous pouvez dessiner des formes, du texte et des graphiques en utilisant des commandes de dessin PIL (effbot.org, anglais). Dans le cas présent, le code charge la font par défaut qui est parfaite mais vous pouvez également charger d'autres fonts. Il es possible de charger des fonts TrueType et de les utiliser pour faire du rendu de texte de tout style

Une fois la font par défaut chargée, il est possible d'afficher quelques lignes de texte.

while True:

    # Afficher un rectangle noir pour effacer l'image de l'écran.
    draw.rectangle((0,0,width,height), outline=0, fill=0)

    # Script shell pour surveiller les paramètres système : 
    # https://unix.stackexchange.com/questions/119126/command-to-display-memory-usage-disk-usage-and-cpu-load
    cmd = "hostname -I | cut -d\' \' -f1"
    IP = subprocess.check_output(cmd, shell = True )
    cmd = "top -bn1 | grep load | awk '{printf \"CPU Load: %.2f\", $(NF-2)}'"
    CPU = subprocess.check_output(cmd, shell = True )
    cmd = "free -m | awk 'NR==2{printf \"Mem: %s/%sMB %.2f%%\", $3,$2,$3*100/$2 }'"
    MemUsage = subprocess.check_output(cmd, shell = True )
    cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%dGB %s\", $3,$2,$5}'"
    Disk = subprocess.check_output(cmd, shell = True )

    # Ecrire quatre lignes de texte
    draw.text((x, top),       "IP: " + str(IP),  font=font, fill=255)
    draw.text((x, top+8),     str(CPU), font=font, fill=255)
    draw.text((x, top+16),    str(MemUsage),  font=font, fill=255)
    draw.text((x, top+25),    str(Disk),  font=font, fill=255)

    # Afficher l'image sur l'écran
    disp.image(image)
    disp.display()
    # pause de 100 millisecondes
    time.sleep(.1)

En utilisant la classe subprocess, python peut utiliser des commandes Linux pour accéder aux informations systèmes du Pi. La boucle while effectue un rafraîchissement de l'écran 10 fois par seconde.

Voilà, c'est tout en ce qui concerne le code de stats.py !

Plus d'exemples

Vous pouvez consulter les autres exemples du sous-répertoire examples.

Assurez-vous d'éditer chacun des exemples (avec nano animate.py par exemple) et trouvez la ligne mentionnant:

# Raspberry Pi pin configuration:
RST = 24

et la changer en :

# Raspberry Pi pin configuration:
RST = None # PiOLED n'a pas besoin de la broche Reset

puis assurez vous que la configuration section utilise la déclaration correspond à votre afficheur PiOled... comme ceci:

# 128x32 display with hardware I2C:
disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST)

# 128x64 display with hardware I2C:
# disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)

# 128x32 display with hardware SPI:
# disp = Adafruit_SSD1306.SSD1306_128_32(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_POR$

# 128x64 display with hardware SPI:
# disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST, dc=DC, spi=SPI.SpiDev(SPI_POR$

Voila, le script d'exemple utilise maintenant un afficheur I2C 128x32 pixels (sans broche Reset)!

Améliorer la vitesse de l'afficheur

Pour de meilleures performances, plus spécialement si vous avez besoin d'animation rapide, vous pouvez optimiser le fonctionnement du bus I2C pour qu'il fonctionne 1MHz. En effet, le bus est configuré à la fréquence 100KHz ou 400KHz

Pour modifier la vitesse du bus, éditez le fichier de configuration avec sudo nano /boot/config.txt

et ajoutez la ligne suivante à la fin du fichier

dtparam=i2c_baudrate=1000000

RASP-PiOLED-Utiliser-06.png
Crédit: AdaFruit Industries www.adafruit.com

Redémarrer le Pi pour appliquer les modifications.


Source: Adafruit PiOLED - 128x32 Mini OLED for Raspberry Pi
Créé par Lady Ada et Danny Nosonowitz pour AdaFruit Industries.

Traduction réalisée par Meurisse D. pour MCHobby.be.

Toute référence, mention ou extrait de cette traduction doit être explicitement accompagné du texte suivant : «  Traduction par MCHobby (www.MCHobby.be) - Vente de kit et composants » avec un lien vers la source (donc cette page) et ce quelque soit le média utilisé.

L'utilisation commercial de la traduction (texte) et/ou réalisation, même partielle, pourrait être soumis à redevance. Dans tous les cas de figures, vous devez également obtenir l'accord du(des) détenteur initial des droits. Celui de MC Hobby s'arrêtant au travail de traduction proprement dit.

Traduit avec l'autorisation d'AdaFruit Industries - Translated with the permission from Adafruit Industries - www.adafruit.com