Skocz do zawartości

Autokalibracja robota AVR C (switch)


Pomocna odpowiedź

Napisano

Witam otóż mam jeden problem z auto kalibracją. Otóż posiadam robota N.O.P (No oil painting) opisanego już wcześniej na diodzie i chciałbym dorobi do niego auto kalibrację.

Całość inicjacji i odczytywanie mam już napisane ale tu niespodziewane pojawił się problem.

Czy można wykonać całość takiego programu w instrukcji switch. Kiedy nie miałem jeszcze ADC to sprawa była prosta switch(PINC & 1F) i w binarnym wpisywałem stany ale teraz nie wiem jak się zabrać za napisanie ruchów robota. Proszę o pomoc. Z góry dziękuje.

[ Dodano: 07 Cze 09 11:27 ]

Znaczy się zainteresowanie jest duże. Dzięki.

  • 2 tygodnie później...

Chopie żebyś ty jaśniej napisał o co ci chodzi to może i zainteresowanie twoim postem by było większe.

Ciężko więc odpowiedzieć na twoje jedyne pytanie w tym poście "Czy można wykonać całość takiego programu w instrukcji switch" odpowiem że na pewno można

Nie znam C więc nie odpowiem ci jak w nim wykonać autokalibrację. Mogę jedynie powiedzieć jak to się odbywa u mnie w Bascomie i na tej podstawie napiszesz sobie autokalibrację sam w C. Opisz może co chcesz osiągnąć, albo jak korzystasz aktualnie z ADC to opiszę ci metodę kalibracji do tego.

Byłbym bardzo wdzięczny jeżeli ktoś by mi napisał jak wygląda jego program chodzi mi głównie o tą auto kalibracje abym wiedział jak wpleśc ją do głównego programu. Może by również Bascom ale nie potrafię tego języka dlatego prosiłbym o komentarze w ewentualnym kodzie. Nie wiem jak to jaśniej wyjaśni mam nadzieje że zrozumiecie.

Nie zrozumiałeś tego co napisałem, opisz w jaki sposób korzystasz z danych z ADC na czujnikach, czy wykorzystujesz min, max, jakieś średnie, czy korzystasz tylko i wyłącznie z danych bieżących. Nie podam ci swojego kodu, bo go nawet nie mam przy sobie (siedzę w pracy), mogę ci jedynie opisać algorytm, który sobie przepiszesz do C.

Sabre, to napisz jeżeli chcesz się podzielić, myślę, że każdemu się przyda chociaż ogólny zarys algorytmu kalibracji :]

Ja myślałem nad czymś takim.

przed pętlom.

➡️ odczyt wszystkich czujników i wyliczanie średniej.

w pętli nieskończoności.

➡️ odczyt czujników

➡️ porównanie stanu czujników do średniej

➡️ zwracanie wartości bool'owskiej w tabeli

➡️ przypisanie do odpowiedniej operacji

ale wydaje mi się że ta zbyt dużo operacji i zastanawiam się czy istnieje jakiś szybszy sposób.

odczyt wszystkich czujników i wyliczenie średniej nie ma chyba sensu bo co ci to da jeśli w tym momencie pojazd będzie stał na jednolitym podłożu.

wg mnie to trzeba pojazd postawić na linii i odczytać wszystkie czujniki po czym znaleźć największy i najmniejszy z nich odczyt i z tych dwóch wyciągnąć średnią z którą potem podczas pracy porównywać aktualne odczyty z czujników.

reszta tak raczej jak napisałeś. wcale to nie jest dużo operacji.

można też płynnie sterować na podstawie wartości odczytanych z ADC ale to zdecydowanie bardziej skomplikowane bo trzeba by wprowadzić jakieś zależności mocy poszczególnych mocy silników od wartości z czujników czyli dorobić jakiś układ regulacji.

  • Lubię! 1

U mnie wygląda to tak:

-ustawiam silniki aby się kręciły w przeciwnych kierunkach

-w pętli zaczynam odczytywać napięcie na wszystkich czujnikach

-w tej samej pętli przypisuję dla każdego z czujników do tablicy wartości min i max

-również w tej samej pętli obliczam średnią wartość dla każdego z czujników i wpisuję ją do tablicy, tą wartość średnią dodaję do minimum, bądź odejmuję od maksimum (w zależności od podłoża białe/czarne), w ten sposób wyznaczam granicę pomiędzy linią i jej brakiem

-na podstawie granicy ustawiam flagę dla liczby binarnej, która określa położenie robota względem linii (np. 00100 - linia pod środkowym czujnikiem)

-jeśli robot będzie w położeniu 10000 a później 00000 zatrzymuję kalibrację i ustawiam silniki w ten sposób aby robot ustawił się na pozycji 00100 (oczywiście podczas powrotu do pozycji 00100 robot już się nie kalibruje, korzysta już z danych zapisanych w tablicach i aktualnych pomiarów)

  • Lubię! 2

Dzięki za pomoc ale mam jeszcze jedno pytanie jak ustawiasz tą flagę.

na podstawie granicy ustawiam flagę dla liczby binarnej, która określa położenie robota względem linii (np. 00100 - linia pod środkowym czujnikiem)

Ewentualnie jeśli by ktoś wiedział to jak to zrobi w C. Chodzi mi o ten zapis binarny.

Czyli w C będzie to po prostu ustawianie konkretnych bitów zmiennej "flaga_linii" czy jak ją sobie nazwiesz. Dokładnie to samo co tu.

  • Pomogłeś! 1
  • 6 miesiące później...

Odświeżam temat!

Zabrałem się za pisanie programu dla Line Folower'a w C. Napisałem prosty program, bazujący na konstrukcji "widzę linię / nie widzę linii". Robot zachowuje się poprawnie, ale tylko w sytuacji, gdy między linią a tłem jest dość spory kontrast. Problem powstaje jednak, gdy kontrast jest mały. Z tego co czytam powinienem zastosować autokalibrację. Mam jednak pytanie - w jaki sposób mierzyć napięcia na czujnikach. Mogę prosić o jakieś źródełko w C wykonujące pomiar napięcia na czujniku CNY70?

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ę »
×
×
  • Utwórz nowe...