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!)


    ./hackfs.sh /dev/sdb

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ć)