- umożliwia dołączenie do Raspberry PI Zero wyświetlacz ze standardowym 50-pinowym złączem FFC/FPC,
- dostarcza napięć polaryzacji AVdd, Vgh, Vgl i regulowanego Vcom,
- zawiera przetwornicę zasilającą podświetlenie panelu obsługującą równoległe łańcuchy z trzech połączonych szeregowo diod LED.
W porównaniu z wyświetlaczami o mniejszych przekątnych, wyświetlacze 7-calowe często wymagają zewnętrznego obwodu generującego napięcia polaryzacji. Oczywiście dostępne są modele z wbudowaną przetwornicą, ale są kilkakrotnie droższe i niestety są niezgodne mechanicznie i elektrycznie z wyświetlaczami pozbawionymi przetwornicy. Opisany moduł dostarcza napięć polaryzacji AVdd, Vgh, Vgl i regulowanego Vcom, które w prosty sposób poprzez dobór kilku elementów mogą zostać dopasowane do zalecanych dla wyświetlacza wartości. Płytka zawiera też przetwornicę zasilającą podświetlenie panelu z możliwością programowego wyłączenia, obsługującą równoległe łańcuchy z trzech połączonych szeregowo diod LED (Vled ok. 9,8 V; 3×7/3×9/3×11 LED).
Budowa i działanie
Przyporządkowanie sygnałów złącza wyświetlacza opisano w tabeli 1. Do obsługi wyświetlacza zastosowana jest konfiguracja ALT2 GPIO przeznaczona do współpracy z wyświetlaczem z interfejsem równoległym DPI-RGB. Schemat płytki interfejsu został pokazany na rysunku 1.
Moduł składa się z dwóch przetwornic – U1 odpowiedzialnej za generowanie prądu dla układu podświetlenia oraz U2 dostarczającej napięć polaryzacji panelu LCD.
Blok konwertera podnoszącego napięcie bazuje na układzie U1 typu AP3031. Oprócz generowania napięcia do zasilania łańcucha białych LED układu podświetlenia, stabilizuje ich prąd pracy. Wartość prądu określają rezystory R1 i R2, napięcie na wyprowadzeniu FB dla określonego prądu podświetlenia powinno wynosić ok. 200 mV, co w modelu odpowiada wartości ok.180 mA. Opcjonalna zwora BL umożliwia wyłączenie podświetlenia zewnętrznym przełącznikiem. Układ bufora U2 odpowiada za programowe sterowanie podświetleniem za pomocą wyprowadzenia GPIO27. Domyślnie po uruchomieniu Pi podświetlenie jest wyłączone i należy je aktywować ustawiając stan wysoki GPIO27. Układ U3, także typu AP3031 pracuje w konfiguracji przetwornicy podwyższającej o napięciu wyjściowym ustalonym dzielnikiem R13, R11.
Obie przetwornice zasilane są z napięcia 5 V (obwód V50) z Raspberry Pi. Obwód R10, C7 minimalnie opóźnia start przetwornicy U2. Napięcie wyjściowe przetwornicy U2 służy do zasilania części analogowej LCD potencjałem AVdd. W modelu dzielnik ustala napięcie wyjściowe na ok. 10,4 V wymagane dla wyświetlacza Winstar WF70A2TIAGDNN0#. Z napięcia AVdd poprzez dzielnik R13, RV, R14 generowane jest napięcie VCom. Potencjometr RV umożliwia jego regulację w celu ustawienia najlepszego kontrastu wyświetlanego obrazu.
Dla generowania napięcia Vgh zastosowano powielacz napięcia z D4, C16, C17, w którym napięcie klucza SW jest dodawane do napięcia AVdd przetwornicy U2. Napięcie wyjściowe jest stabilizowane diodą Zenera DZ2 na wartość ok. 15 V i dodatkowo filtrowane przez C18, C19. Ujemnego napięcia dostarcza odwracacz zbudowany z elementów D3, C12, C13. Jego napięcie wyjściowe stabilizowane jest diodą DZ1 i w modelu wynosi ok. –10 V. Rezystory R16, R18 rozładowują kondensatory filtrujące napięcia Vgh, Vgl po wyłączeniu zasilania układu. Dobierając wartości R11, R13, DZ1, DZ2 i ich rezystory R15, R17, można dostosować układ do współpracy z innymi typami wyświetlaczy.
Przykładowe wartości napięć dla popularnych typów wyświetlaczy zestawiono w tabeli 2. Napięcie V33 zasilania części cyfrowej LCD pobierane jest bezpośrednio z Raspberry. Rezystory R5, R6, R7, R9 konfigurują tryb pracy wyświetlacza, obwód R8, C5 zapewnia restart po włączeniu zasilania.
Pomimo prostego interfejsu, obsługa wyświetlacza LCD w trybie równoległym DPI w przypadku RPi generuje jeden bardzo poważny problem – zajmuje praktycznie większość GPIO i wymusza podłączenie współpracujących urządzeń przez porty USB. Od tych ograniczeń wolne są aplikacje Compute Module 3 ze znacznie większą liczbą dostępnych wyprowadzeń i elastycznością konfiguracji GPIO.
Montaż i uruchomienie
Układ został zmontowany na niewielkiej dwustronnej płytce drukowanej, której schemat wraz z rozmieszczeniem elementów został pokazany na rysunku 2. Płytka jest zgodna elektrycznie z każdą wersją Raspberry Pi, ale mechanicznie dopasowana jest do Pi Zero, tworząc zwarty zestaw o niewielkich rozmiarach. Montaż płytki nie wymaga dokładnego opisu. W zależności od posiadanego wyświetlacza należy dobrać prąd podświetlenia za pomocą rezystorów R1 i R2 oraz wartości napięć zasilania. Złącze BL jest opcjonalne i montujemy je tylko w przypadku podłączenia wyłącznika podświetlenia.
Po zmontowaniu płytki, przed podłączeniem wyświetlacza, koniecznie należy sprawdzić poprawność generowania napięć wyjściowych Avdd, Vcom, Vgh, Vgl, Vcom. Potencjometrem RV należy ustawić wstępną wartość napięcia Vcom zgodnie z dokumentacją LCD. Przed włączeniem wyświetlacza należy zapoznać się z jego kartą katalogową, sprawdzić zgodność sygnałów ze złączem FPC oraz ustalić zależności czasowe niezbędne do prawidłowej konfiguracji wyświetlacza.
Przed użyciem interfejsu DPI należy wyłączyć obsługę I2C i SPI w pliku /boot/config.txt:
dtparam=i2c_arm=off
dtparam=spi=off
Do współpracy z LCD RGB przeznaczone są w systemie operacyjnym konfiguracje dtoverlay=dpi18 lub dtoverlay=dpi24. Niestety, ze względu na brak kanału informującego o parametrach wyświetlacza i dostępnych trybach pracy, jak ma to miejsce w przypadku HDMI, w każdym przypadku konieczna jest indywidualna i szczegółowa parametryzacja interfejsu DPI oraz dostosowanie częstotliwości zegara, kodowania koloru, synchronizacji i rozdzielczości przez użytkownika.
Przed konfiguracją wyświetlacza należy poinformować system o niestandardowym trybie pracy custom mode DPI poprzez wpis:
dpi_group=2
dpi_mode=87,
oraz o współpracy z wyświetlaczem DPI w pliku /boot/config.txt:
enable_dpi_lcd=1
display_default_lcd=1
Format wyjściowy DPI ustalany jest parametrem dpi_output_format w postaci liczby szesnastkowej. Znaczenie poszczególnych bitów zostało opisane na listingu 1.
output_format = (dpi_output_format >> 0) & 0xf;
rgb_order = (dpi_output_format >> 4) & 0xf;
output_enable_mode = (dpi_output_format >> 8) & 0x1;
invert_pixel_clock = (dpi_output_format >> 9) & 0x1;
hsync_disable = (dpi_output_format >> 12) & 0x1;
vsync_disable = (dpi_output_format >> 13) & 0x1;
output_enable_disable = (dpi_output_format >> 14) & 0x1;
hsync_polarity = (dpi_output_format >> 16) & 0x1;
vsync_polarity = (dpi_output_format >> 17) & 0x1;
output_enable_polarity = (dpi_output_format >> 18) & 0x1;
hsync_phase = (dpi_output_format >> 20) & 0x1;
vsync_phase = (dpi_output_format >> 21) & 0x1;
output_enable_phase = (dpi_output_format >> 22) & 0x1;
output_format:
1: DPI_OUTPUT_FORMAT_9BIT_666
2: DPI_OUTPUT_FORMAT_16BIT_565_CFG1
3: DPI_OUTPUT_FORMAT_16BIT_565_CFG2
4: DPI_OUTPUT_FORMAT_16BIT_565_CFG3
5: DPI_OUTPUT_FORMAT_18BIT_666_CFG1
6: DPI_OUTPUT_FORMAT_18BIT_666_CFG2
7: DPI_OUTPUT_FORMAT_24BIT_888
rgb_order:
1: DPI_RGB_ORDER_RGB
2: DPI_RGB_ORDER_BGR
3: DPI_RGB_ORDER_GRB
4: DPI_RGB_ORDER_BRG
output_enable_mode:
0: DPI_OUTPUT_ENABLE_MODE_DATA_VALID
1: DPI_OUTPUT_ENABLE_MODE_COMBINED_SYNCS
invert_pixel_clock:
0: RGB Data changes on rising edge and is stable at falling edge
1: RGB Data changes on falling edge and is stable at rising edge.
hsync/vsync/output_enable_polarity:
0: default for HDMI mode
1: inverted
hsync/vsync/oe phases:
0: DPI_PHASE_POSEDGE
1: DPI_PHASE_NEGEDGE
Parametry czasowe i rozdzielczość wyświetlacza ustalane są poleceniem dpi_timings, które zostało opisane na listingu 2.
dpi_timings=<h_active_pixels> <h_sync_polarity> <h_front_porch> <h_sync_pulse> <h_back_porch> <v_active_lines> <v_sync_polarity> <v_front_porch> <v_sync_pulse> <v_back_porch> <v_sync_offset_a> <v_sync_offset_b> <pixel_rep> <frame_rate> <interlaced> <pixel_freq> <aspect_ratio>
<h_active_pixels> = horizontal pixels (width)
<h_sync_polarity> = invert hsync polarity
<h_front_porch> = horizontal forward padding from DE acitve edge
<h_sync_pulse> = hsync pulse width in pixel clocks
<h_back_porch> = vertical back padding from DE active edge
<v_active_lines> = vertical pixels height (lines)
<v_sync_polarity> = invert vsync polarity
<v_front_porch> = vertical forward padding from DE active edge
<v_sync_pulse> = vsync pulse width in pixel clocks
<v_back_porch> = vertical back padding from DE active edge
<v_sync_offset_a> = leave at zero
<v_sync_offset_b> = leave at zero
<pixel_rep> = leave at zero
<frame_rate> = screen refresh rate in Hz
<interlaced> = leave at zero
<pixel_freq> = clock frequency (width*height*framerate)
<aspect_ratio> = *
aspect_ratio może przyjmować następujące wartości:
HDMI_ASPECT_4_3 = 1
HDMI_ASPECT_14_9 = 2
HDMI_ASPECT_16_9 = 3
HDMI_ASPECT_5_4 = 41
HDMI_ASPECT_16_10 = 5
HDMI_ASPECT_15_9 = 6
HDMI_ASPECT_21_9 = 7
HDMI_ASPECT_64_27 = 8
Jeżeli z przyczyn mechanicznych wyświetlacz wygodniej zamontować w pozycji pionowej lub odwróconej, parametrem display_rotate=x ustalamy wymaganą orientację, gdzie x = 0...3, a odpowiadająca wartościom orientacja wyświetlacza to: 0, 90, 180, 270°.
dtoverlay=dpi18
display_rotate=0
overscan_left=0
overscan_right=0
overscan_top=0
overscan_bottom=0
framebuffer_width=800
framebuffer_height=480
enable_dpi_lcd=1
display_default_lcd=1
dpi_group=2
dpi_mode=87
dpi_output_format=0x6f015
dpi_timings=800 0 40 48 88 480 0 13 3 32 0 0 0 60 0 32000000 6
Przykładowa konfiguracja ustalona dla wyświetlacza WF70A2TIAGDNN0# o przekątnej 7" i rozdzielczości 800×480 została pokazana na listingu 3. Czasami do ustalenia prawidłowych parametrów, szczególnie w przypadku braku wyświetlania lub zakłóceń w obrazie, konieczny jest oscyloskop lub analizator logiczny. Ważne jest, aby minimalizować długość połączeń taśmy wyświetlacza, unikając stosowania przedłużek, bo może to wpływać na jakość wyświetlanego obrazu. Do sprawdzenia parametrów wyświetlania można użyć polecenia:
Warto przeglądać zasoby sieci, czy nie jest dostępna gotowa konfiguracja do wyświetlacza, można zaoszczędzić sporo czasu. Obowiązkowo trzeba zapoznać się z dokumentacją Raspberry Pi: https://bit.ly/2PuEiHZ.
#!/bin/bash
cd /home/pi
BASE_GPIO_PATH=/sys/class/gpio
PIN1=27
if [ ! -e $BASE_GPIO_PATH/gpio$PIN1 ]; then
echo $PIN1 > $BASE_GPIO_PATH/export
fi
echo "out" > $BASE_GPIO_PATH/gpio$PIN1/direction
echo "1" > $BASE_GPIO_PATH/gpio$PIN1/value
echo "LCD wlaczony"
Po konfiguracji wyświetlacza konieczne jest wysterowanie linii GPIO27 w celu załączenia podświetlenia za pomocą skryptu backlightON.sh z listingu 4.
Adam Tatuś, EP
- R1, R2: 2,2 Ω SMD0805 1%
- R3, R5, R6, R7…R11, R16: 10 kΩ
- R4: 22 Ω
- R12: 510 kΩ
- R13: 27 kΩ
- R14, R18: 15 kΩ
- R15: 100 Ω
- R17: 1 kΩ
- RV: 10 kΩ potencjometr SMD
- C1: 0,47 µF /25 V SMD1206
- C2, C6: 10 µF SMD0603
- C3, C5, C9, C15, C19: 0,1 µF SMD0603
- C4, C11: 1 µF SMD0603
- C7, C10: 10 nF SMD0603
- C8, C14, C18: 10 µF /25 V SMD1206
- C12, C13, C16, C17: 0,22 µF /25 V SMD0805
- CE1: 47 µF/10 V tantalowy B SMD3528
- D1, D2: MBR130T1G dioda Schottky'ego (SOD123)
- D3, D4: BAT54S podwójna dioda Schottky'ego (SOT-23)
- DZ1: BZX84C10 dioda Zenera (SOT-23)
- DZ2: BZX84C15 dioda Zenera (SOT-23)
- U1, U3: AP3031KTR (SOT-23-6)
- U2: 74LVC07DCK (SC70-5)
- BL: złącze SIP2 + zwora (opcja)
- GPIO: złącze IDC40 żeńskie
- L1, L2: dławik mocy WE MAPI4020 4,7 µH (WE74438356047)
- LCD: złącze FPC 50 pinów styki dolne FPC (WE68715014522)