Wyświetlacz LCD w OpenWrt
Ostatnia zmiana: 2015-04-25 08:09
Do czego może przydać wyświetlacz LCD w ruterze? Można wyświetlać informacje o systemie, bieżące statystyki, informacje o połączonych klientach, ilość miejsca na dysku, monitorować ściąganie torrentów, wyświetlać kanały rss, wykresy statystyk łącza czy monitorować ups. Możliwości jest wiele. Niestety, wyświetlacze są stosunkowo drogie, ale można wykorzystać popularne breloki LCD na zdjęcia.
Cyfrowy brelok na zdjęcia jest prostym urządzeniem wyposażonym w
- 8 bitowy procesor (najczęściej st2205)
- wyświetlacz LCD (kolor, graficzny, wielkość ok 1.5", zwykle jest to 128x128 pixeli)
- pamięć flash (2/8/16MB)
- złącze mini USB
- małą baterię Li-Ion
W normalnym trybie umożliwia tylko wyświetlanie zdjęć zapisanych wcześniej w pamięci flash. Jednakże dzięki odpowiedniemu oprogramowaniu możliwe jest przekształcenie go w dodatkowy wyświetlacz, umożliwiający pokazywanie obrazu na bieżąco transmitowanego przez kabel USB. Dzięki temu możliwe jest wyświetlenie tekstu na ekranie, wyświetlenie obrazka (setpic), obejrzenie filmu! (mplayer) czy różnorodnych informacji przy pomocy programu LCD4Linux.
Projekt LCD4Linux umożliwia wyświetlanie informacji na różnych rodzajach wyświetlaczy LCD, graficznych i alfanumerycznych. Można wyświetlać informacje o cpu, dyskach, sieci, wifi, statystykach, monitorowanie demona mpd, mysql, skrzynek pocztowych, tunerów DVB, kanałów rss, pogody, obrazków czy dowolnej informacji tekstowej i prezentowanie informacji w różnorodny sposób. Opis funkcjonalności można znaleźć na
stronie projektu.
W tym rozwiązaniu wykorzystano "Cyfrowy brelok na zdjęcia" model Dig-291, dostępny na allegro i w sklepach "Biedronka" (!) w cenie ok 20-30zł. Brelok należy najpierw zmusić do wyświetlania obrazu live przez odpowiednią modyfikację jego firmware. Jako ruter - Linksys WRT160NL z USB z OpenWrt Kamikaze (trunk).
Hack
Należy to wykonać z poziomu normalnego systemu i Linuksa. Tą operację wykonuje się tylko raz. Po ściągnięciu i skompilowaniu źródeł projektu
PicFrame podłączamy brelok do USB, wybieramy na nim "USB Update". W logach systemowych powinna pojawić się informacja o podłączeniu urządzenia (w tym przypadku wyglądało to następująco):
usb-storage: device found at 3
usb-storage: waiting for device to settle before scanning
scsi 9:0:0:0: Direct-Access SITRONIX MULTIMEDIA 0.09 PQ: 0 ANSI: 0 CCS
sd 9:0:0:0: Attached scsi generic sg2 type 0
sd 9:0:0:0: [sdb] 4096 512-byte hardware sectors: (2.09 MB/2.00 MiB)
sd 9:0:0:0: [sdb] Write Protect is off
sd 9:0:0:0: [sdb] Mode Sense: 0b 00 00 08
sd 9:0:0:0: [sdb] Assuming drive cache: write through
usb-storage: device scan complete
sd 9:0:0:0: [sdb] Assuming drive cache: write through
sdb: unknown partition table
sd 9:0:0:0: [sdb] Attached SCSI removable disk
Nie ma na nim partycji, komunikaty są prawidłowe. Brelok został podłączony jak /dev/sdb.
Następnie uruchamiamy odpowiednią procedurę modyfikacji firmware (jako root!)
gdzie /dev/sdb jest urządzeniem pod którym widoczny jest brelok. Należy postępować wg wskazówek wyświetlanych na ekranie; po udzieleniu paru odpowiedzi twierdzących rozpocznie się modyfikacja firmware. Trwa ona parę sekund, później należy urządzenie odłączyć, podłączyć jeszcze raz i potwierdzić wciskając Enter. Jeżeli wszystko wykonano prawidłowo, na wyświetlaczu pojawi się napis "It Works!". Teraz urządzenie jest gotowe do dalszego wykorzystania.
Instalacja
Wszystko już z poziomu rutera.
opkg update
opkg install kmod-usb-core kmod-usb2 kmod-usb-storage
opkg install st2205tool lcd4linux
/etc/init.d/lcd4linux stop
/etc/init.d/lcd4linux enable
UWAGA: Dla Asusa WL-500gP (Broadcom) odpowiednie pliki dostępne są na
http://eko.one.pl/openwrt/index.php?path=kamikaze%2F8.09.1/Konfiguracja
Całość konfiguracji należy wykonać w pliku
/etc/lcd4linux.conf. Widgety, layouty i pluginy opisane są na
stronie projektu. Plik konfiguracyjny musi być zapisany z odpowiednimi prawami, inaczej program
lcd4linux nie będzie chciał się uruchomić.
chown root.root /etc/lcd4linux.conf
chmod 600 /etc/lcd4linux.conf
Poniżej zaprezentowano przykład pliku konfiguracyjnego:
Variables {
wifi 'wlan0'
wan 'eth0'
dysk '/tmp'
minuta 60000
transparent 'ffffff00'
}
Display st2205u {
Driver 'st2205'
Port '/dev/sda'
Font '6x8'
Foreground 'ffffff'
Background '000000'
Basecolor '000000'
}
Widget hostname {
class 'Text'
expression uname('nodename')
width 21
align 'C'
style 'bold'
}
Widget uptime {
class 'Text'
expression uptime('%d dni %H:%M:%S')
width 21
prefix 'Uptime '
Background transparent
}
Widget wan_info {
class 'Text'
expression netinfo::ipaddr(wan)
prefix 'WAN IP: '
align 'C'
width 21
style bold
}
Widget down_icon {
class 'Icon'
speed 500
Bitmap {
Row1 '.....|..*..|.***.|*****|.***.|.***.|.***.'
Row2 '.....|.....|..*..|.***.|*****|.***.|.***.'
Row3 '.***.|.....|.....|..*..|.***.|*****|.***.'
Row4 '.***.|.***.|.....|.....|..*..|.***.|*****'
Row5 '.***.|.***.|.***.|.....|.....|..*..|.***.'
Row6 '*****|.***.|.***.|.***.|.....|.....|..*..'
Row7 '.***.|*****|.***.|.***.|.***.|.....|.....'
Row8 '..*..|.***.|*****|.***.|.***.|.***.|.....'
}
Background transparent
Foreground '00ff00'
}
Widget up_icon {
class 'Icon'
speed 500
Bitmap {
Row8 '.....|..*..|.***.|*****|.***.|.***.|.***.'
Row7 '.....|.....|..*..|.***.|*****|.***.|.***.'
Row6 '.***.|.....|.....|..*..|.***.|*****|.***.'
Row5 '.***.|.***.|.....|.....|..*..|.***.|*****'
Row4 '.***.|.***.|.***.|.....|.....|..*..|.***.'
Row3 '*****|.***.|.***.|.***.|.....|.....|..*..'
Row2 '.***.|*****|.***.|.***.|.***.|.....|.....'
Row1 '..*..|.***.|*****|.***.|.***.|.***.|.....'
}
Background transparent
Foreground 'ff0000'
}
Widget wan_dl {
class 'Text'
expression (netdev(wan, 'Rx_bytes', 500))/1024
postfix 'kB/s'
width 8
precision 0
align 'R'
Foreground 'ffffff'
Background transparent
}
Widget wan_up {
class 'Text'
expression (netdev(wan, 'Tx_bytes', 500))/1024
postfix 'kB/s'
width 8
precision 0
align 'R'
Foreground 'ffffff'
Background transparent
}
Widget wan_bar {
class 'Bar'
expression netdev(wan, 'Rx_bytes', 500)
expression2 netdev(wan, 'Tx_bytes', 500)
length 21
direction 'E'
Foreground 'ffffff'
Background '00000080'
BarColor0 '008000'
BarColor1 '800000'
}
Widget tlo {
class 'Image'
file 'openwrt.png'
reload 0
update 0
inverted 0
visible 1
}
Widget wlan_info {
class 'Text'
expression wifi::essid(wifi)
prefix 'ESSID '
width 17
update minuta
style bold
}
Widget wlan_info1 {
class 'Text'
expression wifi::bitrate(wifi)/1024/1024
prefix '@'
width 4
precision 0
update minuta
style bold
}
Widget wlan_klienci {
class 'Text'
expression exec ('/usr/sbin/iw dev '.wifi.' station dump | grep "on '.wifi.'" | wc -l',1000)
prefix 'Podlaczonych '
width 21
Background transparent
}
Widget dysk_wolne {
class 'Text'
expression statfs(dysk, 'bavail')*statfs(dysk, 'bsize')/1024
prefix dysk.' '
postfix 'KB dostepne'
width 21
precision 2
update minuta
Background transparent
}
Widget dysk_bar {
class 'Bar'
expression statfs(dysk, 'blocks')-statfs(dysk, 'bavail')
min 0
max statfs(dysk, 'blocks')
length 16
direction 'E'
update minuta
Foreground 'ffffff'
BarColor0 '8f8fff'
BarColor1 '8f8fff'
Background transparent
style 'H'
}
Widget dysk_zajete {
class 'Text'
expression statfs(dysk, 'bavail')*100/statfs(dysk, 'blocks')
width 4
update minuta
postfix '%'
precision 0
Background transparent
}
Layout mylayout {
Row01.Col01 'hostname'
Row03.Col01 'uptime'
Row05.Col01 'wan_info'
Row07.Col01 'down_icon'
Row07.Col02 'wan_dl'
Row07.Col11 'up_icon'
Row07.Col12 'wan_up'
Row08.Col01 'wan_bar'
Row10.Col01 'wlan_info'
Row10.Col18 'wlan_info1'
Row11.Col01 'wlan_klienci'
Row13.Col01 'dysk_wolne'
Row14.Col01 'dysk_bar'
Row14.Col18 'dysk_zajete'
Layer 2 {
X1.Y1 'tlo'
}
}
Display 'st2205u'
Layout 'mylayout'
Uruchomienie
Podłączamy brelok za pomocą kabla USB, przełączamy go w tryb "USB Update". Następnie uruchamiamy testowo naszą konfigurację:
lcd4linux -F -f /etc/lcd4linux.conf
Jeżeli wszystko przebiegło prawidłowo, na konsoli program powinien wypisać informacje o znalezionym urządzeniu
libst2205: detected device, 128x128, 24 bpp.
oraz wyświetlić skonfigurowany obraz na urządzeniu.
Można już normalnie uruchomić proces przez
/etc/init.d/lcd4linux start i cieszyć się wyświetlanymi informacjami.
Uwagi końcowe
Modyfikację firmware breloka wykonuje się tylko raz, nie traci on przy tym swojej podstawowej funkcjonalności. Skrypt uruchamiający wyświetlanie można podpiąć pod subsystem hotplug, dzięki czemu będzie się uruchamiał tylko jak podłączymy brelok pod ruter.
Na koniec mała galeria:
Widok breloka
(kliknij, aby powiększyć)
(kliknij, aby powiększyć)
(kliknij, aby powiększyć)
Podłączony zestaw i wyświetlana informacja
(kliknij, aby powiększyć)
(kliknij, aby powiększyć)