Po dłuższej przerwie wracam do prac nad micromousem. Została mi do zrobienia jeszcze ostatnia część sprzętowa – czujniki ścian. Roboty jest dosyć sporo, więc nie udało mi się wszystkiego machnąć za jednym podejściem. Przy okazji jak zwykle wynikły nieprzewidziane problemy.

Wybór elementów

Wybierając fotoelement i emiter podczerwieni najważniejszym parametrem jest długość fali. Chodzi o to, aby wiązka światła z diody IR posiadała taką samą długość fali, jak fala, dla której fotoelement ma maksymalną czułość. Przy okazji w przypadku diody warto również zwrócić uwagę na kierunkowość wiązki – kąt powinien być jak najmniejszy. Ja wybrałem diodę TSAL6400 o długości fali 940 nm. Wspomniane wyżej parametry w nocie katalogowej zostały przedstawione na wykresach:

Wybrany przeze mnie fototranzystor to LIRT5B., którego optymalna długość fali to również 940 nm. O ile wybrana przeze mnie dioda jest wysokiej jakości, to fototranzystor jest już trochę gorszy. Widać to choćby po nocie katalogowej, w której brakuje wykresów. Jednak przy wyborze ważna była dla mnie dostępność.

Dioda IR nie jest sterowana bezpośrednio z procesora. Sygnał sterujący jest wzmacniany przez układ Darlingtona ULN2003. Dzięki temu diody mogą pobierać bez problemu dość spory prąd. Diody są sekwencyjnie włączane i wyłączane, co może powodować zakłócenia. Dlatego są zasilane z 5V, aby była separacja od zasilania logiki.

Lutowanie elementów

Z przodu robota do tej pory nie lutowałem żadnych elementów. Miałem więc do polutowania ULN2003, pary dioda IR – fototranzystor i trochę rezystorów. Po pierwszej próbie okazało się, że nie  ze wszystkich nóżek ULN2003 sygnały dochodzą do diod i do STMa. Po poprawieniu lutów okazało się, że również STM był źle polutowany. Cała jedna strona zawierająca również wejścia analogowe od fototranzystorów nie stykała dobrze. Aż dziwne, że do tej pory to nie wyszło, ale widocznie te nóżki, których potrzebowałem wcześniej akurat łączyły.

Na czas testów przylutowałem tylko jedną parę dioda IR – fototranzystor. Chciałem na niej wykonać pomiary i zaprojektować mocowania do druku 3D, aby wszystkie czujniki były zamontowane tak samo. Do testów stworzyłem pierwszą wersję softu obsługującego czujniki ścian. Na razie zapala on diodę, sczytuje ADC i drukuje wyniki na konsoli. Docelową wersję tego softu jeszcze dokładniej opiszę, bo jest tam kilka ciekawostek. Soft zapalał również pozostałe diody, które nie są aktualnie wlutowane. Sprawdziłem tylko przy pomocy LEDa wtykanego bez lutowania, że pozostałe diody są poprawnie sterowane.

Pomiary

Celem pomiarów było znalezienie optymalnego kąta między diodą IR, a fototranzystorem. Kąt ten był mi potrzebny, aby stworzyć mocowania czujników pozwalające unieruchomić elementy w pożądanym położeniu.

Maksymalną dokładność pomiaru chciałem uzyskać dla odległości 10 cm od ściany. Początkowo ustawiłem robota w zadanej odległości i próbowałem ręcznie znaleźć dobre ustawienia. Do sprawdzania gdzie pada światło IR potrzebowałem ciemności i kamery z telefonu.

Klimatu całemu procesowi dodawała muzyka z Terminatora, co nawet udokumentowałem na filmiku:

Po chwili jednak stwierdziłem, że robienie tego ręcznie jest bez sensu. W końcu grecy po coś wymyślili trygonometrię. Wystarczyło zmierzyć odległość między diodą IR a fototranzystorem, a następnie znając pożądaną odległość, obliczyć tangens. Odległość między elementami to 7mm, co po wykonaniu obliczeń daje:

arctg(\frac{7}{100}) = 4^{\circ} 

Mocowania czujników

Mając potrzebne informacje przystąpiłem do projektowania mocowań. Oto efekt:

Pierwsze próby wydruku pokazały, że otwory są za małe. Zaprojektowałem je na styk i trzeba było dodać trochę zapasu. Za drugim razem już dobrze wchodziły. Wydrukowałem więc 6 sztuk. Jakość wydruku jest zadowalająca. Musiałem tylko trochę wyrobić otwory przy pomocy nożyczek.

Mając gotową podstawkę, mogłem kontynuować testy. Szybko okazało się, że trzeba dodać osłonę, bo filament przepuszcza światło i fototranzystor łapie światło bezpośrednio z diody IR, a nie po odbiciu od przeszkody. Nad fototranzystorem umieściłem więc tymczasowo kawałek termokurczki. Przy otworze od diody nie było tyle miejsca, żeby ją wcisnąć. Docelowo może wymyślę coś lepszego.

Fakapy

Nie obyło się bez ofiar. Podczas testów po raz kolejny uszkodziłem lipola przez zbyt duże rozładowanie. Muszę w końcu napisać porządną procedurę ochrony baterii i dodawać ją do każdego testowego programu. Chwilę po wymianie baterii posłuszeństwa odmówił również procesor. Niedługo po uruchomieniu, w losowych momentach wchodził do hardfaulta. Tą samą binarkę używałem już od dłuższego czasu, więc sugeruje to uszkodzenie procesora, lub jakiś błąd hardwareowy. Sądząc po wcześniej znalezionych błędach w lutowaniu, będę musiał dokładnie przyjrzeć się połączeniom.

Dalsze plany

Przede wszystkim muszę znaleźć przyczynę błędnego działania procka. Nie wiem ile mi na to zejdzie. Możliwe nawet, że jest uszkodzony i będę musiał przelutować całą płytkę. Potem czeka mnie zabawa z kalibracją czujników, czyli dobraniu odpowiednich współczynników do przeliczania wartości odczytanych z ADC na odległość. Będę musiał też zaimplementować obliczenia odległości w tasku czujnika ścian.