Skocz do zawartości

maciejzj

Użytkownicy
  • Zawartość

    3
  • Rejestracja

  • Ostatnio

Reputacja

9 Neutralna

O maciejzj

  • Ranga
    1/10

Ostatnio na profilu byli

Blok z ostatnio odwiedzającymi jest wyłączony i nie jest wyświetlany innym użytkownikom.

  1. @Treker Robot był skonstruowany na zliczenie przedmiotu Systemy Mikroprocesorowe. Prowadzący kazał zrobić coś w tematyce przedmiotu, z ograniczonym budżetem. Jeśli ktoś zdecydował się wykonać robota to budżet szybko dochodził do limitu, bo koszt procesora, silników, czujników i jakiejś platformy mechanicznej robią swoje. Po konstrukcji prototypu okazało się, że bez implementacji dodatkowych algorytmów sterowania robot jest mało precyzyjny, więc zacząłem szukać w książkach sposobów na poprawę jego działania. Dodam ich krótki opis. Utrzymywanie kierunku jazdy Jeżeli zbudujemy robota napędzanego silnikami prądu stałego i każemy mu jechać do przodu to szybko przekonamy się, że wcale nie jest łatwo sprawić że konstrukcja pojedzie po linii prostej. Tanie silniki są wykonane w sposób mało powtarzalny i wysterowanie ich w ten sam sposób niekoniecznie sprawi że będą kręciły się z tą samą prędkością. Rozwiązań problemu jest wiele; najprościej pobawić się chwilę i znaleźć na oko różnicę w sterowaniu silnikami która sprawi że ich prędkość będzie mniej więcej taka sama. Takie rozwiązanie może być zawodne wraz z rozładowywaniem baterii i zmianą wagi robota. Ja zdecydowałem się synchronizować prędkość kół robota na podstawie odczytów z enkoderów szczelinowych. Synchronizację można przeprowadzić na wiele sposobów i stosować różne mniej lub bardziej rozbudowane regulatory. W robocie są dwa silniki i jeden z nich wybrałem jako master, a drugi jako slave. Na podstawie odczytu z enkoderów silnika master narzucana jest prędkość silnika slave. Mechanizm synchronizacji widać na schemacie, alfa to ilość zliczonych szczelin na enkoderze, omega to prędkość obrotów koła. Implementacja algorytmu wymaga paru przekształceń schematu, żeby ideę łatwo przenieść na kod. Obrót o zadany kąt Kolejna sprawa to stworzenie funkcji która sprawi że robot obróci się wokół własnej osi o zadany kąt. Tu najlepiej zastosować zagnieżdżony regulator, podobny do takich jak stosowane w serwomechanizmach. Prosty wariant takiego regulatora, który znajduje się w robocie widać na schemacie. Beta to zadany kąt obrotu platformy, funkcja f oblicza ilość szczelin które muszą być zliczone, aby platforma obróciła się o kąt beta. Indeksy w oznaczają wartość zadaną. Kiedy kupujemy gotowy serwomechanizm (np. na Botlandzie) to w środku najprawdopodniej znajduje się układ realizujący podobny algorytm (często dodaje się trzeci poziom zagnieżdżania do regulacji prądu płynącego przez uzwojenia silników). Zagnieżdżenie dwóch stopni regulacji pozwala na płynny i precyzyjny obrót. Regulator proporcjonalny położenia zapewnia że silniki obrócą się o zadaną liczbę szczelin. Wyjście regulatora P to prędkość jaką powinny mieć silniki, żeby w efekcie obrócić się w pożądany sposób. Ta prędkość jest wartością zadaną regulatora PI prędkości. W skrócie: regulator P ustala jaka prędkość silników jest potrzebna żeby wykonać obrót, a regulator PI dba żeby silniki faktycznie miały taką prędkość. Identyfikacja silników To dodatkowa rzecz, która może się przydać jeżeli chcemy mieć precyzyjnie nastrojone regulatory. Aby zidentyfikować silniki podałem na nie skok jednostkowy i logowałem przez USB ilość zliczonych szczelin w czasie ich startu. Pomiar wykonałem dla silników bez obciążanie (koła kręcą się w powietrzu) i z obciążaniem (robot jedzie na kołach). Można się domyślić że wykresy będą odpowiedzią układu całkującego i tak faktycznie jest. Z elektrotechniki wiemy jak wygląda wzór transmitancji takiego układu. W MATLABie można dopasować prostą do wykresów odpowiedzi silników, a z tej prostej odczytać stałą czasową (darowałem sobie wzory, ale oczywiście są w raporcie). Jeżeli chcemy taki obiekt sterować regulatorem PI to mamy dosyć proste transmitancje, całość można analizować do woli. Ja pobawiłem się w przekształcenie połączonej transmitancji regulatora i silników do postaci, z której łatwo wykreślić linie pierwiastkowe w MATLABie. Wzór wygląda tak: Możemy wykreślić dwie wersje linii pierwiastkowych, w zależności czy zero regulatora (symbol c) jest mniejsze czy większe od stałej czasowej silnika (symbol T). Dostajemy takie wykresy: I mamy mapę tego jak będzie się zachowywał regulator w zależności od wzmocnienia. Teraz możemy wybrać, który wariant linii chcemy (wybieramy c, a przez to stałą całkowania), a potem wzmocnienie regulatora (trzeba wskazać punkt na liniach pierwiastkowych, a MATLAB po kliknięciu powie jakie w tym miejscu jest wzmocnienie). Jeżeli znamy teorię analizy zer i biegunów na płaszczyźnie zespolonej to możemy zdecydować czy chcemy szybki czy wolny regulator (szybki to punkt mocno po lewej wykresu, wolny bliżej osi imaginaris) oraz wybrać takie wzmocnienie, żeby w układzie nie było oscylacji (punkty na osi realis). Co z tego wynika Jak napisałem wcześniej na początku projektu w ogóle nie planowałem zajmować się algorytmami regulacji w robocie. Szybko okazało się, że jeśli chce się zyskać precyzje ruchów to warto pobawić się z układami sterowania. Wtedy zaskoczyłem się tym ile wiadomości z teorii sterowania i podstaw automatyki może mieć zastosowanie w takim robocie. Jeśli ktoś siedzi w temacie sterownia robotami mobilnymi to pewnie widzi, że to raczej podstawowe algorytmy, ale wydaje mi się że to fajny zestaw na początek. Teraz staram się opracować pełny zestaw algorytmów fuzji danych, odometrii, i sterowania robotem w różnych układach odniesienia (ale to już inny projekt). Jeśli chce się iść w takim kierunku to warto sięgnąć po środowisko ROS, bo tam mamy dostęp do narzędzi Linuxa i wielu gotowych paczek, na których można się wzorować, albo które można bezpośrednio wykorzystać.
  2. Robot unikający przeszkód z regulacją napędu silników prądu stałego Cześć! Ponad rok temu skonstruowałem w ramach przedmiotu na studiach robota unikającego przeszkody. Po czasie pomyślałem, że konstrukcją warto podzielić się na Forbocie. Zakres projektu Robot porusza się na dwóch kołach i omija przeszkody wykrywane za pomocą czujnika ultradźwiękowego. Dużo pracy włożono w sterowanie silnikami prądu stałego, które stanowią napęd robota. Mimo że zakres zachowań platformy nie jet zbyt szeroki, to wartość projektu leży w algorytmach teorii sterowania, które skonstruowano by zwiększyć precyzję ruchów. W zakres prac projektowych weszły: projekt platformy robota i jej wykonanie w technologii druku 3D (Fusion 360), projekt układu drukowanego z mikroprocesorem Atmega32u4, mostkiem H oraz paroma innymi peryferiami (Autodesk Eagle), oprogramowanie robota pozwalające na wykrywanie i omijanie przeszkód (biblioteki i bootlader Arduino), konstrukcja pętli sprzężenia zwrotnego dla silników oparta na użyciu enkoderów szczelinowych, algorytm regulatora PI do synchronizacji prędkości kół przy jeździe na wprost (poprawia utrzymanie kierunku jazdy), algorytm zagnieżdżonego regulatora obrotu platformy o zadany kąt (algorytm podobny jak ten stosowany w serwomechanizmach), prosta identyfikacja parametrów transmitancji użytych silników i trochę rozważań na temat możliwości strojenia regulatorów przy pomocy metody linii pierwiastkowych. W ramach zaliczenia projektu powstał dosyć długi raport, gdzie jest opisane jak zrealizowano poszczególne części projektu, dlatego nie ma chyba potrzeby przedstawiać w poście szczegółów po raz drugi. Gdyby ktoś szukał informacji o przenoszeniu swojego projektu z Arduino na własną płytkę PCB (z działającym USB na Atmedze32u4), konstrukcji systemów regulacji w praktyce, czy budowy własnych serwomechanizmów to można tam znaleźć działające przykłady. Kod projektu i dokumentację można znaleźć na GitHubie. Oczywiście projekt nie jest idealny, szczególnie że powstał już jakiś czas temu, a wraz ze zdobywaniem doświadczenia dostrzega się coraz więcej błędów. Na koniec dorzucam parę grafik i gifów, więcej można znaleźć w podlinkowanym raporcie i repozytorium. Ujęcia na robota z różnych stron Wierzchnia strona płytki PCB, spód oraz schemat elektryczny w raporcie Utrzymywanie kierunku jazdy Obrót o zadany kąt
  3. Cześć Warning o którym pisze kolega elektrokam92 można wyeliminować robiąc w wywołaniu funkcji rzutowanie na oczekiwany typ: (const uint8_t*)”Hello world!” po dodaniu rzutowania nie mam żadnych warningow/błędów, program kompiluje się bez problemów (z załączonymi bibliotekami), ale z wyświetlaczem nie dzieje się nic, próbowałem zmienic kolor czyszczenia tła na RED, żeby sprawdzić czy ta funkcja działa, ale to też nie przyniosło efektu. Czy ktoś może potwierdzić, że postępując dokładnie według kursu w sierpniu 2018 roku wszystko zadziałało? Nie wiem czy mam dalej szukać mojej pomyłki, czy od czasu publikacji coś się zmieniło.
×
×
  • Utwórz nowe...