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

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!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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