podstawy: Serial + LEDy

Podstawy Arduino

LED-y podłączone do Arduino: pinMode(), digitalWrite(), delay() – trzy funkcje, a ile radochy!

Maskotka

Sterowanie bezprzewodowe (PP) – działa! Mimo to pojazd jeździ bokiem, bo silniki pracują nierówno oraz mechanika kuleje…

podstawy: LED + Arduino IDE

Podstawy Arduino

1x LED + Arduino: setup(), loop(), pinMode(), digitalWrite(), delay() – zaczyna się zabawa…

Maskotka

Projekt wraca na trapetę – ale najpierw trzeba to spowrotem uruchomić, a tu przewody się rozłączyły, radiówka nie działa…. Brawo dla PP + BB za reaktywację Maskotki!

Spotkanie organizacyjne 19.10.2020, godz. 16:00

Zapraszam na spotkanie organizacyjne koła. Ustalimy godziny regularnych spotkań, tematykę, poznamy zainteresowania uczestników oraz wymienimy się pomysłami na tegoroczne projekty. Zapraszam wszystkich studentów fizyki – także tych, którzy jeszcze nie mieli doświadczenia z platformą Arduino (na niej będziemy się koncentrować).

Jeśli więc jesteś studentem fizyki ogólnej/medycznej – także czuj się zaproszony. Z pewnością poznasz przydatne narzędzia do przeprowadzania doświadczeń z wykorzystaniem komputera (a właściwie komputera + mikrokontrolera, czyli Arduino).

Oczekuję otwartości i chęci poznawania nowych rzeczy. Przejrzyj zrealizowane projekty koła i przekonaj się, czy Cię to interesuje.

Kiedy? środa 14.10.2020, godz. 11:15, pokój 2045
(nowy termin) poniedziałek 19.10.2020, godz. 16:00, sala 1064

Opis algorytmu PD

Z tego wpisu dowiesz się:

  • Jak płynnie podążać za linią?
  • Jak przetwarzać sygnały z czujników by sterować szybkością poszczególnych silników?
  • Co to jest tzw. „pętla zwrotna”?

A wszystko po to, by oprogramować Line Followera (w skrócie LF)!

Regulator PD to “ucięta” wersja regulatora PID (ang. Proportional-Integral-Derivative). Posłuży nam on do płynnego sterowania linefollower’em. Regulator ten posiada 3 człony:
liniowy (P),
całkowy (I),
różniczkowy (D).

Człon P odpowiada za to, jak szybko silniki LF’a będą się obracać na podstawie położenia linii. Jeżeli linia będzie po prawej stronie czujnika to robot “wie”, że musi skręcić w tym kierunku i zmniejszy szybkość prawego silnika (lub zwiększy prędkość lewego, ale z reguły lepiej zastosować to pierwsze rozwiązanie). Jednak sama zależność liniowa nie wystarcza, żeby płynnie podążać za linią (chyba, że bardzo powoli). Żeby “przewidzieć” zmiany w kierunku ruchu i odpowiednio na nie zareagować przydaje się nam człon D regulatora. Jest to prosta różnica pomiędzy poprzednią a aktualną pozycją linii. W przypadku prostej linii różnica będzie nieznaczna, a podczas nagłej zmiany kierunku robot szybciej zmieni szybkość silników. Człon I pomijamy, bo nie jest on zbyt ważny w przypadku linefollower’ów (z doświadczenia).

Może i jest to na początek trochę skomplikowane, ale implementacja jest bardzo prosta i nie wymaga zbyt wiele pisania:

error_P = pozycja_linii * KP; // zależność liniowa
error_D = (pozycja_linii - poprzednia_pozycja_linii) * KD; // różnica pomiędzy pomiarami
Error = error_P + error_D; // suma członów regulatora
poprzednia_pozycja_linii = pozycja_linii;

Uzyskany w ten sposób Error możemy bezpośrednio wykorzystać do ustawienia prędkości silników. Współczynniki KP i KD określają jaki wpływ mają poszczególne człony na ruch LF’a i będą się znacząco różnić w zależności od algorytmu wykrywania pozycji linii czy samej budowy robota (np. pozycji czujnika). Właśnie w konkretnych wartościach KP, KD leży sekret działania dobrego regulatora PID. Żeby uzyskać płynny ruch trzeba się trochę “pobawić” z tymi współczynnikami i znaleźć najlepsze wartości. Można znaleźć wiele metod strojenia takiego regulatora (np. Metoda Zieglera-Nicholsa), jednak w tym przypadku najprościej jest to zrobić ręcznie czyli metoda prób i błędów, eksperymentalnie zmieniając KP i KD i sprawdzając na torze jak to wpływa na ruch LF.

