SmartHub – moduł sterowania listwą LED WS2812B – podejście drugie, RS485

Właśnie udało mi się przetestować działanie animacji przesyłanych po RS485. Krótko na temat zalet tego podejścia – przesyłanie animacji w taki sposób powoduje, że dodanie nowej animacji nie wymaga przeprogramowania modułu. Dodatkowo możliwe jest stworzenie animacji kontekstowych np. wizualizacje odtwarzanej muzyki.

Zacznę od opisu połączeń. Tak naprawdę na potrzeby testów nie są wymagane konwertery na RS485 – można użyć bezpośrednio konwertera USB to TTL. TTL to standardowe sygnały przesyłane między mikrokontrolerami AVR. Ja do testów jako mikrokontrolera użyłem Arduino Uno.

Połączenie w wersji bez konwerterów RS485 wygląda następująco: konwerter USB do TTL z jednej strony jest podłączony do komputera, a z drugiej do mikrokontrolera – GND z GND, RX konwertera z TX’em mikrokontrolera (w kodzie przykładu jest to pin numer 7) oraz TX konwertera z RX’em mikrokontrolera (w kodzie przykładu jest to pin numer 6).

Połączenie w wersji z konwerterami RS485 wykorzystuje dodatkowy moduł SN75176 (ja miałem wersję SN75176BP – zamiennie można użyć modułu MAX485), a zamiast konwertera USB na TTL jest konwerter USB na RS485, o którym pisałem we wcześniejszym wpisie. Konwerter USB należy połączyć z modułem SN75176 łącząc piny A i B modułu, z wyjściami A i B konwertera (A z A i B z B). Moduł SN75176 należy połączyć z mikrokontrolerem w następujący sposób: GND z GND, pin VCC modułu z pinem 5V mikrokontrolera, piny RE (Receive Enable) i DE (Driver Enable) należy zmostkować (połączyć ze sobą) i połączyć z pinem kontrolnym transmisji – w kodzie przykładu jest to pin 5 mikrokontrolera (SSerialTxControl), pin R modułu (Logic Data Output) należy połączyć z pinem RX mikrokontrolera (w kodzie przykładu jest to pin numer 6), pin D modułu (Logic Data Input) należy połączyć z pinem TX mikrokontrolera (w kodzie przykładu jest to pin numer 7).

Kod przykładu jest dostępny tutaj. Slave to kod na Arduino odbierający animacje. Master to aplikacja konsolowa napisana w C#, która wysyła animacje – ma zaimplementowane te same animacje co poprzednie kody modułu sterownika, które wrzuciłem. Z powodu błędów podczas przesyłania danych dodałem do przesyłanych danych sumę kontrolną CRC32, która jest wyliczana na masterze i weryfikowana na slavie. W kodzie slave została użyta biblioteka CRC32 dostępna pod tym adresem. Początkowo myślałem, że błędy te są spowodowane użyciem konwerterów RS485 (bo nigdy przesyłając dane do Serial Monitora Arduino nie zdarzyło mi się otrzymać błędnych danych), ale po testach z konwerterem USB na TTL okazało się, że nie ma to znaczenia, a błędy pojawiają się w obu wersjach połączeń przy większych prędkościach transmisji. W kodzie została wpisana największa prędkość transmisji, w której większość przesyłanych danych była przesyłana bez błędów – była to prędkość 74880. 

Problem ten może spowodować, że przesyłanie animacji tym sposobem może okazać się niepraktyczne. Zwłaszcza, gdy jedna magistrala będzie wykorzystywana do sterowania kilkoma modułami. Przy największej działającej prędkości możliwe jest przesłanie 9360 bajtów / s. Dla 5 metrowej listwy jedna wiadomość składa się z 450 bajtów. Pozwala to na przesłanie 20 wiadomości w ciągu sekundy – 20 FPS to trochę mało. Na razie nie mam pomysłu na rozwiązanie tego problemu. Być może moduł ESP8266 będzie lepiej się nadawał do tego – ma 26 Mhz kwarc, co może dać lepsze czasy transmisji (jeżeli ograniczeniem jest prędkość pracy mikrokontrolera). W wolnym czasie będę szukał możliwości rozwiązania tego problemu. Zgodnie z dokumentacją RS485 przy połączeniach do 10 metrów możliwa prędkość sięga 35Mbit/s, a przy dłuższych 100 Kb/s (max 1200 m), co już nawet przy mniejszej prędkości pozwala na przesłanie 227 wiadomości na sekundę (tak jak wyżej, dla 5 metrowej listwy).

Nie sprawdzałem działania dla wersji bez buforowania, ponieważ powyższe problemy aktualnie i tak dyskwalifikują ten sposób przesyłania animacji. Niedługo jednak zajmę się dodaniem animacji związanej z wizualizacją odtwarzanej muzyki, żeby zweryfikować taką możliwość.

Jeszcze małe podsumowanie kosztów:

  • Konwerter USB na RS485 – 3,40 zł
  • Moduł przewlekany SN75176BP – 1,30 zł

Poniżej umieszczam linki do ciekawych artykułów, które pomogły mi w zapoznaniu się z tym tematem. Znajdują się tam także dodatkowe informacje o zasadzie działania standardu RS485, których nie opisałem w tym wpisie:

  • https://arduino-info.wikispaces.com/RS485-Modules
  • http://www.teknynja.com/2014/02/driving-ws2812neopixels-rgb-leds-over.html
  • http://real2electronics.blogspot.com/2009/09/arduino-and-rs485-english-version.html

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *