Je kunt een Raspberry Pi voorzien van verschillende LCD schermen, dit kan handig zijn voor systeemmeldingen of voor het uitvoeren van acties. Je kunt je Raspberry Pi ook voorzien van een OLED display, deze heeft een zeer hoge contrast ratio en kan per pixel worden aangestuurd.
OLED (Organic Light Emitting Diode) is een display dat op basis van organische materialen wordt opgebouwd. Door middel van stroom worden de aanwezige pixels individueel aangezet. Hierdoor is het niet meer nodig noodzakelijk om achtergrondverlichting te hebben, heeft een pixel geen stroom dan staat deze simpelweg uit en is deze zwart. Een groot voordeel van de OLED displays is dat ze zeer dun zijn.
In dit stappenplan gaan we een mini OLED display (128×64 pixels) aansluiten de Raspberry Pi, waarbij we gebruik maken van enkele speciale Python libraries om het display aan te kunnen sturen via de SPI interface (dus niet op de I2C poort!).
Gebruikte componenten
• 0.96-inch OLED SPI module display (blauw) 128X64 pixels (3€)
• 8x Dupont verbindingskabel (female/female)
Raspberry Pi 3 model B
Raspbian Jessie (2016-05-27 kernel 4.4)
Aansluitschema OLED display
Je kunt de OLED display aansluiten op de Raspberry Pi volgens onderstaand schema. De pinnen op de OLED module kunnen verschillende labels hebben, bijvoorbeeld VDD in plaats van VIN, bekende varianten worden tussen haakjes aangegeven. Let op dat de pin volgorde ook per gebruikte OLED module kan verschillen.
Raspberry Pi | Kleur | OLED Module |
---|---|---|
5V (PIN #1) | rood | VDD (VIN) |
GND (PIN #6) | zwart | GND |
GPIO23 (PIN #16) | groen | DC |
GPIO24 (PIN #18) | blauw | RES (RST) |
MOSI (PIN #19) | paars | SDA (DATA) |
SCLK (PIN #23) | oranje | SCK (CLK) |
CE0 (PIN #24) | geel | CS |
SPI interface activeren
We gaan de SPI interface gebruiken om te communiceren met het OLED display, hiervoor moet de SPI interface op de Raspberry Pi geactiveerd worden. Met behulp van het onderstaande commando kun je controleren of SPI is geactiveerd:
ls /dev/spi*
Als SPI is geactiveerd verschijnt /dev/spidev0.0 /dev/spidev0.1
verschijnt dit niet activeer dan SPI als volgt:
sudo raspi-config
Selecteer de menu optie ‘Advanced Options’ ▸ SPI ▸ YES en druk op Enter. Er zal nu een melding verschijnen dat de SPI interface is geactiveerd.
Benodigde Python libraries installeren
Om te kunnen communiceren met de OLED module maken we gebruik van een speciale SSD1306 library geschreven door Adafruit.
Python GPIO library:
sudo apt-get install build-essential python-dev python-pip sudo pip install RPi.GPIO
Python Imaging library:
sudo apt-get install python-imaging python-smbus
Adafruit SSD1306 Python library:
sudo apt-get install git git clone https://github.com/adafruit/Adafruit_Python_SSD1306.git cd Adafruit_Python_SSD1306; sudo python setup.py install
Werking testen
Nadat alles is aangesloten, geconfigureerd en geïnstalleerd kunnen we gaan testen of de OLED module werkt. Dit doen met het onderstaande test script.
import Adafruit_GPIO.SPI as SPI import Adafruit_SSD1306 from PIL import Image from PIL import ImageDraw from PIL import ImageFont disp = Adafruit_SSD1306.SSD1306_128_64(rst=24, dc=23, spi=SPI.SpiDev(0, 0, max_speed_hz=8000000)) disp.begin() disp.clear() disp.display() image = Image.new('1', (disp.width, disp.height)) draw = ImageDraw.Draw(image) draw.rectangle((0,0,disp.width-1,disp.height-1), outline=1, fill=0) font = ImageFont.load_default() draw.text((16, 24),'RASPBERRYTIPS.NL', font=font, fill=255) disp.image(image) disp.display()
Je kunt dit script downloaden met behulp van:
wget https://raspberrytips.nl/files/oled128x64test.py
Voer hierna het script uit:
python oled128x64test.py
Op scherm verschijnt nu een rechthoek met daarin de url van deze website, mocht dit niet verschijnen controleer dan de bekabeling, installatie van de benodigde libraries en of de SPI interface is geactiveerd.
Systeem informatie weergeven
Systeem informatie weergeven kan een toepassing zijn van het OLED scherm. Hiervoor hebben we het onderstaande script gemaakt, dit script toont op het scherm: IP adres Wifi adapter, CPU belasting en de temperatuur van de CPU. Omdat het standaard lettertype van de Python Imaging library niet super duidelijk is maken we gebruik van een schaalbaar TTF font.
import time import sys import subprocess import Adafruit_GPIO.SPI as SPI import Adafruit_SSD1306 from PIL import Image from PIL import ImageDraw from PIL import ImageFont from time import sleep # commandline instructies om de gegevens op te vragen GET_LOADAVG_CMD = "grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage }'" GET_TEMP_CMD = "/opt/vc/bin/vcgencmd measure_temp" # wijzig wlan0 in eth0 als je het ethernet adres wilt zien GET_IP_CMDWLAN = "/sbin/ifconfig wlan0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'" def run_cmd(cmd): return subprocess.check_output(cmd, shell=True).decode('utf-8') def write_load(): load = float ( run_cmd(GET_LOADAVG_CMD)[:-1] ) cpu = "CPU {:.2f}% \n".format(load) draw.text((3, 26), cpu, font=font, fill=255) def write_temp_mem(): cputemp = "TEMP {} C".format( run_cmd(GET_TEMP_CMD)[5:9] ) draw.text((3, 36), cputemp, font=font, fill=255) def get_my_ipwlan(): val = run_cmd(GET_IP_CMDWLAN)[:-1] if val == "": val = "No connection!" return val # wifi adres vragen we alleen de eerste keer op. wifi = get_my_ipwlan() disp = Adafruit_SSD1306.SSD1306_128_64(rst=24, dc=23, spi=SPI.SpiDev(0, 0, max_speed_hz=8000000)) disp.begin() disp.clear() disp.display() # Lege afbeelding voorbereiden width = disp.width height = disp.height image = Image.new('1', (width, height)) draw = ImageDraw.Draw(image) # Apple 2 font moet in dezelfde map staan als het script font = ImageFont.truetype('Apple2.ttf', 8) # loop voor het weergeven van de informatie while True: draw.rectangle((0,12,width-1,height-1), outline=1, fill=0) # Write two lines of text. draw.text((1, 1), 'RASPBERRYTIPS.NL', font=font, fill=255) draw.text((3, 16), wifi , font=font, fill=255) write_load() write_temp_mem() disp.image(image) disp.display() sleep(3)
Je kunt het script en het lettertype downloaden met behulp van:
wget https://raspberrytips.nl/files/Apple2.ttf wget https://raspberrytips.nl/files/oled128x64sysinfo.py
Voer hierna het script uit:
python oled128x64sysinfo.py
Afbeeldingen weergeven
Me behulp van de Python Imaging library is het ook mogelijk om een afbeelding weer te geven op het scherm. De afmeting moet 128×64 pixels zijn en in het PPM formaat, via deze website kun je heel eenvoudig een plaatje converteren naar PPM. Daarnaast moet je met behulp van het script de afbeelding weergeven.
import time import Adafruit_GPIO.SPI as SPI import Adafruit_SSD1306 from PIL import Image disp = Adafruit_SSD1306.SSD1306_128_64(rst=24, dc=23, spi=SPI.SpiDev(0, 0, max_speed_hz=8000000)) disp.begin() disp.clear() disp.display() image = Image.open('raspberrytipsnl.ppm').convert('1') disp.image(image) disp.display()
Je kunt het script en een voorbeeld afbeelding downloaden met behulp van:
wget https://raspberrytips.nl/files/raspberrytipsnl.ppm wget https://raspberrytips.nl/files/oled128x64afbeelding.py
Start het Python script om de afbeelding weer te geven op het scherm:
python oled128x64afbeelding.py
Iemand dit dit aan de praat heeft gekregen op een SH1106? (Velleman VMA437)
Het display geeft random “korreltjes” weer
Krijg het helaas niet werkend:
Raspberry PI 4
Raspbian (buster) 10
Traceback (most recent call last):
File “oled128x64test.py”, line 11, in
disp = Adafruit_SSD1306.SSD1306_128_64(rst=24, dc=23, spi=SPI.SpiDev(0, 0, max_speed_hz=8000000))
File “build/bdist.linux-armv7l/egg/Adafruit_GPIO/SPI.py”, line 46, in __init__
SystemError: error return without exception set
Een oudere versie van Raspbian bleek voor mij de oplossing:
https://downloads.raspberrypi.org/raspbian/images/raspbian-2020-02-07/