Uruchomienie reklamowej tablicy LED, część IV

Co jeszcze zostało do zrobienia? Przede wszystkim rozpracowanie jak wysłać do tablicy długi tekst który będzie na niej przewijany. W tym celu trzeba znaleźć odpowiedzi na dwa pytania:

  • Jak skonfigurować ośmiobitowy blok efektów?
  • Jak poprawnie wysłać do tablicy więcej danych?

Na obydwa z łatwością odpowie Wireshark podsłuchujący komunikację z tablicą na którą wysyłane będą animacje.

XYLED pozwala na ustawienie 60 różnych efektów!

Z racji braku czasu skupiłem się jedynie na drugim efekcie z listy – przewijaniu w lewo. Kilka testów przyniosło odpowiedzi na wszystkie wątpliwości związane z tym efektem.

Blok kontroli efektów z ustawieniami dla przewijania

Bajty oznaczone na szaro nie zmieniały się pomimo żonglowania parametrami animacji – najprawdopodobniej używane są przy innych efektach, lub nie zmodyfikowałem ustawień które by na nie wpływały.

Oznaczony na zielono piąty bajt koduje w swojej drugiej połowie parametr opóźnienia – w XYLED możliwy do ustawienia między 0 a 7. W wypadku efektu przewijania określa on jak długo na tablicy będzie wyświetlała się końcówka napisu, kiedy animacja dojdzie do końca. W moim wypadku to kompletnie nieprzydatny parametr, więc zawsze ustawiam go na 0.

Szósty, żółty bajt na trzech pierwszych (najstarszych) bitach koduje prędkość animacji (0 to najszybsza, 7 to najwolniesza – logiczne, prawda?). Reszta bitów prawdopodobnie ma związek z numerem animacji (dla przewijania w lewo musi być ustawiona na 00001).

Ostatni bajt koduje długość danych – do 0x80 należy dodać liczbę „stron” jakie zajmuje tekst lub animacja. Co się stanie jeśli oszukamy sterownik i wyślemy tylko jedną stronę i licznik ustawimy np. na 40? Tablica wyświetli na samym początku nasz krótki tekst a potem odczyta pozostałości starych ustawień z pamięci i wyświetli 40 stron z nimi. Daje to bardzo ciekawy efekt – można podejrzeć dawną zawartość tablicy.

Zaktualizowany schemat transmisji

Jak natomiast wysłać więcej danych? Okazało się to bardzo proste – wystarczy zwyczajnie wysłać więcej bloków transmisyjnych, pamiętając tylko o tym żeby dostarczyć dane dla liczby segmentów będącą wielokrotnością 3 (tyle segmentów ma moja tablica).

Można to połączyć z funkcją generowaniem bitmapy, która wygląda teraz następująco:

def render_text(text, font_size=21, tile_height=32, page_width=32*3):

    image = Image.new('1', (page_width, tile_height), 0)

    font = ImageFont.truetype("arial.ttf", font_size)
    draw = ImageDraw.Draw(image)
    
    size = draw.textsize(text, font=font)

    if size[0] > page_width:
        image = image.resize((((size[0]/page_width)+1)*page_width, tile_height))
        draw = ImageDraw.Draw(image)

    #Wysrodkowanie w pionie
    y = (tile_height-size[1])/2

    draw.text((0,y), text, font=font, fill=1)

    return image

Długo wyczekiwany wynik jej pracy wygląda następująco:

Ale z generowaniem grafiki jest jeszcze jeden problem – tablica ma wyświetlać polskojęzyczne komentarze z mediów społecznościowych. Powinna więc móc wyświetlić nie tylko polskie znaki, ale także emotikony Unicode i przydałoby się wsparcie dla znaków grupy CJK (niektóre japońskie znaki używane są w miejsce emotikon, np. ツ). Niestety Pillow nie jest na tyle mądre żeby samo znaleźć czcionki zastępcze, więc wszystkie te znaki muszą znaleźć się w jednej. Bardzo trudno znaleźć też czcionkę która ma te wszystkie znaki i jednocześnie dobrze wygląda na tablicy.

FontForge

Rozwiązanie tego problemu zajęło raptem kilka minut – pamiętałem że kilkanaście lat temu edytowałem czcionki, dodając do nich polskie znaki i używałem do tego bardzo rozbudowanego programu FontForge. I tym razem to narzędzie mnie nie zawiodło – połączyć czcionki można w nim jednym kliknięciem, a kolejne dwa wystarczają żeby zapisać wynik prac.

Wszystko to razem prezentuje się na tablicy całkiem ładnie i okazuje się że rozdzielczość jest na tyle duża, że nawet chińskie znaki wydają się czytelne!

Wszystko gotowe? Też tak myślałem, ale na ostatniej prostej wystąpiło tyle zupełnie nieoczekiwanych problemów, że wystarczy ich na osobny, podsumowujący całą zabawę wpis!

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *