DMX512 i Arduino – kontroler serwomechanizmów

Przedmiotem artykułu jest kontroler serw sterowany przez interfejs DMX512. Sterownik oparty jest na platformie Arduino, konkretnie Arduino Nano. Jak to często bywa, część niezbędnego kodu została już przez kogoś stworzona, mianowicie dostępnych jest w sieci kilka bibliotek, które realizują protokół DMX512 (o większości z nich wspomniano na stronie Arduino), ja wybrałem bibliotekę DMXSerial.

W sieci jest sporo materiałów na temat samego protokołu DMX512, dlatego przedstawię tylko krótki jego opis, a dla chcących bardziej zagłębić się w temat podaję pod artykułem kilka linków.

DMX512 – co to takiego?

Interfejs DMX512 miał swoje początki w połowie lat 80. ubiegłego wieku, przez ten czas przeszedł szereg zmian. Stosowany jest do sterowania oświetleniem, generatorami dymu i wieloma innymi urządzeniami scenicznymi. Do przesyłu informacji używany jest interfejs RS-485, który składa się z dwóch linii przesyłających sygnał symetrycznie, co pozwala na przesyłanie sygnału na duże odległości w obecności dużych zakłóceń (w praktyce zasięg nawet do 1 km). Każda ramka protokołu DMX512 przesyła maksymalnie 512 8-bitowych wartości (stąd „512” w nazwie), każda z tych wartości nazywana jest kanałem, kanały numerowane są od 1 do 512. Ramki wysyłane są przez sterownik systemu, odbiorniki wyposażone są w gniazdo wejściowe i gniazdo wyjściowe, wyjście sterownika dołączane jest do wejścia pierwszego odbiornika, wyjście pierwszego odbiornika dołączane jest do wejścia kolejnego odbiornika itd. Każda ramka przetwarzana jest przez wszystkie odbiorniki, od konfiguracji odbiornika zależy które kanały odczyta i wykona związane z przesyłaną wartością operacje (możliwe jest używanie tego samego kanału dla kilku urządzeń).

Jak połączyć Arduino z DMX512

Mikrokontrolery zastosowane w Arduino nie są wyposażone w interfejs RS-485, natomiast można użyć dodatkowego modułu, który przekonwertuje interfejs RS-485 na UART, ja zastosowałem moduł firmy Waveshare z układem MAX485.

Jak widać moduł ma 5-pinowe złącze. Ponieważ dane będą tylko odbierane, wystarczy dołączyć do Arduino dwie linie:

  • RO – linia odbiorcza UART (wyjście danych UART z RS-485), jest dołączona do linii RX0 Arduino
  • RSE – ta linia odpowiada za przełączanie trybu pracy układu RS-485, stan niski uruchamia tryb odbioru danych, stan wysoki – tryb nadawania, linia dołączona jest do linii D7 Arduino

Linię RSE można tak naprawdę dołączyć do masy zasilania (o ile mamy pewność, że tryb nadawania nie będzie nigdy używany).

Do interfejsu DMX512 moduł można dołączyć na trzy sposoby:

  • za pomocą 2-pinowego złącza goldpin
  • za pomocą złącza śrubowego
  • za pomocą złącza RJ-11

Wszystkie te złącza zawierają linie A i B, linia A zawiera sygnał D+, linia B – sygnał D-. Sposób połączenia Arduino Nano, modułu z RS-485, złącza DMX512 oraz złącz serw widać na schemacie:

Na schemacie widoczne jest złącze dla sześciu serw, wszystkie piny w rzędach GND i + są ze sobą zwarte, natomiast linie PWM dołączone są do linii D3, D5, D6, D9, D10 i D11, na których Arduino może generować sygnały PWM. Dodatkowo na schemacie widać zworkę na linii łączącej wyjście RO modułu z wejściem RX0 Arduino, zworka jest niezbędna, ponieważ linia RX0 jest używana przez Arduino do komunikacji z wbudowanym układem FTDI232, który umożliwia programowanie Arduino, dodatkowo umożliwia konfigurację sterownika przez terminal. Przy normalnej pracy sterownika zworka musi być założona, podczas programowania i konfiguracji sterownika zworka musi być zdjęta.

Do prawidłowego działania programu wymagana jest instalacja biblioteki DMXSerial, instalacja jak zwykle w Arduino polega na rozpakowaniu archiwum do katalogu libraries.

Sposób działania sterownika

Podczas wykonywania programu kluczowa jest struktura, która zawiera konfigurację serwa:

Program używa tablicy takich struktur:

Po dołączeniu zasilania sterownik wywołuje funkcję setup:

Funkcja odczytuje zapisaną w pamięci EEPROM konfigurację, pamięć EEPROM zawiera po kolei trójki bajtów dla każdego serwa, trójki zawierają:

  • młodszy bajt numeru kanału DMX,
  • starszy bajt kanału DMX,
  • tryb pracy kanału – dla wartości 0 serwo otrzymuje sygnał PWM przez cały czas, dla wartości 1 serwo otrzymuje sygnał PWM przez czas określony w stałej SERVO_DELAY (w milisekundach) od ostatniej zmiany wartości kanału DMX512

Potem przez UART wysyłany jest komunikat „Aby wejsc w tryb konfiguracji nalezy wyslac polecenie KONF” i przez 5 sekund program oczekuje na ciąg „KONF” potwierdzony znakiem nowej linii (10). W praktyce jeśli zworka jest założona i dołączony nadajnik DMX coś wysyła, to program natychmiast przechodzi dalej, ponieważ odbiera „śmieci” (DMX pracuje z prędkością 250000 b/s, a UART – 9600 b/s), jeśli zworka jest zdjęta i wyślemy przez terminal polecenie KONF, to sterownik przechodzi w tryb konfiguracji, o którym dalej.

Następnie funkcja setup dokonuje konfiguracji odpowiednich zmiennych, inicjalizuje bibliotekę DMXSerial i program przechodzi do cyklicznego wywoływania funkcji loop:

Myślę, że komentarz zawarty w kodzie wystarczy do zrozumienia sposobu jego działania.

Tryb konfiguracji

Konfiguracja sterownika możliwa jest po usunięciu zworki przedstawionej na schemacie. Należy dołączyć Arduino do komputera za pomocą kabla USB i uruchomić program terminala (np. ten, który uruchamia się po naciśnięciu Ctrl+Shift+M w IDE Arduino) pamiętając oczywiście o wyborze odpowiedniego portu COM. Po wysłaniu polecenia „KONF” instrukcja konfiguracji wyświetli się w programie terminala. Polecenie konfiguracyjne ma następującą postać:

<numer_serwa>,<numer_kanału_DMX>,<tryb_pracy>

Parametry określają kolejno:

  • Numer serwa, które chcemy konfigurować (pierwsze serwo ma numer 1), drugi parametr
  • Numer kanału DMX dla serwa
  • Tryb pracy serwa (0 – PWM wysyłany przez caly czas, 1 – PWM wysyłany przez SERVO_DELAY milisekund od ostatniej zmiany)

Dodatkowo po wysłaniu znaku 'P’ można wydrukować konfigurację serw. Po skonfigurowaniu sterownika należy do odłączyć od zasilania i dołączyć ponownie oraz założyć zworkę.

Pełny kod programu

Linki

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.