wtorek, 29 stycznia 2019

PIC32MM - biblioteka dla kolorowego wyświetlacza ILI9341 2.2" 320x240.

Jakiś czas temu popełniliśmy bardzo fajną bibliotekę dla PIC32MM obsługującą wyświetlacz ILI9163 1.8" . Teraz czas na stworzenie biblioteki dla większego brata czyli ILI9341 2.2". Większe w tym przypadku mamy wszystko, czyli rozmiar i rodzielczość. Na pewno obrazki będą się prezentowały znacznie lepiej. Moim zdaniem rozmiar 2.2" jest taki w sam raz ani za mały ani za duży i miły dla oka. Wyświetlacz ten zaaplikowałem do mojej płytki developerskiej dla ATSAML21. Ale najpierw zrobimy bibliotekę dla PIC32MM bo będzie nam najprościej to zrobić a potem przeportujemy ją do ATSAML21. PIC32MM jest naprawdę świetnym MCU low end z bardzo ciekawymi peryferiami  i co ważne prostym w opanowaniu.  W każdym przypadku łatwiej jest mi tutaj  zrobić działającą aplikację i przeportować ją do ARM-a niż robić bezpośrednio dla ARM.
Wyświetlacz ILI9341 nabyłem bez problemu na dalekowschodnim portalu aukcyjnym.


  • Sterownik firmy ILITEK : IL9341
  • Rozdzielczość: 240 * 320
  • Przekątna 2.2"
  • Głębia kolorów 65k/262k
  • Sterowanie SPI 
  • 5 wires (CS, DC, SCK, MOSI, RST) for controling
  • Rozmiar modułu: 67mm (długość) * 40mm (szerokość) * 4mm (grubość) 
  • Czytnik kart SD
Rozkład pinów :
  • MISO: Serial clock output
  • LED: 3.3V Power Supply pin
  • SCK: Serial clock input
  • MOSI: Serial data input
  • DC: Data / Command selection
  • RST: Reset, Low level active
  • CS: Chip Selection, Low level active
  • GND: Ground
  • VDD: 3.3V Power Supply pin


W mojej bibliotece wykorzystam do sterowania 4 piny (DC, SCK, MOSI, RST) .Pin CS połączę na stałe do masy. Takie rozwiązanie zdało egazamin w przypadku wyświetlacza ILI9163, więc i tutaj powinno. Połączenia jakie wykorzystam w PIC32MM to :

   Signal LCD  ---> MCU PIC32MM

   CS (Chip Select) --> Ground

   RST (Reset)         --> RB11

   DC/RS (Command / Data) --> RC3

   MOSI (Serial Data) --> RD0

   SCK (Serial Clock) --> RB8

   LED --> +3.3V

Do komunikacji SPI po stronie mikrokontrolera wykorzystam SPI1 i piny adekwatne dla MOSI (RD0) i CLK (RB8). MISO oraz SS nie używamy do sterowania wyświetlaczem, więc pomijamy je w konfiguracji SPI1. Szybkość SPI ustawiłem w programie na ok 2 MHz, można podciągnąć ją do 12 MHz. Projekt skonfigurowałem i wygenerowałem za pomocą wtyczki MCC do środowiska MPLABX-IDE. Zawartość plików spi.h i spi1.c wygenerowanych przez MCC zastąpiłem całkowicie swoim rękodziełem. Nie dlatego, że propozycja Microchipa była zła bo jest ona nawet doskonała, ale ja lubię czasami po swojemu jak najprościej się da.

Jeszcze kwestia kolorów, wyświetlacz ma możliwość interpretowania 262k kolorów czyli format RGB666. Ponieważ i tak nie odróżniam więcej niż 65k kolorów :) dlatego na taki format się nastawiłem czyli RGB565. Ustawienia tego typu zmieniamy komendą Interface Control (F6h). W programie znajdziemy odwołanie do tej komendy pod nazwą ILI9341_CMD_INTERFACE_CONTROL, tylko w datasheet trzeba zerknąć jakie parametry trzeba po komendzie przesłać.
Po inicjacji wyświetlacza w moim programie będziemy w przestrzeni barw RGB565 (65k), dodałem na wszelki wypadek konwerter  RGB666(262k) gdyby ktoś się skusił jednak na ustawienie w wyświetlaczu szerszej palety barw.

Wspomnę również , że funkcje wyświetlające liczbę całkowitą i zmiennoprzecinkową putInteger() i putFloat() występują w dwóch wariantach. W wariancie domyślnym funkcje wykorzystują sprintf() (<stdio.h>). Funkcje tego typu rozpychają się w pamięci dlatego jakby ktoś chciał odchudzić program to ma do dyspozycji alternatywne funkcje , trzeba je tylko odkomentować a tamte zakomentować.

Testuję sobie powoli funkcje biblioteczne ale już wiem, że wyświetlacz jest naprawdę świetny. W stosunku do ILI9163 1.8" to ziemia a niebo, jakość wyświetlanej grafiki po prostu zachwyca. Rozdzielczość 320x240 robi swoje.

Pierwsze efekty działania biblioteki czyli misz masz graficzny :


Do zdjęcia nie zdjąłem folii ochronnej więc w realu to jeszcze lepiej wygląda. Przyznam ,że jak człowiek trochę po obcuje z wyświetlaczem graficznym to na tekstowy później się nie chce patrzeć.

Biblioteka gotowa. Zapraszam do używania. Projekt z GitHuba ściągamy do MPLABX-IDE za pomocą komendy Clone lub manualnie  (Linux w konsoli): 

git clone https://github.com/PICmajster/PIC32MM_ILI9341.git

Pozdrawiam
picmajster.blog@gmail.com



Linki :

9 komentarzy:

  1. tutaj projekt z wiznet w5500 , moduł wiz850 , procesor 32mm064 28dip, chodzi na starej płytce ,z pic32mm0256g48 nie chce coś przydzielić adresu, jeszcze powalcze , ale udostępniam na github https://github.com/witoldinho/pic32mm064

    OdpowiedzUsuń
  2. Nie mam jeszcze tych modułów ale mi przypomniałeś , że trzeba je mieć :) rozejrzę się za nimi na dalekim wschodzie. Walcz i nie poddawaj się .

    OdpowiedzUsuń
  3. stałem się ofiarą własnej prowizorki i bałaganu , od nowa muszę zrobić zgodnie ze sztuką albo zbliżeniem do niej https://github.com/witoldinho/wiznet_w5500
    moduł "W5500 sieci Ethernet moduł sprzętu TCP/IP 51/STM32 program mikrokontrolera ponad W5100" za 2,8$ , działa ;-)

    OdpowiedzUsuń
  4. No to leć do sklepu osiedlowego po szampana :)

    OdpowiedzUsuń
  5. zauważyłem że MCC dla prędkości UART powyżej 115kbit/s preferuje taktowanie 4xbaud rate zamiast 16 gdy ze wzoru wychodzi liczba całkowita i większa dokładność .Widać to na przebiegach

    OdpowiedzUsuń
  6. Nie zgłębiałem tematu, więc nic mądrego czy głupiego ci nie powiem :)

    OdpowiedzUsuń
  7. Potwierdza się to co pisałeś w blogu , aby sprawdzać co MCC wygenerował

    OdpowiedzUsuń
  8. chciałem po WIFI posterować ws2812 , stąd szybki UART jest mi potrzebny oraz CLC z PWM i SPI. Jak nie wyjdzie to mam wiznet jako alternatywę

    OdpowiedzUsuń