GAndaLF Napisano Grudzień 23, 2017 Udostępnij Napisano Grudzień 23, 2017 Już od dłuższego czasu po godzinach pracuję nad robotem micromouse. Udało mi się osiągnąć już całkiem fajne rezultaty, więc w końcu przyszedł czas, żeby się pochwalić na Forbocie. Kiedyś bardzo wczesna wersja robota miała już tutaj swoje 5 minut grając kolendy na silnikach: Z tym projektem zająłem również 12 miejsce w konkursie Daj Się Poznać 2017 polegającym na prowadzeniu bloga technicznego i rozwijaniu projektu IT Open Source. Zamysł był taki, aby stworzyć robota Micromouse, który nie tylko wie w jakiej znajduje się komórce labiryntu, ale określa swoją pozycję co do milimetra używając Filtru Kalmana. Moim celem nie było jak najszybsze stworzenie konstrukcji biorącej udział w zawodach, tylko spokojne dopieszczanie algorytmów sterowania. Projekt rozwijam jako open source, na moim GitHubie można znaleźć aktualny kod źródłowy, schematy w Eagle, czy skrypty symulacji: https://github.com/ucgosupl/mm_legend_v2 Przy aktualnej wersji robota coś już dłubię prawie od początku tego roku, ale różnie to bywa z czasem. Wcześniej robiłem jakieś prototypy na innym sprzęcie i nie bardzo to wtedy wychodziło. Więcej na ten temat można przeczytać tutaj: http://ucgosu.pl/2017/01/micromouse-podejscie-drugie/ No a teraz do rzeczy. Mechanika Robot jeździ na 4 kołach napędzanych dwoma silnikami. Nie ma dodatkowych punktów podparcia, a prześwit to 2mm. To trochę mało, ale nie udało się uzyskać większego przy posiadanych silnikach i oponach. Przy nierównym labiryncie robot może więc polec na łączeniach płyt. ➡️ 2 Silniki Faulhaber 1717T006 z enkoderami IE16 ➡️ 4 koła na felgach z drukarki 3D z oponami Mini-Z ➡️ Mocowania silników z drukarki 3D ➡️ Zębatka na wale silnika metalowa 10 zębów ➡️ Zębatka na feldze plastikowa 40 zębów ➡️ PCB jako podwozie robota, wymiary 100x80 mm - daje możliwość jazdy po skosach Więcej o częściach z drukarki 3D: http://ucgosu.pl/2017/02/mocowania-silnikow-drukarki-3d/ Koła obracają się na śrubach M3, które przechodzą przez mocowanie silników i są dokręcone nakrętką z drugiej strony. Śruba i nakrętka są zalane dużą ilością kleju do gwintów. Po długich walkach udało się w końcu osiągnąć fajne dopasowanie elementów. Koła obracają się bez oporów. Elektronika ➡️ STM32F401RB - 128kB FLASH 64kB RAM ➡️ TB6612 ➡️ moduł MinIMU v5 wpinany na goldpiny ➡️ moduł Bluetooth wpinany na goldpiny ➡️ ULN2003 do wzmacniania sygnałów na diody ➡️ 6 czujników ścian - pary dioda IR, fototranzystor (jeszcze nie wlutowane) ➡️ Bateria LiPo 2S 150mAh ➡️ Przetwornica ST1S10PHR 7.4V z baterii -> 5V na diody IR ➡️ Stabilizator LM1117 5V -> 3.3V na zasilanie logiki Zastosowanie modułów wpinanych na goldpiny mocno uprościło tworzenie i lutowanie płytki. Na dłuższą metę też zmniejszyło koszty i ewentualne problemy z dostępnością czujników. Diody IR będą często przełączane i może przez nie płynąć dość spory prąd powodując zakłócenia. Dlatego odseparowałem je od zasilania logiki. Schemat ideowy: PCB: Jak kogoś interesuje więcej szczegółów dotyczących schematu: http://ucgosu.pl/2017/03/schemat-ideowy-robota/ Oprogramowanie Jak wspomniałem wcześniej, cały kod programu udostępniam na GitHubie. Zaczynając pisanie kodu miałem taką koncepcję architektury: A tutaj dodatkowy opis dla zainteresowanych: http://ucgosu.pl/2017/04/architektura-systemu/ Obsługę peryferiów piszę bezpośrednio na rejestrach, nie używam żadnych bibliotek STMowych typu StdPeriph, HAL, czy Cube. Nie używam również projektów w żadnym IDE, a build działa na własnych makefileach. W skład projektu wchodzi wiele targetów testowych, pozwalających mi odpalać na sprzęcie niezależne programy np. do strojenia PIDów na silniki. Mam też skonfigurowane unit testy, ale na razie robiłem rzeczy związane z hardware i jeszcze ich nie używałem. Całość działa na FreeRTOSie, używam też biblioteki matematycznej libfixmatrix przerobionej na liczby float. Mam już zaimplementowane regulatory PD prędkości postępowej i obrotowej, oraz Rozszerzony Filtr Kalmana. Wszystko działa na floatach, procesor ma do nich wsparcie hardwareowe i na razie nie zaobserwowałem problemów z niewyrabianiem się. Regulator prędkości postępowej: http://ucgosu.pl/2017/08/projekt-regulatora-obrotow-silnika/ Regulator prędkości obrotowej: http://ucgosu.pl/2017/11/regulator-predkosci-obrotowej/ EKF: http://ucgosu.pl/2017/12/ekf-rozszerzony-filtr-kalmana/ Zaimplementowany Filtr Kalmana działa bardzo ładnie. Po rozszerzeniu modelu stanowego o dryft symulacje dawały obiecujące rezultaty: Działanie w rzeczywistości nie jest takie proste do zweryfikowania. Aktualnie używam miarki do sprawdzania, czy zebrane dane pokrywają się z rzeczywistą trajektorią robota. A samo oszacowanie trajektorii wygląda tak: Przejazd testowy z zadaną prędkością postępową i obrotową: W następnej kolejności będę chciał skalibrować czujniki ścian. W tym celu posłużę się testowym labiryntem, który dostałem od Trekera: co ciekawe jestem trzecim forumowiczem, który jest właścicielem tego labiryntu, wcześniej należał on jeszcze do mog123. Mając odczyty z czujników ścian będę chciał zmodyfikować EKF tak, aby je uwzględniał. Będzie to dosyć ciekawy problem, ponieważ nie zawsze ściany zostaną wykryte. Potem zostaną jeszcze rozwiązywanie labiryntu i zadawanie prędkości. Cytuj Link do komentarza Share on other sites More sharing options...
deshipu Grudzień 23, 2017 Udostępnij Grudzień 23, 2017 Wygląda bardzo obiecująco! Jestem bardzo ciekaw jak wyjdzie użycie IMU zamiast zwykłych enkoderów. Cytuj Link do komentarza Share on other sites More sharing options...
GAndaLF Grudzień 23, 2017 Autor tematu Udostępnij Grudzień 23, 2017 Enkodery też używam - IE16 do faulhaberów. Już nawet odczułem ból związany z ich za małą rozdzielczością. Przy usuwaniu dryftu żyroskopu drugi pomiar prędkości obrotowej jest właśnie na bazie enkoderów. I różnica 1 ticka przekłada się na dość dużą zmianę prędkości kątowej w stopniach na sekundę przez co musiałem się trochę nagimnastykować z usuwaniem dryftu. Cytuj Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Grudzień 23, 2017 Udostępnij Grudzień 23, 2017 GAndaLF, super widzieć ten projekt na Forbocie! Czekam na aktualizacje, mam nadzieję, że nareszcie ten labirynt zostanie przez kogoś w pełni wykorzystany 😉 Cytuj 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
GAndaLF Luty 11, 2018 Autor tematu Udostępnij Luty 11, 2018 W ostatnim czasie toczyłem walkę z czujnikami ścian. Wyniki są bardzo obiecujące. Czujnik ściany składa się z diody IR i fototranzystora. Głównym problemem konstrukcyjnym, jaki trzeba rozwiązać jest unieruchomienie elementów w konkretnej pozycji. Najlepiej takiej, która gwarantuje dotarcie maksymalnej ilości odbitego światła diody do fototranzystora dla zadanej odległości. Pozycja elementów nie powinna się zmieniać podczas testowania robota np. po uderzeniu o ścianę. Kiedyś eksperymentowałem z klejem na gorąco, ale nie byłem zadowolony z rezultatów. Aktualny "state of the art" to uchwyty wydrukowane w 3D i takie właśnie rozwiązanie wybrałem. Idealna odległość czujnika od ściany dla jakiej projektowałem podstawkę to 10 cm. Znając tą odległość oraz odległość między fototranzystorem a diodą można obliczyć optymalny kąt nachylenia za pomocą trygonometrii. W moim przypadku były to 4 stopnie. Projekt podstawki wygląda tak: Wydrukowane elementy tak: A zamontowane na robocie tak: Mając gotowy czujnik mogłem przystąpić do kalibracji. W tym celu użyłem jednej ściany labiryntu i miarki zrobionej z kartki. Mierzyłem odczyt ADC dla odległości co 1 cm. Zmierzone wartości były wysyłane przez Bluetooth na terminal. Wzór matematyczny opisujący zależność między odległością a napięciem uzyskałem używając Matlaba: Na podstawie wzoru wygenerowałem lookup table z odległościami w mm dla każdej możliwej wartości zmierzonej przez ADC. Wyniki są po prostu niesamowite. Dokładność rzędu 1 mm dla szerokiego zakresu badanych odległości. Aktualny kod źródłowy można znaleźć na moim githubie: https://github.com/ucgosupl/mm_legend_v2 Pomiar odległości na razie nie uwzględnia faktu, że różne ściany mogą mieć inne współczynniki odbicia. Będzie to trzeba kalibrować w runtimie mierząc napięcie dla znanej odległości. W najbliższym czasie będę musiał zaprojektować nowe PCB, bo czujniki diagonalne po zamontowaniu podstawki wchodziłyby w pole widzenia czujników frontowych. I tak miałem wprowadzić kilka innych zmian na PCB więc dobrze się złożyło. Tym bardziej, że wczoraj na robota wylała mi się woda. Szczegółowy opis prac: http://ucgosu.pl/2018/01/czujniki-scian-pierwsze-starcie/ http://ucgosu.pl/2018/02/kalibracja-czujnika-sciany/ http://ucgosu.pl/2018/02/nowy-projekt-plytki-robota/ Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!