Popularny post nes86 Napisano Listopad 23, 2010 Popularny post Udostępnij Napisano Listopad 23, 2010 Przedstawiam projekt pilotów służących do startowania wszelkiego rodzaju robotów. Mam tu na myśli roboty sumo (kategorie od nano do standard) a także do line followerów. Pilot oprócz przycisku do startowania robota ma również drugi przycisk, który może służyć do wybrania np. strategii walki np.: frontalna szarża czy próba zajechania przeciwnika od boku. Może zastanawiacie się w ogóle po co pilot do robota? Powodem dla którego zbudowałem pilota jest taki, że podczas z zawodów z nerwów bardzo trzęsą mi się ręce, a prawie wszystkie moje roboty wyposażone są w rozkładane klapki lub kolce a o zahaczenie takiej klapki w trakcie naciskania przycisku naprawdę nie trudno. Przez tak błahy powód jak trącenie klapki palcem niestety zdarzało mi się przegrywać walki. W przypadku nanosumo wciśnięcie mikroswitcha bez poruszenia robota (a tego wymaga regulamin) jest prawie niemożliwe. Cały projekt składa się z pilota wraz z programem oraz układu umieszczonego na płytce robota i fragmentu kodu, który należy umieścić w programie robota, aby obsługiwał sygnały z pilota. Ponieważ istniało zagrożenie, że robot przeciwnika będzie wyposażony w czujniki zbudowane w oparciu o odbiorniki podczerwieni, aby zmniejszyć prawdopodobieństwo zakłócania odbiornika przez przeciwnika zarówno pilot jak i odbiornik pracują na częstotliwości 56kHz (odbiornik TSOP32156). Pilot służy tylko do startowania robota, ponieważ istnieje możliwość łatwego zakłucenie (nadania fałszywego sygnału). Dlatego właśnie zrezygnowałem z możliwości zatrzymania robota za pomocą pilota. Kształt i wielkość pilota został podyktowany wielkością zastosowanego akumulatora. Jak widać na zdjęciu pilot jest niewiele większy od zasilającego go akumulatora. Schemat poniżej przedstawia układ pilota. "Mózgiem" pilota jest mikrokontroler ATtiny13. Wybór takiego a nie innego mikrokontrolera jest wręcz oczywisty: większy (i lepiej wyposażony) po prostu nie był potrzebny. Mikrontroler pracuje z domyślną częstotliwością wewnętrznego oscylatora: 1MHz. Na schemacie oprócz mikrokontrolera znajduje się tylko kilka elementów: włącznik, złącze programatora, dwa mikroswitche, dwie diody led oraz dioda nadawcza podczerwieni wraz ze sterującym nią tranzystorem. Wszystkie elementy oprócz włącznika i złącza programatora montowane są powierzchniowo. Zastosowana dioda nadawcza to dioda LED 1,8mm pracująca na długości fali 940nm.Dioda została umieszczona w wycięciu płytki aby chronić ją przed przypadkowym wygięciem i odłamaniem. Tranzystor sterujący diodą został zastosowany aby umożliwić zwiększenie zasięgu pilota poprzez zastosowanie diody o większej mocy i zwiększenie prądu płynącego przez diodę. Akumulator został na stałe przylutowany do płytki i przytrzymywany jest dwoma drucikami ze srebrzanki. Aby naładować akumulator należy chwycić pilota kablami wyposażonymi w krokodylki w miejscach w których przylutowany jest akumulator (z przodu płytki). Schemat pilota: Program pilota jest bardzo prosty. W tym miejscu muszę zaznaczyć, że program powstawał ok, dwa lata temu dla tego znajdują się w nim instrukcje sbi() oraz cbi(), aktualnie już tych instrukcji nie używam i nikomu nie polecam ich używać. Opis działania programu: 1. Wywoływana jest funkcja setup() w której konfigurowany jest port mikrokontrolera oraz konfigurowane jest przerwanie zewnętrzne INT0 2. Zapalana jest zielona dioda sygnalizująca włączenie pilota 3. W pętli głównej sprawdzane jest czy naciśnięty został przycisk PROGRAM 4. Jeśli naciśnięty został przycisk PROGRAM to wysłane za pomocą diody IR zostają dwie paczki impulsów 56kHz o długości 5ms każda, przerwa między impulsami wynosi również 5ms. Wysłanie impulsów sygnalizowane jest zgaszeniem diody zielonej na chwilę, aby potwierdzić, że przycisk rzeczywiście został wciśnięty. Następnie program powraca do sprawdzania stanu przycisku PROGRAM. 5. Jeśli naciśnięty zostanie przycisk START wywoływana zostaje funkcja obsługi przerwania zewnętrznego INT0. 6. Obsługa przycisku start jest podobna do obsługi przycisku PROGRAM, różnica polega na tym, że zamiast dwóch paczek impulsów wysyłane są trzy paczki. Po zakończeniu nadawania na chwilę zapalana jest czerwona dioda, aby zasygnalizować naciśnięcie przycisku. //biblioteki #include <avr\io.h> #include <avr\interrupt.h> #include <util\delay.h> //makrpolecenia #define sbi(port, bit) (port)|=(1<<bit) #define cbi(port, bit) (port)&=~(1<<bit) #define IR 0 #define RED 4 #define GREEN 3 #define START 1 #define PROGRAM 2 void setup(void){ //ustawienia wejść wyjść i pull-up DDRB = 0B00011001; PORTB = 0B00011110; //ustawienie przerwania dla przycisku START sbi(MCUCR,ISC01); //przerwanie INT0 wyzwalane zboczem opadającym sbi(GIMSK,INT0); //INT0 Enable sei(); //globalne włączenie przerwań } SIGNAL (SIG_INTERRUPT0) //obsługa przycisku START { //wysyła 3 impulsy co 10,142ms cbi(PORTB,RED); for(int i = 0;i<288;i++){ //wyślij paczkę impulsów 56kHz cbi(PORTB,IR); asm("nop");asm("nop");asm("nop"); asm("nop");asm("nop");asm("nop");asm("nop"); sbi(PORTB,IR); asm("nop"); } _delay_ms(5); //odczekaj 10ms for(int i = 0;i<288;i++){ //wyślij paczkę impulsów 56kHz cbi(PORTB,IR); asm("nop");asm("nop");asm("nop"); asm("nop");asm("nop");asm("nop");asm("nop"); sbi(PORTB,IR); asm("nop"); } _delay_ms(5); for(int i = 0;i<288;i++){ //wyślij paczkę impulsów 56kHz cbi(PORTB,IR); asm("nop");asm("nop");asm("nop"); asm("nop");asm("nop");asm("nop");asm("nop"); sbi(PORTB,IR); asm("nop"); } _delay_ms(500); sbi(PORTB,RED); _delay_ms(500); } int main(void){ setup(); cbi(PORTB,GREEN); //Zapal zieloną diodę while(1){ if(bit_is_clear(PINB,PROGRAM)){ //jeśli wciśnięty przycisk to //wyślij komędę zmiany programu for(int i = 0;i<288;i++){ //wyślij paczkę impulsów 56kHz cbi(PORTB,IR); asm("nop");asm("nop");asm("nop"); asm("nop");asm("nop");asm("nop");asm("nop"); sbi(PORTB,IR); asm("nop"); } _delay_ms(5); //odczekaj 10ms for(int i = 0;i<288;i++){ //wyślij paczkę impulsów 56kHz cbi(PORTB,IR); asm("nop");asm("nop");asm("nop"); asm("nop");asm("nop");asm("nop");asm("nop"); sbi(PORTB,IR); asm("nop"); } _delay_ms(200); //ochrona przed przytrzymaniem przycisku sbi(PORTB,GREEN); _delay_ms(300); cbi(PORTB,GREEN); } } } Do odbierania sygnałów z pilota można zastosować scalony odbiornik podczerwieni TSOP32156 lub TSOP4856. Układ TSOP32156 ma nad drugim układem tą przewagę, że może być zasilany również napięciem 3,3V. Schemat podłączenia przedstawiony jest poniżej. Do obsługi odbiornika, nie jest używane przerwanie zewnętrzne ani żaden timer (bo spotkałem się z takimi rozwiązaniami), a więc może on zostać dołączony do dowolnego portu we/wyj. Według noty katalogowej odbiornik powinien być zasilany przez filtr RC o wartościach R = 100om oraz C = 4,7uF. Wartość kondensatora może być większa, ja często stosuję kondensator ceramiczny 22uF lub tantalowy 100uF. Schemat podłączenia odbiornika: Poniżej zostały przedstawione fragmenty programu które należy umieścić we własnym programie oby pilot był obsługiwany. W przykładzie oprócz odbiornika podczerwieni obsługiwane będą dwa mikroswitche w taki sposób że dwa przyciski na pilocie będą miały identyczną funkcję jak przyciski na robocie. Na samym początku aby program był bardziej czytelny definiujemy inne nazwy dla pinów do których podłączone zastały przyciski i odbiornik. W przykładzie przyciski zostały podłączone do piątego wyprowadzenia portu B oraz do czwartego wyprowadzenia portu D, natomiast odbiornik został podłączony do pinu trzeciego portu C. Mogą to być dowolne inny wyprowadzenia portów I/O: #define pin_sw1 PINB #define sw1 PB5 #define pin_sw2 PIND #define sw2 PD4 #define pin_tsop PINC #define tsop PC3 Następnie konfigurujemy porty. Wklejamy na początku programu taki kod: //konfiguracja portów //domyślnie wszystkie porty ustawione są jako wejściowe //wystarczy tylko włączyć podciąganie na pinach przycisków i odbiornika PORTB |= (1<<sw1); PORTD |= (1<<sw2); PORTC |= (1<<tsop); Nie wiem jak to robią inni ale ja po ustawieniu portów i peryferiów mikrokontrolera przechodzę do pętli w której sprawdzam stan przycisków. W tym przypadku pętla dodatkowo wzbogacona jest o instrukcje sprawdzającą stan pinu do którego podłączony jest tsop. Pierwszy przycisk inkrementuje zmienną plan, którą można później użyć np. do wyboru taktyki walki lub do czegoś innego, co sobie wymyślimy. Drugi przycisk powoduje, że przechodzimy do funkcji odliczającej 5 sekund i rozpoczynamy walkę. Analizując kod funkcji obsługi pilota zauważymy te same instrukcje co przy obsłudze przycisków. while(1){ //pętla wywoływana przed walką if(bit_is_clear(pin_sw1,sw1)){ while(bit_is_clear(pin_sw1,sw1))_delay_ms(10); //ochrona przed drganiami styków plan = (plan+1)%9; //dodanie 1 do zmiennej plan diody(zgas); // diody(plan); //zapalenie innej diody na znak, że plan się zmienił } if(bit_is_clear(pin_sw2,sw2)){ odlicz(); //odliczenie 5 sekund i rozpoczęcie walki } if(bit_is_clear(pin_tsop,tsop))obsluga_pilota(); //obsługa pilota }//end while Funkcja obsługi odbiornika podczerwieni: void obsluga_pilota(void){ _delay_ms(2); if(bit_is_clear(pin_tsop,tsop)){ //sprawdzanie czy jest stan wysoki _delay_ms(5); _delay_us(142); if(bit_is_set(pin_tsop,tsop)){ //sprawdzanie czy jest stan wysoki _delay_ms(5); if(bit_is_clear(pin_tsop,tsop)){ //sprawdzanie czy jest stan wysoki _delay_ms(9); plan = (plan+1)%9; //dodanie 1 do zmiennej plan diody(zgas); // diody(plan); //zapalenie innej diody na znak, że plan się zmienił if(bit_is_clear(pin_tsop,tsop)){ //sprawdzanie czy jest stan wysoki odlicz(); //odliczenie 5 sekund i rozpoczęcie walki } } } } } To by było na tyle, mam nadzieje, że wszystko jasno i prosto wytłumaczyłem i opisałem. Tutaj możecie zobaczyć przykładową walkę w której używałem pilota. Oczywiście pilot ma dużo większy zasięg (kilka metrów) ale dla pewności przykładałem go tak blisko 🙂 Kilka słów na koniec. Pilot ma nieosłonięte elektrody akumulatora, co jest bardzo niebezpieczne. Ja go używam z TIMONkiem ale my o tym wiemy i musimy na to uważać. Można te elektrony zakleić np. izolacją i odklejać tylko na czas ładowania. Pisząc program do pilota przycisk START obsługuję w przerwaniu. W założeniu miało to spowodować, że paczka impulsów zostanie nadana bez opóźnienia wynikającego z obsługi pętli głównej programu. Teraz wiem ,że to opóźnienie jest znikome i oba przyciski mogły by być obsługiwane w pętli głównej. Z drugiej strony obsługa w przerwaniu daje tą zaletę, że gdym przez przypadek nacisnął dwa przyciski to zawsze obsłużony zostanie najpierw przycisk START. No i piszcie czego brakuje, czasami niektóre rzeczy wydają się oczywiste a innym nie więc mogłem coś pominąć. Na wytykanie błędów i krytykę też czekam 🙂 _proj Pilocik_prog.rar Pilocik.rar 7 Cytuj Link do komentarza Share on other sites More sharing options...
grabo Listopad 24, 2010 Udostępnij Listopad 24, 2010 Świetny projekt, w dodatku bardzo dobrze opisany! 🙂 Miejmy nadzieję, że rozjaśni początkującym co nieco zagadnienia z dziedziny zdalnego sterowania podczerwienią i znikną powtarzające się pytania tego dotyczące. Czego brakuje? Przede wszystkim obudowy, chociażby takiej jak przy pilotach od alarmów samochodowych. Można by się również pokusić o wprowadzenie jakiegoś bardziej zaawansowanego standardu transmisji danych. Pozdrawiam Cytuj Link do komentarza Share on other sites More sharing options...
matrix Listopad 24, 2010 Udostępnij Listopad 24, 2010 Ogólnie rzeczywiście świetnie napisany artykuł. Czego brakuje? Soft napisany jest w C, a co z tymi co piszą w bascom? Wiem, można wstawiać wstawki asm i inne, ale ja pisząc w bascom wolałbym wiedzieć dokładnie co robi pilot. Oczywiście mi nie potrzebne to bo jak będę chciał to sobie napiszę pilota, ale pytałeś czego brak? Początkujący piszący w bascom'ie nie dadzą rady napisać a już nie mówię o wstawieniu Twojego kawałka softu do własnego programu. Cytuj Link do komentarza Share on other sites More sharing options...
OldSkull Listopad 24, 2010 Udostępnij Listopad 24, 2010 @matrix: czepiasz się, program jest, osoba chcąca wykonać taki pilot może: - wrzucić gotowy kod - napisać własny kod, co zajmie mało czasu Projekt prosty, przydatny, uniwersalny. Czego chcieć więcej 🙂 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
TIMONek Listopad 24, 2010 Udostępnij Listopad 24, 2010 Soft napisany jest w C, a co z tymi co piszą w bascom? Wiem, można wstawiać wstawki asm i inne, ale ja pisząc w bascom wolałbym wiedzieć dokładnie co robi pilot. Ktoś traci parę godzin, żeby przedstawić swój projekt, przedstawia napisany przez siebie kod w C, bo takiego języka używa do programowania mikrokontrolerów. A Ty piszesz "a co z tymi co piszą w bascomie". To jest raptem kilka linijek kodu w dodatku okraszone mnóstwem komentarzy. Oczekujesz od nes'a, że napisze za Ciebie, czy za innych userów kod w bascomie? Nie przesadzajmy 😉 Ja nie mam bladego pojęcia o pisaniu programów w tym języku, ale jak wytężę swój intelekt to potrafię przerobić kod na C. Zakładam, że w drugą stronę też da się coś takiego zrobić 😉 Można by się również pokusić o wprowadzenie jakiegoś bardziej zaawansowanego standardu transmisji danych. Pytanie po co? 🙂 Skoro piloty wiele razy udowodniły (mimo swej prostoty), że są niezawodne (pomijam błędy w kodzie, które wystąpiły na CybAiRBot 2010) Ja dodam od siebie, że ewentualnie można by zmienić: SIGNAL (SIG_INTERRUPT0) na: ISR(INT0_vect) Zgodnie z tym co jest zalecane przez autorów avr-libc. Cytując: Do not use SIGNAL() in new code. Use ISR() instead. ale to szczegół jest 😉 I jeszcze ewentualnie mógłbyś wyrzucić z funkcji obsługi odbiornika te trzy linijki: plan = (plan+1)%9; //dodanie 1 do zmiennej plan diody(zgas); // diody(plan); //zapalenie innej diody na znak, że plan się zmienił ponieważ osoba niedoświadczona, która będzie wrzucała gotowy kod, może mały problem 😉 Cytuj Link do komentarza Share on other sites More sharing options...
nes86 Listopad 24, 2010 Autor tematu Udostępnij Listopad 24, 2010 Ja dodam od siebie, że ewentualnie można by zmienić: Kod:SIGNAL (SIG_INTERRUPT0) na: Kod: ISR(INT0_vect) Zgodnie z tym co jest zalecane przez autorów avr-libc. Cytując:Kod: Do not use SIGNAL() in new code. Use ISR() instead. ale to szczegół jest Jest to kolejny "archaizm" obok cbi() i sbi (), który pojawia się w programie. I jeszcze ewentualnie mógłbyś wyrzucić z funkcji obsługi odbiornika te trzy linijki: Kod:plan = (plan+1)%9; //dodanie 1 do zmiennej plan diody(zgas); // diody(plan); //zapalenie innej diody na znak, że plan się zmienił ponieważ osoba niedoświadczona, która będzie wrzucała gotowy kod, może mały problem Masz racje zapomniałem o deklaracji zmiennej plan i funkcji diody(). Można te trzy linijki usunąć lub wpisać w ich miejsce własną procedurę obsługi przycisku. Czego brakuje? Przede wszystkim obudowy, chociażby takiej jak przy pilotach od alarmów samochodowych. Można by się również pokusić o wprowadzenie jakiegoś bardziej zaawansowanego standardu transmisji danych. Pilot z założenia miał być bez obudowy i zaprojektowany jest tak, żeby używać go bez obudowy. Teraz do obudowy go nie włożę bo do żadnej nie będzie pasować. Czego brakuje? Soft napisany jest w C, a co z tymi co piszą w bascom? Nawet nie znając C można bardzo prosto samemu napisać obsługę w bascomie. Sygnał wychodzący z odbiornika to po prostu przebieg prostokątny o okresie 10ms i wypełnieniu 50%. Dwa impulsy dla przycisku PROGRAM i trzy impulsy dla przycisku START Cytuj Link do komentarza Share on other sites More sharing options...
OldSkull Listopad 24, 2010 Udostępnij Listopad 24, 2010 Nie myślałeś o zasilaniu z baterii litowej 3V? Układ pobiera raczej mało prądu przez bardzo krótki czas i na dobrą sprawę mógłby sie uruchamiać tylko po to by wysłać sygnał. Taka bateria starczyłaby na setki uruchomień, a zwiększyłoby się bezpieczeństwo. Cytuj Link do komentarza Share on other sites More sharing options...
nes86 Listopad 24, 2010 Autor tematu Udostępnij Listopad 24, 2010 Nie myślałeś o zasilaniu z baterii litowej 3V? Nie. Wolę mieć możliwość naładowania akumulatora, niż cały czas martwić się o to czy bateria się jeszcze nie rozładowała. Cytuj Link do komentarza Share on other sites More sharing options...
KD93 Listopad 24, 2010 Udostępnij Listopad 24, 2010 Piloty są rzeczywiście bardzo fajne i przydatne, fajnie z Waszej strony że je opublikowaliście. Mam jeszcze jedno pytanko może nie do końca w temacie, ale mnie nurtuje. To że Rico nie wystartował na jednej walce finałowej na RA, czym to było spowodowane? Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Listopad 24, 2010 Udostępnij Listopad 24, 2010 nes86, TIMONek cieszę się, że za moimi namowami w końcu pojawił się ten opis 😉 Mam nadzieję, że teraz inni pójdą tym tropem i zaczną publikować swoje projekty, bo właśnie o to chodzi w tym dziale 😉 Cytuj Link do komentarza Share on other sites More sharing options...
TIMONek Listopad 24, 2010 Udostępnij Listopad 24, 2010 To jest projekt w 100% wykonany przez nes'a 😉 więc ewentualne podziękowania proszę kierować nie do mnie 😉 To że Rico nie wystartował na jednej walce finałowej na RA, czym to było spowodowane? Najprawdopodobniej zawiesił się wtedy procesor - dziwna sprawa. Pamiętam, że pojawił się jakiś dziwny znak na wyświetlaczu... mam nadzieje, że w przyszłości się to nie powtórzy. Cytuj Link do komentarza Share on other sites More sharing options...
matrix Listopad 24, 2010 Udostępnij Listopad 24, 2010 Panowie (i może Panie), kolega pytał czego brakuje, więc napisałem w imieniu zupełnie zielonych. Mi nie potrzebne to bo jak napisałem w pierwszym swoim poście, sam sobie mogę napisać. Jeśli kolega nie chciał się dowiadywać czego brak to wystarczyło nie zadawać pytania. Chodzi o to że później znowu pojawią się pytania początkujących: a co to? a jak to wgrać? a bascomie nie ma bo ja w bascomie piszę. Cytuj Link do komentarza Share on other sites More sharing options...
nes86 Listopad 24, 2010 Autor tematu Udostępnij Listopad 24, 2010 matrix, nie myl tylko odpowiedzi TIMONka z moimi. Ja oczywiście cieszę się, że projekt się podoba i czekam na dalsze opinie. Cytuj Link do komentarza Share on other sites More sharing options...
matrix Listopad 24, 2010 Udostępnij Listopad 24, 2010 matrix, nie myl tylko odpowiedzi TIMONka z moimi Gdzieś musiałem czegoś nie dopisać i dlatego tak zostało to przez Ciebie szanowny kolego zinterpretowane. Ale to chyba Twoje słowa? No i piszcie czego brakuje Cytuj Link do komentarza Share on other sites More sharing options...
KD93 Listopad 24, 2010 Udostępnij Listopad 24, 2010 matrix, ale są gotowe hexy, jak ktoś nie potrafi C to wystarczy żeby sobie hexa wgrał. 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!