Marcinas Napisano Czerwiec 25, 2012 Udostępnij Napisano Czerwiec 25, 2012 Witam Mam pytanie prośbę czy był by ktoś w stanie pomóc stworzyć napisać program do LF. Otóż mam taki problem jak napisać kod do czujników np.cny 70 ,kitry jak się pisze taki kod zaczynam dopiero naukę i nie ogarniam jeszcze czy był by ktoś na tyle miły aby napisać mi taki kod ze szczegółowym wyjaśnieniem ? Jak utworzyć taki algorytm aby dobrze działa na jakiej zasadzie to się tworzy czy był by jakiś chętny może ktoś ma nawet jakieś propozycje co przeczytać co zrobić jak już wspomniałem dopiero zaczynam a jak by ktoś mi objaśnił to jak najdokładniej to już bym wiedział jak co 😃 Fajnie i miło by było gdyby to były nawet wycinki z jakiegoś programu kawałek tego żeby było w C i żebym mógł to zrozumieć fajnie by było ułatwiło by to mi trudne początki z programowaniem 😃 Pozdrawiam Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Czerwiec 25, 2012 Udostępnij Czerwiec 25, 2012 Tutaj jest mój ultra stary poradnik, ale może coś Tobie pomoże 🙂 https://www.forbot.pl/forum/topics20/algorytmy-sposoby-wykrywanie-linii-przez-roboty-linefollower-vt618.htm Link do komentarza Share on other sites More sharing options...
MatManiak Czerwiec 25, 2012 Udostępnij Czerwiec 25, 2012 https://www.forbot.pl/forum/topics20/algorytmy-sposoby-wykrywanie-linii-przez-roboty-linefollower-vt618.htm https://www.forbot.pl/forum/topics20/algorytmy-pid-w-robotyce-amatorskiej-linefollower-cz1-czlon-p-vt5973.htm https://www.forbot.pl/forum/topics20/teoria-sterowanie-silnikiem-robotem-pid-vt2055.htm Link do komentarza Share on other sites More sharing options...
Marcinas Czerwiec 25, 2012 Autor tematu Udostępnij Czerwiec 25, 2012 Tutaj jest mój ultra stary poradnik, ale może coś Tobie pomoże 🙂https://www.forbot.pl/forum/topics20/algorytmy-sposoby-wykrywanie-linii-przez-roboty-linefollower-vt618.htm Fajne czytałem to już wiele razy 😃 fajny artykuł tylko ja nie wiem jak to do końca napisać aby wszytko było ok np. jak czujnik 5 zobaczy linie to silnik L 20% mocy a silnik P 70% mocy nie jestem pewnie jak to napisać tak żeby to było poprawnie dlatego tak myślałem żeby ktoś na jakimś kodzie przykładowym mi to objaśnił 😃 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
Treker (Damian Szymański) Czerwiec 25, 2012 Udostępnij Czerwiec 25, 2012 To możesz przeczytać jeszcze to co było linkowane wyżej: https://www.forbot.pl/forum/topics20/algorytmy-pid-w-robotyce-amatorskiej-linefollower-cz1-czlon-p-vt5973.htm Ale ostrzegam, że to słaby artykuł 🙂 Link do komentarza Share on other sites More sharing options...
Nawyk Czerwiec 25, 2012 Udostępnij Czerwiec 25, 2012 A może https://www.forbot.pl/forum/topics20/dla-poczatkujacych-przepis-na-robota-w-pelni-programowalny-line-follower-vt2356.htm ? Przykładowy kod, nie mówię, że super optymalny, ale widzę, że i tak dopiero raczkujesz w tym temacie Link do komentarza Share on other sites More sharing options...
sosnus Czerwiec 25, 2012 Udostępnij Czerwiec 25, 2012 Z tego co widzę Koledze bardziej zależy na kodzie w C a nie bascom, kóry pojawia sę w większości linków powyżej. Ja też mam podobną prośbę do Was o taki artykuł, też dopiero zaczynam programować w C. Mam na myśli taki artykuł, w którym pokazany byłby fragment kodu (w C), a po nim wytłumaczenie, za co odpowiada ten fragment programu. Myślę że to jest dobry temat na wakacyjny konkurs. https://www.forbot.pl/forum/topics20/dla-poczatkujacych-podlaczanie-i-obsluga-urzadzen-zewnetrznych-w-robotyce-i-elektronice-vt6889.htm?utm_source=forbot&utm_medium=link_spis_art&utm_content=art_6889&utm_campaign=spis_art Na samym początku w tym artykule jest o wyświetlaczu. Mam na myśli coś takiego, tylko że o programie do robotów FTL i oczywiście w języku C. Czy ktoś podjąłby się takiego zadania? Z góry dziękuję. Myślę że taki art na pewno nie tylko nam dwóm się przyda 🤣 . Link do komentarza Share on other sites More sharing options...
baton Czerwiec 26, 2012 Udostępnij Czerwiec 26, 2012 Artykuł to nie będzie, ale myślę że w napisaniu najbardziej podstawowego algorytmu jazdy LFa może pomóc. Niedawno w ciągu wieczoru naklepałem takie coś do robocika kolegi. Kolejność podłączenia czujników nie pokrywa się z ich fizyczną kolejnością, dlatego też wykorzystana została tablica ADC_adresses[7]. Są tam wpisane numery kanałów ADC odpowiadające kolejnym czujnikom. Zasada działania jest banalna - w każdym przejściu pętli wykonywany jest odczyt ADC czujników, progowanie, liczenie błędu, dodanie/odjęcie wartości błędu do/od stałej wartości wypełnienia i na końcu wrzucenie tej ostatniej na PWM. Błąd jest liczony jako średnia wartość wag czujników, na których wykryto czarną linię. W przypadku wykrycia linii na wszystkich 7 czujnikach robot staje w miejscu. Zakomentowane w pętli głównej jest też wysyłanie danych z czujników przez UART. Oprócz kodu programu przesyłam też 'strukturę Batona', takie spoko coś znalezione kiedyś w necie do pisania ładnych makr do obsługi GPIO działających w kodzie jako lValue. Jak będzie mi się wybitnie nudziło, to może napiszę to jakoś bardziej składnie 😉 Tak btw, ja się czasem staram dla jaj napisać coś w takim stylu jak autor tematu, no ale nie potrafię. Ludzie, jak Wy to robicie? Da się jakoś bezpośrednio przelać myśl na ekran komputera, bez żadnych zbędnych interpunkcyjnych i gramatycznych bzdur? 😉 #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdlib.h> #include "io_cfg.h" #include "uart.h" void PWM(int lewy, int prawy); void read_adc(); int licz_blad(); void init(); void uart_putd(uint16_t liczba); int ADC_adresses[7] = {5,4,3,2,1,0,7}; int pomiary[7] = {0}; int czujniki[7] = {0}; int error = 0; int main(void) { init(); LED = 1; _delay_ms(200); LED = 0; _delay_ms(200); while(1) { read_adc(); error = licz_blad(); if(error == 666) PWM(0,0); else PWM(200+error, 200-error); /*uart_putc('#'); uart_putd(czujniki[0]); uart_putd(czujniki[1]); uart_putd(czujniki[2]); uart_putd(czujniki[3]); uart_putd(czujniki[4]); uart_putd(czujniki[5]); uart_putd(czujniki[6]); uart_putc('*'); uart_putd(error);*/ _delay_ms(10); } } void PWM(int lewy, int prawy) { if(lewy >= 0) { if(lewy>254) lewy = 254; EN_12 = 1; EN_11 = 0; } else { if(lewy<-254) lewy = -254; EN_12 = 0; EN_11 = 1; } if(prawy >= 0) { if(prawy>254) prawy = 254; EN_22 = 1; EN_21 = 0; } else { if(prawy<-254) prawy = -254; EN_22 = 0; EN_21 = 1; } PWML = abs(lewy); PWMP = abs(prawy); } // pomiar ADC na kolejnych wejściach podanych w tabeli ADC_adresses // wyniki zapisane już w dobrej kolejności (tak jak fizycznie czujniki) // w tabeli pomiary, a wartości 1/0 po progowaniu w tab. czujniki void read_adc() { for(int i=0; i<7; i++) { ADMUX = _BV(ADLAR) | _BV(REFS0); // wyrównanie do lewej - będzemy czytać tylko starsze 8 bitów ADMUX |= ADC_adresses[i]; // wybranie odpowiedniego kanału ADC ADCSRA |= _BV(ADSC); // start pomiaru while(ADCSRA & _BV(ADSC)) {}; // czekamy aż skończy pomiar pomiary[i] = ADCH; if(pomiary[i] > 150) // progowanie; stały próg równy 150 czujniki[i] = 1; else czujniki[i] = 0; } } int licz_blad() { int err = 0; // wartość błędu int ilosc = 0; // ilość czujników z wykrytą linią for(int i=0; i<7; i++) { err += czujniki[i]*(i-3)*50; // wagi kolejnych czujników: -150, -100, -50, 0, 50, 100, 150 ilosc += czujniki[i]; } if(ilosc == 7) // wszystkie czujniki wykryły linię - taki ficzer return 666; err /= ilosc; // liczymy średnią wagę return err; } void init() { EN_11_DIR = OUTPUT; EN_11 = 0; EN_12_DIR = OUTPUT; EN_12 = 0; EN_21_DIR = OUTPUT; EN_21 = 0; EN_22_DIR = OUTPUT; EN_22 = 0; PWM1_DIR = OUTPUT; PWM1 = 0; PWM2_DIR = OUTPUT; PWM2 = 0; LED_DIR = OUTPUT; LED = 0; // KONFIGURACJA PWMa TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(WGM10); TCCR1B = _BV(CS10) | _BV(WGM12); // KONFIGURACJA ADC ADCSRA |= _BV(ADPS2) | _BV(ADPS1) | _BV(ADEN); ADMUX |= _BV(ADLAR) | _BV(REFS0); PWM(0,0); uart_init(UART_BAUD_SELECT(19200, F_CPU)); sei(); } void uart_putd(uint16_t liczba) { char buffer[16]; char* wynikA = 0; wynikA = itoa(liczba, buffer, 10); uart_puts(wynikA); } #ifndef IO_CFG_H #define IO_CFG_H // NIE RUSZ TEGO #define INPUT 0 #define OUTPUT 1 typedef struct { unsigned int bit0:1; unsigned int bit1:1; unsigned int bit2:1; unsigned int bit3:1; unsigned int bit4:1; unsigned int bit5:1; unsigned int bit6:1; unsigned int bit7:1; } _io_reg; #define REGISTER_BIT(rg,bt) ((volatile _io_reg*)&rg)->bit##bt // ODTĄD RUSZ ;) #define EN_11 REGISTER_BIT(PORTD,5) #define EN_11_DIR REGISTER_BIT(DDRD,5) #define EN_12 REGISTER_BIT(PORTB,7) #define EN_12_DIR REGISTER_BIT(DDRB,7) #define EN_21 REGISTER_BIT(PORTD,6) #define EN_21_DIR REGISTER_BIT(DDRD,6) #define EN_22 REGISTER_BIT(PORTD,7) #define EN_22_DIR REGISTER_BIT(DDRD,7) #define PWM1 REGISTER_BIT(PORTB,1) #define PWM1_DIR REGISTER_BIT(DDRB,1) #define PWM2 REGISTER_BIT(PORTB,2) #define PWM2_DIR REGISTER_BIT(DDRB,2) #define PWMP OCR1B #define PWML OCR1A #define LED REGISTER_BIT(PORTB,0) #define LED_DIR REGISTER_BIT(DDRB,0) #endif //IO_CFG_H 1 Link do komentarza Share on other sites More sharing options...
sosnus Czerwiec 26, 2012 Udostępnij Czerwiec 26, 2012 Właśnie o coś takiego mi chodziło 🤣 . Wielkie dzięki. Za tydzień chyba skończę mojego LF, wtedy na pewno mi się to przyda. Link do komentarza Share on other sites More sharing options...
baton Czerwiec 26, 2012 Udostępnij Czerwiec 26, 2012 Pochwal się wtedy koniecznie wynikami 😉 Link do komentarza Share on other sites More sharing options...
ojebejbe Lipiec 3, 2012 Udostępnij Lipiec 3, 2012 Artykuł to nie będzie, ale myślę że w napisaniu najbardziej podstawowego algorytmu jazdy LFa może pomóc. Niedawno w ciągu wieczoru naklepałem takie coś do robocika kolegi. Może dokończę w końcu opis Rzazima, który wisi sobie w nieukończonych... Link do komentarza Share on other sites More sharing options...
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ę »