Na początku ustawiamy KD = 0, i szukamy najmniejszego KP, żeby robot przy małej prędkości w miarę dobrze podążał po prostej linii lub lekkim łuku. Po znalezieniu odpowiedniego KP możemy stopniowo zwiększać współczynnik KD i prędkość, do uzyskania płynnego ruchu. Jako, że różnice w pomiarach są stosunkowo małe w porównaniu do położenia linii, często następuje zależność: KD > KP.

Określanie pozycji linii, wspólne działanie 5-ciu czujników

Jak przy pomocy wielu czujek jednoznacznie określić, gdzie znajduje się linia? Każda czujka zwraca tylko informację o ilości odbitego światła (wartości od 0 do 1023). Można by zastosować algorytm który wybiera jedną pozycję z największą wartością ale prowadzi on tylko do niepłynnego ruchu. Powinniśmy zastosować bardziej precyzyjny algorytm wykrywania linii ze średnią ważoną.

Każdemu czujnikowi przypisujemy wagi, na których postawie będziemy określać pozycję (np. -2000, -1000, 0, 1000, 2000 dla kolejnych czujek). Następnie czytamy wartości z czujników, mnożymy je razy wagę i sumujemy. Na koniec dzielimy otrzymaną wartość przez sumę wartości z czujek. W ten sposób dokładną informację nawet kiedy linia znajduje się na granicy dwóch czujników.

pozycja = (cz1*waga1+cz2*waga2+cz3*waga3+cz4*waga4+cz5*waga5)/(cz1+cz2+cz3+cz4+cz5)

W przypadku zastosowania wag: -2000, -1000, 0, 1000, 2000 dla kolejnych czujników, po przeliczeniu średniej ważonej otrzymamy jedną wartość od -2000 do 2000 (dla -2000 linia znajduje się po lewej stronie, dla 0 – na środku, a dla 2000 – po prawej).

Sterowanie prędkością silników

Jak wykorzystać wcześniej otrzymany Error do sterowania prędkością silników? Do ustawienia prędkości pojedynczego silnika używamy sygnału PWN. Będziemy tą wartość zmieniać w zależności od uzyskanego Error’a.

Jeżeli wartość Error’a jest ujemna to w naszym przypadku pozycja linii znajduje się po lewej stronie LF’a. Aby skorygować ruch będziemy zmniejszać prędkość lewego silnika. Analogicznie postępujemy w przypadku dodatniej wartości:

if(Error > 0){
pwn1=maxSpeed; //maxSpeed to wczesniej ustalona maksymalna wartość PWN LF’a
pwn2=maxSpeed-Error;
} else {
pwn1=maxSpeed+Error;
pwn2=maxSpeed;

Warto pamiętać, że Error może być znacznie większy od wartości maxSpeed. Jeżeli wartość nowego pwn1 lub pwn2 jest mniejsza od 0 to musimy ją ustawić na 0 (pwn powinien wynosić od 0 do 255). Po tych wszystkich operacjach uzyskujemy pwn’y do sterowania silnikami.

Mój LF w akcji:

(c) Bytler, 2019

 

Line Follower — własne podwozie

Byłem zmuszony odwołać dzisiejsze zajęcia (natłok pracy przed końcem roku! przepraszam).

Pan Bartek pobawił się w zaprojektowanie podwozia (blender.org) i oto jego rezultaty:

A co to ten wystający „pypeć”? To trzecie koło 😉 taki ślizgacz (z założenia pojazd ma poruszać się równej nawierzchni, stole, podłodze z namalowaną/przyklejoną czarną linią). Pan Bartek nie lubi kręcić (kołami), dlatego je zakleja lub produkuje „pypcie” 😉

Mamy lekkie kłopoty z naszą drukarką Zoltrax Z200, więc wydruk nie wyszedł jak należy… ale ciągle nadaje się do wykorzystania!

Po Świętach zobaczymy, jak to wszystko działa w praktyce! A skoro o Świętach mowa, to życzę Wszystkiego najlepszego każdemu Fi-BOTowiczowi. Do zobaczenia po przerwie (8 styczeń).

(c) K.G. 2018

Maskotka, Line Follower oraz podstawy

Pracujemy w trzech płaszczyznach (3D? hmmmm)

line follower, podstawy

  • podstawy (PWM, serwo silnik)
  • 3x czujka TCRT5000: Pan Bartek zlutował sobie moduł i zbudował PIERWSZEGO line followera (GRATULUJĘ!):
    • powyżej zastosowano nowatorskie rozwiązanie: czujki TCRT działają CYFROWO, ale zapamiętywana jest HISTORIA pomiarów (cyklicznie, 10 odczytów) a DECYZJA o zwrocie robocika podejmowana jest na podstawie UŚREDNIENIA historii – ciekawe rozwiązanie! Wszystko jest raczej tymczasowe, bo jest zamiar przeprogramowania układu – odczytywanie czujek analogowo, co poprawi dynamikę robota. Problemy techniczne – toporne koła i silniki – rozwiązujemy przez wymianę podzespołów na inne (zestaw silniczków i kół Pololu – niebawem w akcji)

(c) K.G. 2018