OLED display (128×64) aansluiten via SPI interface

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.

OLED 128x64 SPI RASPBERRY PI

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.

OLED raspberry pi test

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.

OLED raspberry systeem info

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.

OLED raspberry pi afbeelding

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

3 gedachten over “OLED display (128×64) aansluiten via SPI interface”

  1. 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

    Beantwoorden

Plaats een reactie

%d bloggers liken dit: