Komunikacja RS232 Arduino z projektorami NEC, EPSON
Temat podany w tytule porusza tylko kwestię komunikacji z projektorami, natomiast jest tylko częścią dużego projektu, który ze względu na specyfikę sali w jakiej jest używany nie nadaje się w całości do publikacji. Myślę jednak, że ze względu na znikome informacje w sieci na temat Arduino sterującego projektorami, może się to komuś przydać.
Postanowiłem zaprojektować sterownik do obsługi oświetlenia z możliwością wysyłania sygnału zał/wył do projektorów marki NEC oraz EPSON przy pomocy Arduino, modułu bluetooth, aplikacji na Androidzie.
Sterownik mój działa na podobnej zasadzie jak sterownik podlewania „Rain” z poprzednich publikacji więc jeżeli, ktoś będzie chciał zbudować sobie sterownik, to do Raina udostępniłem pełną dokumentację.
Teoretycznie każdy z projektorów posiada gniazdo RS232 . Komendy mogą się różnić w modelach danego producenta w zależności od osprzętu jaki posiada projektor, ale podstawowe funkcje włącz, wyłącz są zawsze takie same . Ze względu na to, że mam dostęp do projektorów EPSON i NEC przedstawię tu sposób na komunikację przy pomocy Arduino z nimi.
EPSON
Transmisja 9600 bps
Brak parzystości
Bity stopu : 1
Sterowanie przepływem: Brak
Komenda RS załączająca projektor:
PWR ON\r
Komenda wyłączająca:
PWR OFF\r
NEC
Jeżeli chodzi o komunikację RS, jest ona konfigurowalna z menu projektora ( ja zmieniłem aby było jak w Epsonie 9600bps) a domyślne jej parametry:
Transmisja 38400 bps
Brak parzystości
Bity stopu : 1
Sterowanie przepływem: Brak
Komenda RS załączająca projektor:
02 00 00 00 00 02
Komenda wyłączająca:
02 01 00 00 00 03
Wpadłem na pomysł aby zbudować sterownik na bazie arduino MEGA ze względu na większą (patrz 3 ) liczbę portów RS232 oraz ze względu na ilość pamięci Megi. Na nano też można zrobić i działać przy pomocy softwareseriall. Po zakupie Megi i kabelka RS232 damsko-męskiego przystąpiłem do napisania kodu uruchomieniowego dla projektora EPSON . Co najlepsze program zadziałał od startu poprzez wpisanie w linii Serial – komend na Serial2 dzięki poleceniu println(„komenda”); w postaci kodów ASCII.
Problem pojawił się z NEC-kiem, który w ogóle nie chciał podjąć współpracy. Nakombinowałem się z kodem aby uruchomić go, jednak bez sukcesu. Postanowiłem wziąć przejściówkę usb-rs232 i podpatrzyć transmisję z terminala. Moje zdziwienie było wielkie gdy okazało się, że wymiany danych brak. Pomyślałem o kablu tzw NullModem, na szczęście kolega miał taki więc podłączyłem go z przejściówką do PC i odpaliłem RealTerm. Sukces -> projektor bez problemu odpalił oraz zgasił się po wydaniu komend.
Teraz czas na Arduino, ale okazuje się, że kabelek nie pasuje z Arduino wychodzi żeński wtyk, kabelek jest żeńsko-żeński a do projektora męski „fuck” i tu chwila przerwy………………..
Załatwiłem przejściówkę męsko-męską DB9 myślałem, że to rozwiąże sprawę, ale jednak byłem w błędzie. Powiem lepiej g… a nie działa. Podszedłem do sprawy inaczej przejściówkę (patrz rs232-> usb ) podłączyłem do arduino i spiąłem na jednym kompie oba urządzenia ze sobą. Real terminal połączył się i wygląda na to że arduino wysyła i odbiera dane, a projektor nadal nie. Jedyna ciekawostka to taka, że przy połączonym konwerterze z projektorem podświetla się linia CTS – a do jasnej anieli miało nie być hardwareowej kontroli przepływu !!!! Patrzę na schemat NECA:
no i ma narysowany kabel RX->TX, TX->RX, GND->GND CTS-RTS !! HA HA a arduino nie ma sterowania przepływem, jedyny pomysł to zwarcie tych dwóch linii aby urządzenie (patrz-projektor „myślał”, że ma ) zobaczymy .
Zlutowanie pinów 7-8 tez nie pomogło w pierwszej fazie, choć jest to jedno z najważniejszych rzeczy jakie trzeba zrobić. Chciałem się już poddać, ale kolega, który przyszedł mnie odwiedzić powiedział, abym jeszcze raz przedzwonił kable i okazało się, że dwa z trzech testowanych są krosowane a ten który działa z Epsonem jest na „wprost” i o dziwo ten też zadziałał z Neckiem.
Wniosek następujący :
– cierpliwość zostanie nagrodzona !
– nie ufać przejściówkom RS232C->USB bo mogą mieć odwrócone linie RX -> TX i wprowadzą cię w błąd .
– Należy zlutować linie CTS -> RTS – w przypadku arduino nie ma znaczenia czy zrobi się to na wtyczce z modułem max3232 – czy też we wtyczce przy projektorze, grunt aby zwora była bo inaczej NEC nie reaguje na komendy ! W przypadku Epsona nie ma różnicy czy ta zwora jest czy nie.
– No i podłączając Arduino z modułem RS3232 (jak RX łączysz z TX) to stosuj kabel na „wprost”, bo żyły masz już odwrócone.
Kolejna kwestia to linia komend. Przeprowadziłem wiele prób, więc wy już nie musicie, najlepszy sposób na obudzenie EPSONA:
Serial1.begin(9600); // i najlepiej niech będzie przed każdą komendą bo obudzi Serial od zera.
Serial1.println(„\r\n”);
delay(10);
Serial1.println(„PWR ON\r\n”);
Usypiamy go w następujący sposób:
Serial1.begin(9600);
Serial1.println(“PWR OFF\r\n”);
Jeżeli chodzi o NECa to najlepszy kod uruchamiający:
Serial1.begin(9600);
Serial1.write(02);
Serial1.write(00);
Serial1.write(00);
Serial1.write(00);
Serial1.write(00);
Serial1.write(02);
Tak samo działa też :
Serial1.begin(9600);
byte message[] = {0x02, 0x00, 0x00, 0x00, 0x00, 0x02};
Serial1.write(message, sizeof(message));
Wyłączanie:
Serial1.begin(9600);
Serial1.write(02);
Serial1.write(01);
Serial1.write(00);
Serial1.write(00);
Serial1.write(00);
Serial1.write(03);
To sprawdzone i działa, jeżeli chodzi o dodatkowe komendy to polecam lekturę producentów projektorów, w każdym bądź razie podsumowując:
– Serial.begin(9600); potrzebny przy każdej komendzie bo projektory usypiają port rs232 i wywołanie od nowa komunikacji pobudza je do działania ( bez tego raz działa raz nie).
– w przypadku Epsona „\r\n” czyści linię i stąd i gwarantuje poprawny odczyt danych.
– NEC jest mniej wybredny za wyjątkiem tego sygnału CTS->RTS, którego jeżeli fizycznie nie zapętlimy to nic nam nie pokarze.
Można zadać pytanie a co z komunikatami jakimi odpowiadają projektory ? Odpowiem w następujący sposób, jak ktoś potrzebuje, to niech sobie czyta po Serialu i interpretuje to w kodzie, wg mnie ma to sens, gdy zależy nam na debugowaniu projektora a nie przy jego uruchomieniu czy zgaszeniu, bo widać to w rzeczywistości. W przypadku potrzeby odczytu stanów projektora należy zdefiniować jakiś „bufor” odczytu i zdecydować w jaki sposób będziemy to interpretować zdefiniować znaki końca linii itd.. bez sensu uważam, że w takim przypadku lepiej już zarządzać z menu projektora, lub przy pomocy PC.
Dobry artykuł, pewnie nie raz się przyda :) Brawo ZAWARTEK
Sterownik do obsługi oświetlenia z możliwością wysyłania sygnału to według mnie jeden z ciekawszych projektów wykorzystujących Arduino. Widziałem już ich wiele, z użyciem tej małej malinki można stworzyć naprawdę ciekawe konstrukcje technologiczne.