Mr_cin Napisano Luty 12, 2012 Udostępnij Napisano Luty 12, 2012 Witam wszystkich, jestem nowy na forum. Mój problem wygląda tak: zacząłem pisać skrypt do sterowania dwoma serwami w robocie. Zdefiniowałem stany serwa, tzn ruch do przodu, do tyłu i stop, oraz wykrycie przeszkody przez czujnik. Mam też zaimplementowany pwm programowy (przerobiony kod nie mojego autorstwa). Wszystko działa jak należy do momentu gdy chcę napisać właściwy algorytm poruszania. To jest część kodu, która potrzebuje przyjrzenia się: #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #define serwo_prawe_tyl PORTD|=~0b00100000 #define serwo_prawe_przod PORTD|=~0b01000000 #define serwo_prawe_stop PORTD|=~0b00000000 #define serwo_lewe_tyl PORTB|=~0b01000000 #define serwo_lewe_przod PORTB|=~0b10000000 #define serwo_lewe_stop PORTB|=~0b00000000 #define czujnik_lewy (!(PINC & 0b00100000)) #define czujnik_prawy (!(PINC & 0b00010000)) int main(void) { DDRD=0b11111111; DDRB=0b11111111; DDRC=0b00000000; PORTC=0b11111111; while(1) { serwo_lewe_przod; serwo_prawe_przod; if (czujnik_lewy) { serwo_lewe_przod; serwo_prawe_tyl; _delay_ms(50); serwo_lewe_stop; serwo_prawe_stop; _delay_ms(50); serwo_lewe_przod; serwo_prawe_przod; } } return 0; } } Ten kod w praktyce zachowuje się tak: lewy czujnik wykrywa przeszkodę, robot obraca się chwilę w miejscu (jak czołg, tak miało być) po czym zatrzymuje się i całkowicie zamiera (tak nie miało być). Długo się z tym męczyłem i dziwiłem się dlaczego kod przestaje się wykonywać po dojściu do instrukcji z zatrzymaniem serw. Robot po wykryciu przeszkody ma obrócić się o jakiś kąt, po czym iść dalej prosto. Z góry dzięki za pomoc i wskazówki! Cytuj Link do komentarza Share on other sites More sharing options...
marek1707 Luty 12, 2012 Udostępnij Luty 12, 2012 Operacje na portach zdefiniowane na początku "dostawiają" mnóstwo jedynek na port D. Przykładowo, dla sytuacji gdy PORTD = 0b00000000 wykonanie operacji zdefiniowanej tym: #define serwo_prawe_tyl PORTD|=~0b00100000 spowoduje, że w wyniku dostaniesz PORTD = 0b11011111 - i to (być może) jest OK, jeśli zero jest dla Twoich układów sterujących stanem aktywnym (tylko dlaczego nie inicjujesz zawartości rejestrów PORTD i PORTB na 0xFF). Ale już wykonanie następnego: #define serwo_prawe_przod PORTD|=~0b01000000 ustawi wszystkie bity portu D w stan 1, ponieważ: 0b11011111 | 0b10111111 daje w wyniku 0b11111111 😐 Mając wyzerowany jakiś bit na porcie nie jesteś w stanie w jednej operacji (pomijając przypadki szczególne) ustawić go w stan 1 i wyzerować inny bit. W najprostszym przypadku, gdy nie masz nic innego podłączonego do portu, po prostu używaj operacji postawienia, np: #define serwo_prawe_stop PORTD=~0b00000000 czyli '=' zamiast operatora '|='. 1 Cytuj Link do komentarza Share on other sites More sharing options...
pawel Luty 13, 2012 Udostępnij Luty 13, 2012 Trochę dziwne jest to sterowanie serwem, już tak próbowałem i nigdy mi się to nie udawało. PWM w atmega8 jest sprzętowy, więc robienie programowo mija się z celem. Kilka miesięcy temu pisałem artykuł na mojej stronie www o sterowaniu serwami, może okazać się pomocny. http://www.robotyka.net.pl/sterowanie-serwomechanizmem/ Odradzam trochę stosowanie tego binarnego zapisu, jak by to zapisać w szesnastkowym to łatwiej się czyta i mniejsza szansa na pomyłki 🙂 1 Cytuj Link do komentarza Share on other sites More sharing options...
marek1707 Luty 13, 2012 Udostępnij Luty 13, 2012 Mr-cin, a Ty naprawdę sterujesz serwami - takimi co to potrzebują sygnału PPM 🤯 ?Czy tylko tak nazywasz swoje napędy zrobione z silniczków i jakichś mostków? - ja tak to sobie założyłem, bo dwa sygnały na jeden napęd raczej wskazuje na dwukierunkowe sterowanie zwykłym silnikiem. Takie statyczne sygnały na portach to serwa raczej nie poruszą chyba, że jakoś je poprzerabiałeś. Ale wtedy to już serwem nie można tego nazywać. Cytuj Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
Mr_cin Luty 13, 2012 Autor tematu Udostępnij Luty 13, 2012 Trochę dziwne jest to sterowanie serwem, już tak próbowałem i nigdy mi się to nie udawało. PWM w atmega8 jest sprzętowy, więc robienie programowo mija się z celem. Odradzam trochę stosowanie tego binarnego zapisu, jak by to zapisać w szesnastkowym to łatwiej się czyta i mniejsza szansa na pomyłki PWM uzyskałem z pomocą kodu z forum, który ktoś udostępnił, a użyłem go bo akurat tak mi pasowało, dla mnie sprzętowy czy programowy są bez różnicy, oba działają tak samo i nie wymagają żadnych zewnętrznych oscylatorów itd. A binarny zapis pokazuje mi stan wyjść/wejść jakby bezpośrednio, jakbym diody zapalone widział 🙂. Mr-cin, a Ty naprawdę sterujesz serwami - takimi co to potrzebują sygnału PPM ?Czy tylko tak nazywasz swoje napędy zrobione z silniczków i jakichś mostków? - ja tak to sobie założyłem, bo dwa sygnały na jeden napęd raczej wskazuje na dwukierunkowe sterowanie zwykłym silnikiem. Takie statyczne sygnały na portach to serwa raczej nie poruszą chyba, że jakoś je poprzerabiałeś. Ale wtedy to już serwem nie można tego nazywać. Napisałem w pierwszym poście, że tylko z tą częścią kodu jest coś nie tak, z tą którą pokazałem. Do sterowania serwami używam mostka l293d i wejść input i enable (pwm), ale nie w tym problem. Postaram się jak najszybciej sprawdzić czy problem tkwi w tych maskach bitowych, jeśli nie to będziemy dochodzić dalej, jeśli będziecie chcieli oczywiście 🙂. A póki co czekam na inne propozycje 🙂. Cytuj Link do komentarza Share on other sites More sharing options...
marek1707 Luty 14, 2012 Udostępnij Luty 14, 2012 Propozycje czego? 🤯 Przecież wskazanie przyczyny kaszanki na portach dostałeś na talerzu. Poza tym zdaje się mówimy innym językiem. Serwo to układ sterowania ustawiający pewną wielkość na zadaną wartość. Wielkość tę dostaje z zewnątrz, posiada wewnętrzną pętlę sprzeżęnia zwrotnego i w sposób ciągły próbuje zminimalizować błąd nastawy. W naszych warunkach serwo sterowane jest zwykle sygnałem PPM (nie PWM i nie statycznymi sygnałami LEWO-STOP-PRAWO) niosącym "analogową" informację o żądanym położeniu orczyka a pętla sprzężenia zwrotnego zamyka sie przez potencjometr - czujnik położenia. To JEST serwo. Ty - jak zrozumiałem - masz dwa sygnały statyczne do każdego silnika mówiące o kierunku ruchu i gdzieś, czego nie pokazałeś, generację PWM odpowiedzialną za szybkość. Jeżeli nie masz gdzieś sprzężenia zwrotnego od położenia wału silnika (znów czegoś nie pokazałeś?), to to NIE jest serwonapęd. Może tak to u Ciebie wygląda, ma plastikową obudowę i kiedyś serwem modelarskim było ale teraz, po przeróbkach NIE jest. Mostek służy u Ciebie do sterowania silnikami, nie "serwami". Jeśli oczekujesz porad, czytaj odpowiedzi i staraj się je zrozumieć. Nikt nie ma czasu pisać tego samego po wielokroć. Skoro Paweł napisał: "Trochę dziwne jest to sterowanie serwem, już tak próbowałem i nigdy mi się to nie udawało" to zastanów się co to znaczy. Bo za chwilę dostajesz pytanie: "Mr-cin, a Ty naprawdę sterujesz serwami - takimi co to potrzebują sygnału PPM ? Czy tylko tak nazywasz swoje napędy zrobione z silniczków i jakichś mostków?" i nie raczysz na nie odpowiedzieć. Wniosek: Albo nie rozumiesz tego co czytasz (kiepsko) albo nie rozumiesz tego co robisz (jeszcze gorzej). To jak jest? Cytuj Link do komentarza Share on other sites More sharing options...
Mr_cin Luty 15, 2012 Autor tematu Udostępnij Luty 15, 2012 Faktycznie, zapomniałem dodać, że to przerobione serwa, więc nie są to już serwa tylko silniki z przekładnią. Dopiero teraz przeczytałem jeszcze raz Wasze posty i dopiero teraz rozumiem o co Wam chodziło 🙂. Ale to z pośpiechu, i braku czasu. Przepraszam za zamieszanie i dziękuję za pomoc. Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
Dołącz do dyskusji, napisz odpowiedź!
Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!