Tym razem projekt oparty o komputerek Raspberry Pi, dokładnie Raspberry Pi 2, który stworzyłem już wcześniej, ale ostatnio przybrał na tyle dopracowaną formę, że mogę go w końcu zaprezentować. Pierwsza wersja wykonana była na Raspberry Pi 1 z 256MB RAM – poza nieco wolniej działającym i lagującym menu, działał równie dobrze.
Projekt to odtwarzacz mediów, głównie filmów, podłączany do telewizora. Łączy kilka pożądanych cech, nie tak oczywistych w dostępnych komercyjnie produktach:
- kompaktowe rozmiary,
- CEC, czyli w skrócie obsługa pilotem od telewizora,
- WiFi umożliwiające dostęp do zasobów na serwerze NAS,
- wyświetlacz z podstawowymi informacjami o odtwarzanym materiale.
Projekt to w zasadzie połączenie kilku elementów: komputerek Rpi 2, obudowa, karta WiFi na USB, system OSMC (na karcie micro SD 8GB), moduł dla wyświetlacza HD44780 na I2C, sam wyświetlacz (akurat w wersji z zielonym podświetleniem i kilka przewodów. W zasadzie tyle. W ramach poradnika w skrócie poniżej opis konfiguracji OSMC, żeby działał z naszym wyświetlaczem.
Podłączenie wyświetlacza jest dość trywialne – +5V, GND, SDA, SCL – do odpowiednich pinów RPi (1, 6, 3, 5)
Po pierwsze po zainstalowaniu OSMC na karcie, warto podłączyć się do sieci. Dalsza częśc konfiguracji już zdalnie z wygodnego peceta.
Osmc przyjmuje domyślną nazwę hosta osmc, użytkownik osmc i hasło oczywiście także osmc. (Na Linuxie można wydać ssh osmc@osmc).
Kolejna rzecz – włączenie interfejsu I2C. Po pierwsze do /etc/modules dodajemy linię:
i2c-dev
i w /boot/config.txt linijkę:
dtparam=i2c_arm=on
Możemy wydać sobie sudo reboot i sprawdzić czy mamy aktywne I2C:
osmc@osmc:~$ ls /dev/i2c* /dev/i2c-1
Jeśli wynik jest taki, to można przejść dalej. Instalujemy lcdproc i i2c-tools:
sudo apt-get install i2c-tools lcdproc
Teraz możemy sprawdzić, czy nasz wyświetlacz jest wykrywany. Wydajemy:
osmc@osmc:~$ sudo i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- -- --
lub
i2cdetect -y 0
jeśli masz urządzenie /dev/i2c-0 – różnie w zależności od modelu Raspberry Pi. Jak widać pod adresem 0x27 jest obecne urządzenie. Adres można w pewnym zakresie ustawiać za pomocą zworek A0, A1, A2 na module. Przydatne, jeśli chcemy podłączyć kilka urządzeń.
Kolejny etap – podmiana sterownika do LCD. Standardowy sterownik do tego typu wyświetlacza – czyli HD44780 – HD44780.so nie wspiera niestandardowych układów podłączenia wyjść układu PCF8574 i w zależności od modułu może działać lub nie. Sterownik można pobrać stąd https://github.com/wilberforce/lcdproc, lub poniżej wrzucę swój zestaw materiałów do pobrania do realizacji projektu. Ten sterownik wspiera konfigurację podłączenia pinów, co pozwala na obsługę każdego właściwie modułu.
Sterownik można wrzucić np do lokalizacji: /usr/lib/lcdproc/
Kolejny etap – edycja pliku konfiguracyjengo LCDproc: /etc/LCDd.conf
Po kolei:
Zmienna DriverPath – ustawiamy na ścieżkę, gdzie wrzuciliśmy nasz sterownik.
Zmienna Driver – podajemy hd44780.
I dalej – konfiguracja naszego wyświetlacza:
## Hitachi HD44780 driver ## [hd44780] # Select what type of connection. See documentation for types. ConnectionType=i2c # Port where the LPT is. Usual value are: 0x278, 0x378 and 0x3BC Port=0x27 # Device of the serial interface [default: /dev/lcd] Device=/dev/i2c-1 # Bitrate of the serial port (0 for interface default) Speed=0 # If you have a keypad connected. # You may also need to configure the keypad layout further on in this file. Keypad=no i2c_line_RS=0x01 i2c_line_RW=0x02 i2c_line_EN=0x04 i2c_line_BL=0x08 i2c_line_D4=0x10 i2c_line_D5=0x20 i2c_line_D6=0x40 i2c_line_D7=0x80 # Set the initial contrast (bwctusb and lcd2usb) [default: 500; legal: 0 - 1000] Contrast=0 # Set brightness of the backlight (lcd2usb only) [default: 0; legal: 0 - 1000] #Brightness=1000 #OffBrightness=0 # If you have a switchable backlight. Backlight=yes BacklightInvert=yes # If you have the additional output port ("bargraph") and you want to # be able to control it with the lcdproc OUTPUT command OutputPort=no # Specifies if the last line is pixel addressable (yes) or it controls an # underline effect (no). [default: yes; legal: yes, no] #Lastline=yes # Specifies the size of the LCD. # In case of multiple combined displays, this should be the total size. Size=16x2 # For multiple combined displays: how many lines does each display have. # Vspan=2,2 means both displays have 2 lines. #vspan=2,2 # If you have an HD66712, a KS0073 or another 'almost HD44780-compatible', # set this flag to get into extended mode (4-line linear). #ExtendedMode=yes # In extended mode, on some controllers like the ST7036 (in 3 line mode) # the next line in DDRAM won't start 0x20 higher. [default: 0x20] #LineAddress=0x10 # Character map to to map ISO-8859-1 to the LCD's character set # [default: hd44780_default; legal: hd44780_default, hd44780_euro, ea_ks0073, # sed1278f_0b, hd44780_koi8_r, hd44780_cp1251, hd44780_8859_5, upd16314 ] # (hd44780_koi8_r, hd44780_cp1251, hd44780_8859_5 and upd16314 are possible if # compiled with additional charmaps) CharMap=hd44780_default # If your display is slow and cannot keep up with the flow of data from # LCDd, garbage can appear on the LCDd. Set this delay factor to 2 or 4 # to increase the delays. Default: 1. DelayMult=4 # Some displays (e.g. vdr-wakeup) need a message from the driver to that it # is still alive. When set to a value bigger then null the character in the # upper left corner is updated every <KeepAliveDisplay> seconds. Default: 0. #KeepAliveDisplay=0 # If you experience occasional garbage on your display you can use this # option as workaround. If set to a value bigger than null it forces a # full screen refresh <RefreshDiplay> seconds. Default: 0. RefreshDisplay=5 # You can reduce the inserted delays by setting this to false. # On fast PCs it is possible your LCD does not respond correctly. # Default: true. DelayBus=true # If you have a keypad you can assign keystrings to the keys. # See documentation for used terms and how to wire it. # For example to give directly connected key 4 the string "Enter", use: # KeyDirect_4=Enter # For matrix keys use the X and Y coordinates of the key: # KeyMatrix_1_3=Enter KeyMatrix_4_1=Enter KeyMatrix_4_2=Up KeyMatrix_4_3=Down KeyMatrix_4_4=Escape
Port – tutaj podajemy adres, który pojawił się w i2c-detect – u mnie 0x27. Size – rozmiar naszego wyświetlacza, mój akurat ma 2 linie po 16 znaków. Testowałem też wyświetlacz 2×20 – bez problemu korzysta z większego obszaru. W liniach i2c_line wpisujemy konfigurację naszego podłączenia – prawdopodobnie będzie taka jak moja, ze względu na budowę dostępnych modułów. Mój lcdproc.conf można pobrać poniżej.
Pozostaje tylko w OSMC zainstalować odpowiednią usługę: Ustawienia >> Menedźer dodatków >> Zainstaluj z repozytorium >> Usługi >> XBMC LCDproc >> Instaluj
Warto zrobić reboot i powinno działać. Układ poszczególnych ekranów na wyświetlaczu można sobie ustawić edytując plik: ~/.kodi/userdata/LCD.xml. Swój przykładowy również udostępniam do pobrania.