Skocz do zawartości

[Micromouse] Legend


Pomocna odpowiedź

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.

20171207_011449.thumb.jpg.513a649e4ef9196a9ef56acd1e07221a.jpg

Link do komentarza
Share on other sites

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.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

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/

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.