Skocz do zawartości

[Kurs] Programowanie ARM LPC1114 cz.7 - Czujniki odbiciowe


Elvis

Pomocna odpowiedź

Poprzednia część kursu.

[Kurs] Programowanie ARM LPC1114 cz.7 - Czujniki odbiciowe

W poprzednich częściach kursu poznaliśmy już możliwości procesora niezbędne do zbudowania prostego robota.

Potrafimy sterować silnikami, odczytywać poziom napięcia za pomocą przetwornika analogowo-cyfrowego.

Tym razem wykorzystamy poznaną wiedzę do wykrywania linii, które jest podstawą do budowy naszego linefollowera.

W pierwszej części kursu pojawił się schemat płytki z czujnikami odbiciowymi. Zastosowałem czujniki TCRT5000. Warto w kilku słowach omówić ich działanie.

Każdy czujnik składa się z 2 elementów:

1) diody oświetlającej podłoże

2) fototranzystora wykrywającego światło odbite od podłoża

Fotodioda i fototranzystor pracuje w podczerwieni, jeśli chcemy sprawdzić, czy dioda działa prawidłowo można wykorzystać aparat bez filtru. Większość telefonów wyposażonych jest właśnie w takie aparaty.

Niestety czujniki użyte w moim robocie zostały wymontowane z poprzednich konstrukcji. Jak widać działają nie najlepiej. Zdjęcie od razu ujawnia, które czujniki na pewno nie będą działały zadowalająco.

Dioda zasilana jest przez rezystor i układ nie wymaga chyba omówienia.

Warto za to chwilę popatrzeć na schemat podłączenia fototranzystora.

Przez fototranzystor płynie prąd zależny jego oświetlenia.

Nas interesuje napięcie w punkcie OPTO1 (jest ono podawane na wejście przetwornika A/C).

Napięcie OPTO1 wynosi VCC minus spadek na rezystorze R2.

Czyli Uopto1 = Vcc - U2.

Z prawa Ohma spadek napięcia na rezystorze R2 wynosi: U2 = R2 * i, gdzie i to prąd płynący przez rezystor.

Jednocześnie prąd i jest to prąd płynący przez fototranzystor naszego czujnika.

Gdy fototranzystor nie jest oświetlany, płynie przez niego bardzo mały prąd, więc i spadek napięcia na rezystorze R2 jest mały. Oznacza to, że poziom napięcia w punkcie OPTO1 jest prawie taki jak VCC.

Gdy oświetlimy fototranzystor, zacznie przez niego płynąć większy prąd. Spowoduje to zwiększenie spadku napięcia na R2, a w rezultacie zmniejszenie napięcia na OPTO1.

Czyli zależność jest taka:

• fototranzystor oświetlony - niskie napięcie na OPTO1

• fototranzystor nieoświetlony - wysokie napięcie na OPTO1

Jak będzie oświetlany nasz fototranzystor? Przez światło diody odbite od podłoża.

Więc zależność będzie następująca:

• jasne podłoże - niskie napięcie na OPTO1

• ciemne podłoże (linia) - wysokie napięcie na OPTO1

Jak pamiętamy z poprzedniej części, napięcie na przetworniku A/C zamieniane jest na liczbę z zakresu 0-1023. Im wyższe napięcie tym wyższa wartość odczytana przez czujnik.

Na podstawie tego co ustaliliśmy oznacza to, że niskie wartości - odpowiadają jasnemu podłożu.

Wysokie wartości z przetwornika - ciemne podłoże / linię.

Czas sprawdzić, czy wszystko działa prawidłowo. Podłączamy fototranzystory do wejść procesora.

Ja wybrałem 4 działające czujniki i 4 przetworniki. Niestety podczas wcześniejszych prac uszkodziłem procesor, więc nie wszystkie przetworniki działają prawidłowo. Na szczęście dostępne jest 8 wejść, udało się wśród nich znaleźć 4 sprawne.

Wgrywamy program18.zip do procesora (jest to właściwie poprzedni przykład, który odczytuje tylko wybrane kanały ADC).

