Popularny post Miglandz Napisano Październik 9, 2019 Popularny post Udostępnij Napisano Październik 9, 2019 Jako że wpadł do mnie na warsztat NVR z wyjściem RS485 oraz kilka kamer analogowych postanowiłem na testy zbudować sobie kamerkę z PTZ, no może bez Z. Na początek wyjaśnię co to jest PTZ skrót rozwijamy jako Pan Tilt Zoom, system wykorzystywany w kamerach do obracania kamerą oraz jeśli kamera posiada taką funkcjonalność regulacji ogniskowej. Głodnych wiedzy odsyłam do https://en.wikipedia.org/wiki/Pan–tilt–zoom_camera Zaczęło się od tego że znalazłem na stronie thingverse parę projektów: https://www.thingiverse.com/thing:107957 https://www.thingiverse.com/thing:2467743 Wydrukowałem jeden z nich i po szybkim złożeniu konstrukcji podłączeniu pod arduino nano, oraz napisaniu testowego programu wyszło coś takiego: Serwa które użyłem to Serwo TowerPro SG-90. Aby ruszyć dalej trzeba było zapoznać się z protokołem który wykorzystywany jest w komunikacji rejestrator -> kamera, padło na protokół Pelco-D. Znalazłem manual z 1999 roku dotyczący tego protokołu i całość prac programistycznych poszła dosyć sprawnie. pelco-d.pdf Szybkie podłączenie modułu rs485 do Arduino Nano i mojego nvr’a, krótki program i zaczynamy debug komunikacji. Przykład danych które odbieram poniżej: 255 4 0 4 39 0 47 SUM: 47 255 4 0 4 39 0 47 SUM: 47 255 4 0 4 39 0 47 SUM: 47 255 4 0 2 39 0 45 SUM: 45 255 4 0 2 39 0 45 SUM: 45 255 4 0 2 39 0 45 SUM: 45 Pierwszy bajt to synchronizacja, drugi to adres kamery, trzeci i czwarty to bajty w których przekazywane są polecenia, nas najbardziej interesuje bajt czwarty, gdzie 4 to obrót w lewo a 2 to obrót w prawo, dodatkowo w bajcie piątym i szóstym przekazywane są informacje o prędkości, a bajt siódmy to suma kontrolna. Teraz wystarczyło połączyć 2 programy w jeden i można kamerkę powiesić w warsztacie no i nie do końca. Od tego momentu natrafiłem na pewną trudność. Okazało się że biblioteka Servo.h oraz SoftwareSerial.h korzystają z tego samego timera, co objawiało szarpaniem serwami przy jakiejkolwiek komunikacji po rs485. ehh…. Znalazłem inną bibliotekę ServoTimer2.h która według wielu źródeł powinna usunąć opisywaną trudność, więc po przerobieniu programu tak aby korzystał z nowej biblioteki, nic nie uległo zmianie Więc postanowiłem obejść problem programowo. //Look for incoming data from Pelco-D controller if (RS485Serial.available() > 0) { servo1.detach(); servo2.detach(); Wyłączając serwa na czas odczytu danych po rs485. Od tej pory wszystko zaczęło działać płynnie. Tak jak na poniższym filmie. Dodatkowo dorobiłem kontaktron na drzwi do warsztatu, tak aby kamera przy otwarciu drzwi ustawiała się na wchodzącego, a po zadanym czasie z powrotem kierowała się na okno. Program przewiduje obroty kamerą w wszystkie strony z uwzględnieniem prędkości wysyłanej z NVR’a, scan kamerą po pomieszczeniu, oraz presety. switch (data) { case 0x00 : break; case 0x02 : pulseWidth1 = pulseWidth1 + turnRate1; break; // right case 0x04 : pulseWidth1 = pulseWidth1 - turnRate1; break; // left case 0x10 : pulseWidth2 = pulseWidth2 - turnRate2; break; // down case 0x08 : pulseWidth2 = pulseWidth2 + turnRate2; break; // up case 0x0C : pulseWidth1 = pulseWidth1 - turnRate1; pulseWidth2 = pulseWidth2 + turnRate1; break; // left-up case 0x0A : pulseWidth1 = pulseWidth1 + turnRate1; pulseWidth2 = pulseWidth2 + turnRate1; break; // right-up case 0x14 : pulseWidth1 = pulseWidth1 - turnRate1; pulseWidth2 = pulseWidth2 - turnRate2; break; // left-down case 0x12 : pulseWidth1 = pulseWidth1 + turnRate1; pulseWidth2 = pulseWidth2 - turnRate2; break; // right-down case 0x1B : scan = 1; break;// scan on case 0x1D : scan = 0; break;// scan off case 0x07 : // presets if (byteReceived[5] == 1) // drukarka { pulseWidth1 = 90; pulseWidth2 = 140; } else if (byteReceived[5] == 2) // tv { pulseWidth1 = 35; pulseWidth2 = 140; } else if (byteReceived[5] == 3) // drzwi { pulseWidth1 = drzwiS1; pulseWidth2 = drzwiS2; } else if (byteReceived[5] == 4) // okno { pulseWidth1 = oknoS1; pulseWidth2 = oknoS2; } break; } W planach mam funkcjonalność ustawiania presetów z rejestartora, lecz nie było mi to potrzebne w tej chwili, a dostęp do ardiuno mam na wyciągnięcie ręki, więc zawsze mogę go przeprogramować. Zastanawiała mnie również żywotność serwomechanizmów, jak narazie cała konstrukcja wisi już ponad pół roku, do warsztatu wchodzę przynajmniej 5 razy dziennie, w soboty i niedziele licznik wejść myślę że dobija do jakiś 20 i jak dotychczas nic złego im się nie dzieje. Poniżej udostępniam również kod do arduino gdyby ktoś chciał się również pobawić. Lista użytych elementów: Arduino nano Nano Expansion Adapter Serwomechanizmy moduł RS485 Kod źródłowy: PTZ_rs485.zip 5
Treker (Damian Szymański) Październik 11, 2019 Udostępnij Październik 11, 2019 Właśnie zaakceptowałem Twój opis, możesz go teraz zgłosić do akcji rabatowej umieszczając link w temacie zbiorczym. Dziękuję za przedstawienie ciekawego projektu, zachęcam do prezentowania kolejnych DIY oraz aktywności na naszym forum
Gal_kris Grudzień 15, 2021 Udostępnij Grudzień 15, 2021 Hej Kolego, fajna robota, ja zrobiłem troszkę inny projekt z wykorzystaniem PTZ i Bluetooth a było to sterowanie zdalne laserem do zabawy z kotami. skończyło się na tym że miałem drgania serw w trakcie bezczynności nie udało mi się tego opanować, pobrałem sobie twój program spróbuję raz jeszcze do tego usiąść bo zmęczone koty są spokojniejsze. Krystian
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »