Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Jak korzystać z wyświetlacza OLED na I2C w Raspberry Pi

ghost666 28 Jan 2019 09:14 5274 9
Altium Designer Computer Controls
  • Jak korzystać z wyświetlacza OLED na I2C w Raspberry Pi
    Miniaturowy wyświetlacz OLED jest idealnym sposobem na dodanie niewielkiego ekranu do dowolnego projektu opartego o Raspberry Pi. Wyświetlacze tego rodzaju dostępne są w szerokiej gamie rozmiarów, ale najpopularniejsze z nich to 128x32 oraz 128x64 pikseli. Tańsze moduły są monochromatyczne - kolorowe piksele (białe, żółte bądź niebieskie) na czarnym tle. Duża część tych ekranów ma wbudowany Interfejs I²C. Wymaga on podłączenia do Raspberry Pi jedynie czterech przewodów, aby wyświetlać obrazy na ekranie.

    W poniższym poradniku znajdziemy opis krok po kroku, jak podłączyć typowy wyświetlacz OLED z interfejsem I²C do Raspberry Pi. Po skonfigurowaniu i uruchomieniu komunikacji z wyświetlaczem zaprezentowane zostaną przykładowe skrypty pozwalające na rysowanie tekstu czy kształtów na ekranie, a nawet wyświetlanie prostych animacji.

    Moduł OLED

    Omawianym w tym artykule modułem jest typowy wyświetlacz o przekątnej 0,96", który dostępny jest niemalże w każdym sklepie z modułami do Raspberry Pi, Arduino etc. Pokazany jest on na zdjęciach poniżej:

    Jak korzystać z wyświetlacza OLED na I2C w Raspberry PiJak korzystać z wyświetlacza OLED na I2C w Raspberry Pi


    Moduł posiada zaledwie cztery piny. Dwa służą do zasilania (Vcc oraz GND), a dwa tworzą interfejs I²C (linie SDA i SCL). Może być konieczne przylutowanie pinów do modułu, jeśli fabrycznie nie jest on w nie wyposażony.

    Aktualizacja systemu operacyjnego

    Realizując jakikolwiek projekt na Raspberry Pi dobrze jest zacząć od aktualizacji systemu operacyjnego. W tym celu wpisujemy w terminalu dwie komendy:

    Code: bash
    Log in, to see the code


    Aktualizacja może zająć kilka minut, szczególnie jeśli mamy sporo pakietów do aktualizacji, ale z reguły to warte oczekiwania - oszczędza dużo frustracji w przyszłości.

    [align=righ]Jak korzystać z wyświetlacza OLED na I2C w Raspberry Pi[/align]Podłączanie modułu wyświetlacza

    Jak pisaliśmy powyżej - moduł OLED posiada zaledwie cztery piny - dwa zasilające i dwa sygnałowe. Na obrazku po prawej stronie pokazano sposób, w jaki należy podłączyć je do Raspberry Pi.

    Można podłączyć je bezpośrednio do minikomputera, zgodnie z poniższą tabelką:

    Pin wyświetlaczaPin na Raspberry PiUwagi
    Vcc1 *3.3V
    Gnd14 **Masa
    SCL5I2C SCL
    SDA3I2C SCA


    * Pin ten można podłączyć do dowolnej linii 3,3 V, czyli pinów 1 lub 17.
    ** Pin ten można podłączyć do dowolnej linii masy, czyli pinów 6, 9, 14 , 20, 25, 30, 34 lub 39.

    Włączenie interfejsu I²C

    Domyślnie interfejs ten jest w naszym komputerze wyłączony. Dlatego, jeżeli chcemy komunikować się z wyświetlaczem, musimy go włączyć. Wykorzystujemy do tego narzędzie konfiguracyjne, które uruchamiamy wpisując w terminalu komendę:

    Code: bash
    Log in, to see the code


    Dokładniejszy opis, jak to zrobić, znajdziemy na przykład tutaj.

    Następnie musimy doinstalować jeszcze kilka przydatnych narzędzi Pythonowych, które pozwolą nam na zabawę interfejsem. Wystarczy spisać poniższą komendę w terminalu, aby je zainstalować:

    Code: bash
    Log in, to see the code


    Biblioteki te mogą być już wcześniej zainstalowane, ale apt-get sprawdzi, czy nic nie brakuje.

    Znalezienie adresu modułu OLED

    W kolejnym kroku musimy odnaleźć adres naszego wyświetlacza na szynie I²C, aby wiedzieć jak dokładnie z nim się komunikować.

    Wystarczy, że skorzystamy z jednego z zainstalowanych narzędzi:

    Code: bash
    Log in, to see the code


    Przykładowy rezultat powyższej komendy pokazano poniżej:

    Jak korzystać z wyświetlacza OLED na I2C w Raspberry Pi


    Widzimy, że komputer wykrył urządzenie o adresie 0x3C. Jest to domyślny adres tego modułu, mimo że na płytce drukowanej zapisano 0x78...

    Jeżeli korzystasz ze starszej 'Maliny (Raspberry Pi 1 Model B Rev 1), musisz pamiętać, że tam wykorzystano inny interfejs I²C w SoC, więc wpisać trzeba:

    Code: bash
    Log in, to see the code


    Reszta kroków będzie taka sama.

    Instalacja bibliotek w Pythonie do obsługi wyświetlacza OLED

    Aby wyświetlać na ekranie tekst, kształty czy obrazki, przydatna będzie biblioteka od Adafruit. Obsługuje ona wszystkie wyświetlacze oparte o kontroler SSD1306, w tym produkowane przez nich moduły o rozdzielczości 128x32 i 128x64 pikseli.

    Aby zainstalować te biblioteki, wystarczy sklonować odpowiednie repozytorium z GitHuba:

    Code: bash
    Log in, to see the code


    Po zakończeniu zgrywania biblioteki, przejdźmy do folderu z pobranymi plikami i zainstalujmy biblioteki.

    Code: bash
    Log in, to see the code


    Dla Pythona 2.x wpisujemy:

    Code: bash
    Log in, to see the code


    A dla Pythona 3.x:

    Code: bash
    Log in, to see the code


    Po zakończeniu tej operacji będziemy mogli w dowolnym miejscu przywołać te biblioteki z pomocą słowa kluczowego include w skrypcie Pythona.

    Jak korzystać z wyświetlacza OLED na I2C w Raspberry Pi
    Przykładowe skrypty

    W folderze z biblioteką znajdziemy także przykłady jej wykorzystania. Wystarczy, że przejdziemy do odpowiedniego folderu:

    Code: bash
    Log in, to see the code


    Tam znaleźć możemy szereg przykładów, między innymi następujące skrypty o wiele mówiących nazwach:

    animate.py
    buttons.py
    image.py
    shapes.py
    stats.py

    Aby je uruchomić, wystarczy wpisać:

    Code: bash
    Log in, to see the code


    lub jeśli korzystamy z Pythona 3:

    Code: bash
    Log in, to see the code


    Uruchomienie powyższych skryptów po kolei powinno dać efekty takie jak widzimy na obrazkach zebranych po lewej stronie. Modyfikując je, możemy stworzyć własne układy graficzne i tekstowe, dostosowane do naszej aplikacji.

    Dostosowanie wielkości ekranu

    Przykłady dostarczone przez Adafruit zakładają, iż nasz ekran ma rozdzielczość 128x32 piksele. Jeśli mamy większy wyświetlacz, także będą działały, ale można zapobiec późniejszym komplikacjom. Aby to zrobić wystarczy, że zmienimy w skrypcie linijkę odpowiedzialną za konfigurację - zakomentujemy (znakiem #) tą ustawiającą mniejszą i odkomentujemy tą, ustawiającą większą rozdzielczość. Po zmianach ta sekcja w skrypcie powinna wyglądać następująco:

    Jak korzystać z wyświetlacza OLED na I2C w Raspberry Pi


    Ten krok jest kluczowy, jeśli chcemy wyświetlacz na ekranie własne obrazy.

    Tworzenie nowych obrazów

    Jeśli przetestowaliście skrypt image.py i chcecie samodzielnie spróbować uzyskać taki efekt, to nie ma się co bać - to nic trudnego. Najpierw trzeba przygotować pojedynczy obrazek, wykorzystując dowolny program graficzny. Najlepiej, aby miał on następujące parametry:

    Rozdzielczość 128x64 px
    1-bitowy kolor (obrazek monochromatyczny, np. biało-czarny).

    Domyślnie skrypt w image.py będzie konwertował obrazki na monochromatyczne, ale nie będzie zmieniał ich rozdzielczości, zakładając, że jest poprawna.

    W skrypcie znaleźć możemy dwie linijki odpowiedzialne za ładowanie obrazka. Jedna, która konwertuje tylko głębię kolorów:

    Code: python
    Log in, to see the code


    I drugą, która także zmienia rozmiar:

    Code: python
    Log in, to see the code


    To, z której skorzystasz zależy tylko i wyłącznie od Ciebie. Pamiętaj jednak, że operacja przeskalowania obrazka zajmuje jakąś część zasobów, więc wydajniej jest używać wraz ze skryptem obrazków, które już zostały przeskalowane.

    Przeskalowywanie i konwersja obrazów

    Aby wykorzystać dowolny obrazek, trzeba załadować go dowolnego programu graficznego i wykonać następujące kroki:

    * Otworzyć obrazek;
    * Przeskalować go do rozdzielczości 128 x 64 px;
    * Zmniejszyć głębie koloru do 1-bitowej (obraz monochromatyczny);
    * Zapisać obrazek jako plik PNG lub PBM.

    Teraz możemy skopiować go na Raspberry Pi i wczytać w skrypcie, wyświetlającym go na ekranie OLED.

    Domyślnie znajdujący się w przykładzie plik posiada rozszerzenie .PPM - wynika to z faktu, że jest to kolorowy obrazek, który przeznaczony jest także do testowania kolorowych wyświetlaczy, ale w tym przykładzie jest w skrypcie rzutowany na 1-bitowy obraz.

    Pliki PBM są preferowane, jako że domyślnie są biało-czarne i o wiele mniejsze niż PNG. Dodatkowo, Python o wiele szybciej je wczytuje, jako że nie musi dokonywać po drodze żadnej konwersji.

    Zwiększanie prędkości interfejsu I²C

    Jak pisaliśmy [url=]jakiś czas temu[/url], możliwe jest zwiększenie prędkości interfejsu OLED. Domyślnie działa on z prędkością 100 kbit/s, ale maksymalna prędkość kontrolera w wyświetlaczu to 400 kbit/s. Zwiększenie prędkości tego interfejsu sprawi, że dane będą przesyłane szybciej. To istotne zwłaszcza w przypadku obrazków i szybkich animacji.

    Problemy w uruchamianiu wyświetlacza

    Jeżeli pomimo zrobienia wszystkiego od początku zgodnie z powyższym opisem, ekran nie działa, dobrze jest sprawdzić kilka rzeczy:

    * Czy na pewno włączyliśmy I²C w systemie?
    * Czy zainstalowaliśmy python-smbus oraz i2c-tools?
    * Czy nie pomieszaliśmy ze sobą linii SDA i SCL?
    * Co pokazuje i2cdetect -y 1 - jaki jest adres kontrolera?
    * Czy podaliśmy do skryptów odpowiedni adres wyświetlacza, jeżeli jest inny niż 0x3C?

    Źródło: https://www.raspberrypi-spy.co.uk/2018/04/i2c-oled-display-module-with-raspberry-pi/[/quote]

    Cool? Ranking DIY
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
    About Author
    ghost666
    Translator, editor
    Offline 
    Fizyk z wykształcenia. Po zrobieniu doktoratu i dwóch latach pracy na uczelni, przeszedł do sektora prywatnego, gdzie zajmuje się projektowaniem urządzeń elektronicznych i programowaniem. Od 2003 roku na forum Elektroda.pl, od 2008 roku członek zespołu redakcyjnego.
    ghost666 wrote 11597 posts with rating 9802, helped 157 times. Live in city Warszawa. Been with us since 2003 year.
  • Altium Designer Computer Controls
  • #2
    Janusz_kk
    Level 36  
    Znowu masz coś z tymi kodami, ja widzę jedną komendę powtórzona dwa razy:

    ghost666 wrote:
    Kod: bash Zwiń Zaznacz wszystko

    sudo apt-get update
    sudo apt-get ugrade



    a jak powinno być?
  • #3
    simw
    Level 26  
    Janusz_kk wrote:
    Znowu masz coś z tymi kodami, ja widzę jedną komendę powtórzona dwa razy:

    ghost666 wrote:
    Kod: bash Zwiń Zaznacz wszystko

    sudo apt-get update
    sudo apt-get ugrade



    a jak powinno być?

    Ja tam widzę dwie komendy, zresztą zupełnie standardowe jak na linuksa, jedynie co się można przyczepić to w drugiej linijce powinno być "upgrade", ale to zwykła literówka.
  • Altium Designer Computer Controls
  • #4
    ghost666
    Translator, editor
    Janusz_kk wrote:
    Znowu masz coś z tymi kodami, ja widzę jedną komendę powtórzona dwa razy:

    ghost666 wrote:
    Kod: bash Zwiń Zaznacz wszystko

    sudo apt-get update
    sudo apt-get ugrade



    a jak powinno być?


    Proszę się przyjrzeć jeszcze raz :D
  • #5
    Janusz_kk
    Level 36  
    simw wrote:
    powinno być "upgrade",

    No właśnie to mnie zmyliło, ale ok są dwie różne.

    Dodano po 59 [sekundy]:

    ghost666 wrote:
    Proszę się przyjrzeć jeszcze raz :D

    Ale nadal masz błąd :)
  • #6
    pawel-jwe
    Level 30  
    ghost666 wrote:
    Widzimy, że komputer wykrył urządzenie o adresie 0x3C. Jest to domyślny adres tego modułu, mimo że na płytce drukowanej zapisano 0x78...

    Jakieś niedopatrzenie bo:
    0x3C=0b00111100
    0x78=0b01111000
    Więc 0x78=0x3C<<1... wniosek taki, że jakiś chińczyk nie umie liczyć bitów :) lub przy komunikacji/odczycie obcina najmłodszy bit.
  • #7
    ghost666
    Translator, editor
    pawel-jwe wrote:
    ghost666 wrote:
    Widzimy, że komputer wykrył urządzenie o adresie 0x3C. Jest to domyślny adres tego modułu, mimo że na płytce drukowanej zapisano 0x78...

    Jakieś niedopatrzenie bo:
    0x3C=0b00111100
    0x78=0b01111000
    Więc 0x78=0x3C<<1... wniosek taki, że jakiś chińczyk nie umie liczyć bitów :) lub przy komunikacji/odczycie obcina najmłodszy bit.


    W I2C adresy są siedmiobitowe ;) bo ostatni bit to bit kierunku.
  • #8
    simw
    Level 26  
    pawel-jwe wrote:
    Jakieś niedopatrzenie bo:

    Żadne niedopatrzenie tylko kwestia punktu odniesienia, interpretacji.
    Podawanie adresów i2c zamiennie 7-bitowego i 8-bitowego to norma, aczkolwiek podawanie 8 bitowego, w mojej ocenie, jest mało logiczne, z tego powodu, że taki zmienia swoją wartość w zależności od kierunku i to jest ta nielogiczność. Dodatkowo większość dokumentacji, którą poznałem podaje 7-bitowy choćby manual do DS3231 i podobnych.
  • #9
    Janusz_kk
    Level 36  
    ghost666 wrote:
    W I2C adresy są siedmiobitowe ;) bo ostatni bit to bit kierunku.

    Ostatni to byłby MSB a jest de fakto pierwszy czyli LSB :)
  • #10
    tronics
    Level 38  
    Quote:
    Ostatni to byłby MSB

    A w liczbie 1234567 ta 7 jest ostatnią cyfrą czy pierwszą? ;) Co ciekawe wiele protokołów wysyła MSB first więc i w tej sytuacji bit nr 0 jest ostatni. A tak się składa, że w ten sposób wysyła także I2C :) Ergo jest napisane dobrze :D