Poniżej widzimy rezultat dla robota nad białą kartką:

Porównajmy wyniki z czarną kartką:

I jeszcze biała kartka z czarną linią pod czujnikiem AD4:

(warto zwrócić uwagę, że ta kartka jest nieco „bielsza” niż użyta poprzenio).

Wyniki są zgodne z naszymi oczekiwaniami - im ciemniejsze tło, tym wyższe odczyty.

Właściwie w tej chwili moglibyśmy już napisać program sterowania robotem.

Jednak postaramy się wykonać jeszcze jedną czynność.

Jak widać moje czujniki są bardzo kiepskiej jakości - szczególnie AD1 daje inne odczyty niż pozostałe.

Co więcej odczyty będą zależały od koloru podłoża / warunków oświetlenia.

Aby pozbyć się wszystkich tych niedoskonałości, przygotujemy program do kalibracji czujników.

Kalibracja czujników

Kalibracja będzie przebiegać następująco:

Dla każdego czujnika będziemy zapisywać najmniejszą i największą wartość odczytaną przez czujnik.

W tym czasie czujniki powinny zostać przesunięte nad podłożem i linią.

Najmniejsza wartość będzie odpowiadała barwie podłoża, najwyższa - linii.

Programowo będziemy skalować odczyty do wspólnego przedziału 0-100. Czyli odczyt po przeskalowaniu 0 będzie oznaczał czyste tło, 100 czarną linię. Pośrednie odczyty pozwolą na wykrywanie częściowego przesłonięcia linii.

Omawiany przykład znajdziemy w pliku program19.zip.

Wykorzystywane będą 4 czujniki, będą im odpowiadały indeksy od 1 do 4. Dodatkowo dodane zostaną 2 skrajne, udawane czujniki tzw. atrapy. Będą one zawsze zawierały odczyt 0 - czyli podłoże. Dodanie ich ułatwi napisanie algorytmu sterowania robotem.

Na początek deklarujemy 4 tablice:

int32_t		opto_min[6];
int32_t		opto_max[6];
int32_t		opto_value[6];
int32_t		opto_scaled[6];

W tablicach opto_min[] oraz opto_max[] będziemy zapisywać najniższe i najwyższe odczyty danego czujnika.

Tablica opto_value[] będzie przechowywać ostatni odczyt z przetwornika A/C.

Natomiast tablica opto_scaled[] będzie zawierała odczyty z czujników po przeliczeniu na wartości 0-100.

Zdefiniujemy też kilka funkcji pomocniczych.

Funkcja opto_read() odczytuje wartości z przetworników (i zapisuje w opto_value[]).

Następnie wywołujemy opto_scale(), która przelicza odczytane ostatnio wartości i zapisuje w tablicy opto_scaled[].

Zanim będziemy mogli używać funkcji opto_scale() musimy wykonać kalibrację. Do kalibracji przygotujemy funkcję calib_update() - zaktualizuje ona wpisy w tablicach opto_min[] oraz opto_max[].

Pozostaje jeszcze pytanie, jak przesuwać czujniki podczas kalibracji.

Można to oczywiście wykonać ręcznie, ale nie o to chodzi podczas budowy robota. Wykonamy więc obrót w lewą i prawą stronę, tak aby pod czujnikami znalazła się linia trasy.

Niestety brak mostka H nie daje możliwości obrotu w miejscu. Mimo wszystko kalibrację można wykonać.

Funkcja opto_calib() wykona za nas kalibrację. Najpierw obróci robota w prawo, następnie w lewo i znowu w prawo, aby wrócić do pierwotnej pozycji.

Po kalibracji przeskalowane odczyty wyglądają następująco:

Jak widać linia znajduje się pod czujnikiem 3 i częściowo 2.

Dzięki wykorzystaniu przetworników A/C dostajemy nie tylko robota, który dopasowuje się do warunków (autokalibracja), ale jeszcze możemy wykrywać częściowe najechanie czujnika na linię.

program18.zip

program19.zip

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.