Popularny post OldSkull Napisano Listopad 24, 2010 Popularny post Udostępnij Napisano Listopad 24, 2010 Witam, chciałbym zaprezentować mojego robota minisumo: Skynet. Robot powstał już 2 lata temu, był od tego czasu nieco ulepszony, ale może po kolei. 1. Konstrukcja Jest to typowa "kostka" na serwach MG995 dających potężny moment (jak na minisumo), przerobionych poprzez wyciągnięcie elektroniki, blokady i potencjometru. Koła to nakrętki 90mm oklejone uszczelką do okien (na drewnianych ringach spisywała się znakomicie, na plastikowych niestety już średnio). Początkowo do podpierania służyły dwie diody LED, po których robot się ślizgał, niestety był to kiepski pomysł, gdyż po upadku ze stołu na zawodach diody się połamały i robot się pochylił. W kolejnym roku jako podpórka służyło już kółko z magnetofonu widoczne na jednym ze zdjęć. Projekt był robiony w programie Inventor, jednakże na żywo okazało się, że trzeba wprowadzić pewne modyfikacje: Początkowo robot posiadał jeden czujnik analogowy Sharpa, w obecnej konstrukcji posiada 2 czujniki cyfrowe Sharpa oraz czujniki na bazie TSOP1736. Całą konstrukcja jest wykonana z laminatu miedzianego i polutowana = robot jest bardzo wytrzymały mechanicznie - przeżył już wiele upadków. Niestety w połączeniu z gęstwiną kabli robot jest przez to po prostu brzydki Ze względu na duzy moment, przy maksymalnej prędkości robot ma dużą bezwładność korpusu i może się przechylać do tyłu (pomimo klapek z przodi), dlatego tył ma tak ukształtowwany, aby sie podparł. W takim wypadku zamiast się przewrócić, zaprze się (przynajmniej w teorii). W praktyce działa to tylko na roboty, które nie pozwalają się przewrócić klakami, ale zostały nimi zaczepione - efektem jest remis. Najbardziej oryginalna część jaką są klapki znakomicie działają na roboty z płaskim, niesbyt ostrym przodem - czyli przede wszystkim inne kostki, ale na niskie roboty z płaskim przodem też działa świetnie - przykłądowo sparingi z ubiegłorocznym zwycięzca wygrywał, bo ten miał płaski przód, a jego klinoklapka była trzymana z dala od Skyneta dzięki moim "klapko-przewracaczom". Takie papier-kamień-nożyczki, w którym ten robot mozę pokonać dobrego robota a zostać zmasakrowanym przez przeciętnego Robot w obecnym kształcie waży 499g. 2. Zasilanie Robot początkowo był zasilany z 4 ogniw z telefonó komórkowych poąłczonych 2x2 - czyli maksymalnie 8.4V przy pełnym naładowaniu. Potem zrezysnowałem z tego pomysłu, gdyż w momencie keidy siadało napięcie, odczyt z analogowego Sharpa był zakłamywany (AVcc = Vcc), poza tym bałem sie resetowania. Obecnie jest zasilany z 3 ogniw (czyli 12V), elektronika ma zsilanie stabilizowane na LM7805 - przy 12V na wejściu trochę sie nagrzewa, dlatego ma naklejony radiatorek. Całe zawody mógłby jeżdzić bez ładowania 3. Elektronika Mózgiem elektroniki jest mikrokontroler ATmega8 taktowany z częstotliwością 8MHz. Mostek H został wykonany na pojedynczym przekaźniku + mosfecie, z zabezpieczeniem w postaci diody schottkyego. Wszystkie nóżki zostały wyprowadzone. Na pokładzie jest równeiz obsługa czujników linii, które niestety okazały się potwornie zawodne (były powodem totalnej klapy rok temu), dlatego postanowiłem je zupełnie zignorować i tak zmodyfikowałem program, aby nie były potrzebne. Na schematach nie ma wszystkiego - kolejen elementy dokładałem wykorzystując wyprowadzone piny, a nawet złącze od programowania. W ten sposób dołożyłem 3 diody informacyjne, oraz czujnik na bazie TSOP1736. Kabelkó też trochę doszlo 4. Czujniki Jak już podałem, początkowo robot posiadał: - jeden Sharp analogowy na 70cm - pożyczony, więc musiałem oddać - 2x CNY70 - awaryjne, więc odłączyłem ich wtyczki od elektroniki - 2x krańcówki z tyłu wykrywajace atak od tyłu - nieprzydatne, bo przy ataku od tyłu i tak było już po ptakach, więc je usunąłem Obecnie: - 2 czujniki cyfrowe Sharp na 40cm - działa ładnie, ale tylko do przodu - jeden TSOP1736 + 2 diody nadawcze - działa dobrze, ale ma słaby zasięg, który musiałem ograniczyć aby uzyskać pewność odczytów - jakieś 20cm, na ukosy Robot niestety ne posiada żadnych czujnikó na boki, co jest spowodowane duzymi kołami - i bardzo mnie to boli, ale nie da się na to nic poradzić 5. Algorytm Początkowo kombinowałem, aby wykorzystując jeden czujnik robot miał duży kąt idzenia, dlatego robot jeździł wężykiem omiatając wszystko co ma przed sobą. Działało to nieźle, ale było słabe dynamicznie. Mimo to bylo ok. W momencie, kiedy wyłączyłem czujniki linii robot szaleńczo sie kręci i - kiedy widzi na ukos, obraca się w tamtym kierunku - kiedy widzi z przodu, szarżuje Ot i koniec inteligencji robota 6. Zady i walety: + klapka działa, przerwaca albo chociaż powstrzymuje przeciwników + robot był tani - nawet wliczajac czujniki, zmieściłem się w 170-180zł + robot jest wytrzymały, jestem przekonany, że jak go odpalę za rok dalej będzie działał i jeździł + jest agresywny + budzi zainteresowanie - szczególnie zabawnie wyglądał, keidy szwankowało mu sterowanie i objeżdżał butelkę stojącą na środku ringu (jakiś zawodnik stojący obok rzucił "Eee, Macarena" z Innych cytatów: "Gdzie on ma przód" i "Jest tak brzydki, że tylko jego matka by go pokochała" - kołysze sie podczas jazdy, niestety przy tym momencie jaki mają serwa, łatwo się przechyla do tyłu, to uważam za dużą wadę - nie ma czujników po bokach - jest wysoki Poniżej trochę zdjęć, jak znajde, wrzucę filmiki. Ew. jakiś zrobię na szybko. Jeśli chcecie program też mogę wrzucić, tylko poszukam. Z dwóch profili: Nierozłożony: Rozłożony: Gęstwina kabli: Czujniki: Spód i czujniki linii: Redi tó fajt: Cytując jednego z widzów z zawodów we Wrocławiu: "A gdzie on ma przód?" __________ Komentarz dodany przez: Treker Proszę następnym razem nie dodawać zdjęcia na samym początku. 10
KD93 Listopad 24, 2010 Udostępnij Listopad 24, 2010 Widziałem na żywo, mogę się wypowiedzieć Niestety w połączeniu z gęstwiną kabli robot jest przez to po prostu brzydki Przez grzeczność nie zaprzeczam Nie widziałem podczas samej walki, ale widziałem filmiki, robot rzeczywiście bardzo się chwieje podczas ataku, ale nie wiem czy celowo, ma fajny algorytm zajeżdżania robotów od tyłu (tak, tak, bierze je od tyłu ) Z podobnymi robotami radzi sobie całkiem dobrze. Tylko ja zadałem pytanie: co to jest i do czego to służy? Mnie to 2 giwery przypomina Czy był on kiedyś podobny do tego z projektu z inwentora? - 2x CNY70 - awaryjne, więc odłączyłem ich wtyczki od elektroniki Jak CNY70 uważasz za awaryjne to obczaj sobie TCRT5000 Dzięki za miłe dotrzymywanie towarzystwa na RA Bo bym się przy tym stoliku na śmierć zanudził, dodatkowo Skynet przyczyniał się chyba do ściągania nowych oglądających [ Dodano: 24-11-2010, 16:40 ] Zastanawiam się ile gwiazdek, przekonasz mnie czymś jeszcze że zasługuje na 4? Jakiś filmik?
OldSkull Listopad 24, 2010 Autor tematu Udostępnij Listopad 24, 2010 Filmik z pierwszych testów: tutaj jest jeszcze bardzo podobny, a CNY jeszcze działają Aktualny filmik: jakość niestety słabiutka, robiony przy słabym świetle. Z zawodów nie mam filmów, bo jakoś tak to jest, że jak się startuje to się nei myśli o robieniu filmów własnego robota. Z tym zajeżdżaniem od tyłu było tak, że on się szybko obraca, ale wolno startuje - musiałem mu ograniczyć ze względu na chwianie szybkość podczas szarży (przy obrocie tego problemu nie ma) i roboty, które go nie zauważą i wymijają, on atakuje z boku. Zresztą program to ciekawostka: w pierwszym programie użyłem tylko tyle pamięci RAM ile potrzebowałem do zrobienia opóźnienia, reszta programu nie korzystała z żadnej zmiennej tylko bezpośrednio sprawdzałem zawartości rejestrów i stany nóżek. Potem trochę się zmienił, ale ogólnie jest bardzo prosty - pomimo praktycznie braku komentarzy po roku potrzebowałem 5 minut aby się połapać w kodzie. Aktualny kod poniżej, przy okazji każdy może sobie zobaczyć 2 przydatne rzeczy: - obsługa działającego czujnika na TSOP1736 (jak słuchałem na zawodach to nei takie oczywiste) - działający, dokładny delay na pętli - u mnie wbudowane w gcc funkcje opóźniające zawsze generują błędy przy kompilowaniu #include <avr/io.h> #include <avr/interrupt.h> #include <stdbool.h> #ifndef F_CPU #define F_CPU 8000000UL #endif #define sbi(PORT,PIN) ((PORT)|=1<<(PIN)) #define cbi(PORT,PIN) ((PORT)&=~(1<<(PIN))) #define Pprzod sbi(PORTD, PD4); #define Ptyl cbi(PORTD, PD4); #define Lprzod sbi(PORTD, PD5); #define Ltyl cbi(PORTD, PD5); #define tyl Ptyl; Ltyl; #define przod Pprzod; Lprzod; #define pwmICR 2500 #define pwmstopP OCR1B=0; #define pwmstopL OCR1A=2500; #define pwmmaxP OCR1B=1667; #define pwmmaxL OCR1A=833; #define pwm50P OCR1B=833; #define pwm50L OCR1A=1667; #define pwm75P OCR1B=1250; #define pwm75L OCR1A=1250; #define pwm25P OCR1B=417; #define pwm25L OCR1A=2083; #define pwm33P OCR1B=556; #define pwm33L OCR1A=1944; #define pwm15P OCR1B=250; #define pwm15L OCR1A=2250; #define Lstop pwmstopL; #define Pstop pwmstopP; #define Stop pwmstopP; pwmstopL; #define czas_tyl_linii 300 #define Llinii bit_is_clear(PIND,7) #define Plinii bit_is_clear(PIND,6) //#define Lstyk bit_is_clear(PINC,2) //#define Pstyk bit_is_clear(PINC,3) #define LINIA (Llinii||Plinii) #define widziL bit_is_clear(PINC,0) #define widziP bit_is_clear(PINC,1) void delay(unsigned int ms); unsigned char nr_adc, jak_dlugo_widzi; unsigned int licznik_pomiarow; #define widzi (widziL || widziP) bool z_tylu; unsigned char i=0; void delay(unsigned int ms) //na 8MHz działa w symulatorze z dokładnością 0.05% { unsigned int i; unsigned int j; for (i=0;i<ms;i++) { for (j=0;j<398;j++) { asm volatile ( "WDR"::); } } } void udelay(unsigned int ms) //, 1 = 100us, na 8MHz działa w symulatorze z dokładnością 0.06% { unsigned int i; unsigned int j; for (i=0;i<ms;i++) { for (j=0;j<40;j++) { asm volatile ( "WDR"::); } } } unsigned char licznik0 = 0; unsigned char tsopL = 0; unsigned char tsopP = 0; unsigned char tsop_dioda = 0; //0 - żadna, 1 - lewa, 2 - prawa #define TSOP_widzi bit_is_clear(PINC, PC2) #define RED_LED1_ON sbi(PORTC,PC4); #define RED_LED1_OFF cbi(PORTC,PC4); #define RED_LED2_ON sbi(PORTC,PC5); #define RED_LED2_OFF cbi(PORTC,PC5); #define GREEN_LED_ON sbi(PORTC,PC3); #define GREEN_LED_OFF cbi(PORTC,PC3); ISR(TIMER0_OVF_vect) { licznik0++; licznik0 %= 30; //122/4 to 1s TCNT0 = 0; if (TSOP_widzi) { tsopL = 0; tsopP = 0; RED_LED1_OFF RED_LED2_OFF if (tsop_dioda == 1) tsop_dioda = 2; else tsop_dioda = 1; return; //break; } if (tsop_dioda == 1) { cbi(PORTB,PB4); } else { cbi(PORTB,PB5); } udelay(4); //wysyłam w sumie 21-22 impulsy if (!TSOP_widzi) { switch(tsop_dioda) { case 1: tsopL = 0; tsop_dioda = 2; RED_LED1_OFF break; case 2: tsopP = 0; tsop_dioda = 1; RED_LED2_OFF break; default: tsop_dioda = 1; break; } //wyłączenie nadawania sbi(PORTB,PB4); sbi(PORTB,PB5); return; //break; } udelay(2); if (!TSOP_widzi) { switch(tsop_dioda) { case 1: tsopL = 0; tsop_dioda = 2; RED_LED1_OFF break; case 2: tsopP = 0; tsop_dioda = 1; RED_LED2_OFF break; default: tsop_dioda = 1; break; } //wyłączenie nadawania sbi(PORTB,PB4); sbi(PORTB,PB5); return; //break; } //wyłączenie nadawania sbi(PORTB,PB4); sbi(PORTB,PB5); udelay(4); if (TSOP_widzi) { switch(tsop_dioda) { case 1: tsopL = 0; tsop_dioda = 2; break; case 2: tsopP = 0; tsop_dioda = 1; break; default: tsop_dioda = 1; break; } return; //break; } else { switch(tsop_dioda) { case 1: tsopL = 1; tsop_dioda = 2; RED_LED1_ON break; case 2: tsopP = 1; tsop_dioda = 1; RED_LED2_ON break; default: tsop_dioda = 1; break; } } } int main(void) { DDRB = 0b00111110; //czujnik 36kHz i pwm na wyjście DDRD = 0b00110000; DDRC = 0b00111000; //posrt C na wejście, jedynie diody na wy PORTC = 0b00000100; //podciągnięcie TSOPa do 5V PORTB = 0x00; PORTB = 0b00110000; PORTD = 0x00; //włącznaie pwma TCCR1A =_BV(COM1A1)|_BV(COM1B1)|_BV(WGM11)|_BV(COM1A0); TCCR1B =_BV(CS11)|_BV(WGM13); pwmstopL; pwmstopP; ICR1=pwmICR; Lstop Pstop sbi(PORTB, PB0); //podciagniecie przycisku sbi(PORTC, PC0); //podciagniecie sharpa sbi(PORTC, PC1); //podciagniecie sharpa sbi(PORTC, PC2); //podciagniecie przycisku sbi(PORTC, PC3); //podciagniecie przycisku while (bit_is_set(PINB,0)); //czekanie na wcisniecie przycisku startu delay(5000); pwmmaxP; pwmmaxL; Ptyl; Ltyl; delay(250); Pprzod; Lprzod; Pstop; Lstop; /* koniec bloku uruchamiania przetwornika ADC */ TCCR0 = _BV(CS02)|_BV(CS00); //preskaler 1024 256 TIMSK |= _BV(TOIE0); TCNT0 = 0; //ustawianie generatora 36kHz TCCR2 = _BV(WGM21)|_BV(COM20)|_BV(CS20); //preskaler 1, tryb CTC toggle OCR2 = 110; tsop_dioda = 1; sei(); //zezwolenie na przerwania globalne while(1) { Lprzod; Pprzod; Ltyl if (!widzi&&!LINIA) { GREEN_LED_OFF if (tsopL && (tsopP == 0) && !LINIA) { Lprzod; Pprzod; pwm75L pwm15P } else if (tsopP&& (tsopL == 0) && !LINIA) { Lprzod; Pprzod; pwm75P pwm15L } else if (licznik0 > 15) //niech jedzie wężykiem { Pprzod Ltyl pwmmaxL; pwm25P; } else { Lprzod Ptyl pwmmaxP; pwm25L; //pwm15L; } //if (licznik_pomiarow > 4500) } //if (!widzi) else if (!LINIA) { Lprzod; Pprzod; GREEN_LED_ON pwm75L; pwm33P; //jeżeli widzi jednym to jedzie po łuku, jeżeli obydwoma to szarżuje if (widziL) { //pwm50P; } if (widziP) { //pwmmaxL; } delay(350); } if (Plinii) { Ptyl; Ltyl; delay (czas_tyl_linii); Pprzod; delay (200); for (i=0; i<35;i++) { if (!widzi) delay (3); else break; } Pprzod; Lprzod; } if (Llinii) { Ptyl; Ltyl; delay (czas_tyl_linii); Lprzod; delay (200); for (i=0; i<35;i++) { if (!widzi) delay (3); else break; } Lprzod; Pprzod; } } //while(1) } //main() PS: nie zwinę kodu, widziałem na kilku forach skrypty które to robiły
OldSkull Listopad 24, 2010 Autor tematu Udostępnij Listopad 24, 2010 Powiem Ci, że nie mierzyłem, ale dostawał z >8V chyba na 75%, czyli jakieś 6V. 0.2-0.25 m/s mógł osiągać.
KD93 Listopad 24, 2010 Udostępnij Listopad 24, 2010 Ja mam chyba 2-3 twoje walki, jak chcesz to wrzucę na yt.
Dżony Listopad 24, 2010 Udostępnij Listopad 24, 2010 A ja widziałem Urodą nie grzeszy ale był godnym przeciwnikiem ( przegrałem...) nawet raz obydwoje żeśmy się zawiesili (znaczy roboty) też mam jakąś walkę więc potem mogę wrzucić (w dobrej jakości) hehe do zobaczenia na kolejnych zawodach
OldSkull Listopad 25, 2010 Autor tematu Udostępnij Listopad 25, 2010 O, byłbym wdzięczny gdybyście wrzucili jakieś walki. Dzięki.
Dżony Listopad 25, 2010 Udostępnij Listopad 25, 2010 No to obiecany filmik https://www.youtube.com/watch?v=ITKinxby2js PS. Dałem też jak się zawiesiły
TIMONek Listopad 25, 2010 Udostępnij Listopad 25, 2010 Miałeś jakieś problemy z sharpem? Nie jest przypadkiem tak, że trochę za szybko się krecisz? Co za tym idzie, nie możesz wycelować w przeciwnika? Popracuj nad estetyką kodu
OldSkull Listopad 27, 2010 Autor tematu Udostępnij Listopad 27, 2010 Powiem tak: więcej problemów wynika z tego, że mu sie unosi przód niż z tego, że się kręci. A kod jest przecież bardzo czytelny, nie wiem o co Ci chodzi
TIMONek Listopad 27, 2010 Udostępnij Listopad 27, 2010 Powiem tak: więcej problemów wynika z tego, że mu sie unosi przód niż z tego, że się kręci. No, ale robot ma wyraźny problem, żeby wycelować w przeciwnika. A kod jest przecież bardzo czytelny, nie wiem o co Ci chodzi Żartujesz prawda?
OldSkull Listopad 27, 2010 Autor tematu Udostępnij Listopad 27, 2010 Nie żartuję. Co tutaj jest nieczytelnego? Przyznaję, że w paru miejscach brakuje wcięć i w kilku zostały resztki początkowego kodu, ale poza tym jest moim zdaniem bardzo czytelny.
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ę »