Wyświetlacz z SSD1306 podłączony do Arduino

Gdy przychodzi do wyboru wyświetlacza dla Arduino opcji jest sporo. Dziś zajmiemy się niewielkim (0.96 cala) wyświetlaczem o rozdzielczości 128×64. Ma on jasny i wyraźny obraz. Ten egzemplarz akurat ma dziwną konfigurację podłączenia, ale o tym zaraz. Najpierw – jest on monochromatyczny ale jednak dwukolorowy :)

Jak to możliwe? Ano pierwsze 16 linii ma piksele żółte, a reszta niebieskie.

To zdjęcie chyba najlepiej oddaje to, o co chodzi z tym żółtym/niebieskim.

Serce modułu – SSD1306

Kontroler SSD1306 może pracować zarówno jako urządzenie SPI jak i I2C. Jednak niezbadane są drogi którymi podąża umysł Chińczyka… Te moduły które dostaliśmy opis mają jakby miały być w trybie I2C. Jednak są w trybie SPI. Nie widać żadnej zworki, by ten tryb zmienić.

Co więcej, tryb SPI ale… nie ma CS wyprowadzonego. CS układu SSD1306 jest zwarte na stałe do masy, co znaczy, że układ cały czas nasłuchuje na szynie SPI. Dlatego nie podłączysz innego urządzenia do szyny SPI jeśli chcesz podłączyć ten akurat wyświetlacz.

Ale nie bój nic, jeśli użyjesz biblioteki Adafruit do obsługi wyświetlacza, to korzysta ona z programowego SPI (aka bitbanging). Znaczy to, że można wyświetlacz podłączyć do dowolnych pinów, więc SPI w UNO może zostać na podłączania innych urządzeń.

No dobra, skoro już o tym mowa, to….

Jak podłączyć OLED 0.96 do Arduino UNO

O tak! Jak powiedziałem przed chwilą, piny moga być dowolne, testowo zmieniłem zestaw z 12,11,10,9 na 7,6,5,4 i wyświetlacz (po przeprogramowaniu UNO) działa jak działał.

Dobra, czyli jak podłączyć?

[table id=1 /]

Piny 12-9 mogą zostać zmienione na inne trzeba tylko poprawić definicje w szkicu. No to skoro o nim mowa to całość przykładu jest tutaj: oled096-test.  Przed jego kompilacją musisz mieć zainstalowane dwie biblioteki od Adafruit – Adafruit_SSD1306 i Adafruit GFX. Obie zainstalujesz przez managera bibliotek w Arduino IDE.

Domyślenie biblioteka Adafruit SSD1306 jest skonfigurowana pod wyświetlacz 128×32, aby wszystko działało jak należy musisz zmienić w pliku Adafruit_SSD1306.h definicję:

//   #define SSD1306_128_64
   #define SSD1306_128_32
//   #define SSD1306_96_16

na

   #define SSD1306_128_64
//   #define SSD1306_128_32
//   #define SSD1306_96_16

Są to okolice linii 73. Plik ten znajdziesz w katalogu ze szkicami w podkatalogu libraries/Adafruit_SSD1306. Lokalizację katalogu ze szkicami możesz znaleźć w ustawieniach Arduino IDE (Ctrl+,)

OLED 096, SSD1306 i grafika z bitmapy

Tutaj mały bonus, jak przygotować sobie taką graficzkę. W sieci można znaleźć taki konwertery do ściągnięcia, ale… Po pierwsze większość była na Windows, a ja pracuję na Ubuntu. Po drugie, po co ściągać skoro pewnie jest strona gdzie się to da zrobić. Oby link działał przez długie lata ;)  Potrzebny jest plik, może być PNG, z obrazkiem w dwóch kolorach. Uwaga nie radzi sobie z PNG z przeźroczystością, musi mieć tło.

Przejdź na digole.com (mam nadzieję że ten konwerter będzie działał wiele lat, bo ten blog już prawie 10 lat ciągnie, wiec szkoda by link przestał za jakiś czas działać). Wgraj swój obrazek, i wygeneruj dane.

Rezultat to dwa pola, pierwsze ze współrzędni gdzie się zaczyna obrazek i kończy (użyte logo Nettigo zaczyna się w 0,0 a kończy 128,25. Wystarczy  dane z drugiego pola w odpowiednie miejsce szkicu. W naszym jest to definicja tablicy bitmap:

const uint8_t  PROGMEM bitmap[] = {
  0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  , 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00

Narysować na ekranie można obrazek przez:

  display.drawBitmap(0,16,bitmap,128,25,1);
  display.display();

Funkcja drawBitmap przyjmuje kolejno współrzędne gdzie ma zacząć rysować bimapę (nasz OLED jest dwukolorowy, więc chcę uciec z żółtego pola w pierwszych 16 liniach), tablicę z danymi i rozmiar bitampy. I tyle, można używać…