Zajęcia nr 9 (ostatnie) – Dzień Ojca Robota!

Dzień Ojca „Robota”!

Dziś w ten szczególny dzień (primo: Dzień Ojca, secundo: nasze ostanie spotkanie w Talentach XXIw!) zbudowaliśmy naszego pierwszego mobilnego robota. Uczestnicy kursu zostali więc ojcami swoich mechanicznych zabawek sterowanych pilotem od TV 😉 Gratulacje!

Wykonanie robota polegało najpierw na złożeniu przygotowanych części – hardware w hardcorowym wykonaniu (opis zestawu z fotkami tutaj). Warte jednak zapamiętania jest jedno: nie trzeba kupować (dość) drogich zestawów allegrowych typu platforma robota jezdnego za (bagatela) 40-90 zł (…plus wysyłka) aby rozpocząć przygodę z robotem. Wystarczy płyta pilśniowa (tzw. plecki od szafek), kątownik (trafiłem na taki pasujący do naszych kół!) oraz wkrętarka aby stworzyć pojazd! Do tego warto zaopatrzyć się w garść śrub (w naszym przypadku: fi – czyli średnica – 3mm, długość – 8mm, 12mm oraz 35mm – raptem 3 rodzaje) oraz podkładki z nakrętkami zakupione w Krometcie (uwaga: wpis zawiera lokowanie produktu 😛 a może po prostu dzielę się z Wami fajnymi sklepami?)http://www.kromet.bialystok.pl/templates/kromet_34/images/header-object.pngaby za kwotę mniej niż 5 zł stworzyć platformę, którą możemy dopasować do swoich potrzeb (proszę – porównaj to z ceną podobnych platform, wykonanych z pleksiglasu i dostępnych w serwisach aukcyjnych). To był pierwszy krok.

Drugi krok to połączenie elementów elektroniki sterującej pojazdem. Uczestnicy kursu wykazali się zrozumieniem działania modułu L298N (sterownik silników) oraz TSOP2236 (odbiornika podczerwieni), poznanych wcześniej na naszych zajęciach. Podłączyli wszystko do Arduino UNO i … stworzyli pojazd, który jeździł i obracał się według rozkazów wysyłanych z pilota od TV!

Trzeba przyznać, że to dopiero początek przygody z robotyką. Nasz kurs w ramach Talentów XXIw się kończy, ale (mam nadzieję) Wasza przygoda z informatyką-elektroniką-fizyką dopiero się zaczyna!

Warsztaty „Z fizyką w przyszłość”

Osoby wytrwałe do końca kursu zachęcam do pilnego śledzenia naszego profilu na FB i nasłuchiwaniu o nadchodzącej inicjatywie Wydziały Fizyki UwB „Z fizyką w przyszłość”, gdzie będzie kurs Arduino. Warsztaty rozpoczną się w październiku 2016 r. więc nie przegapcie zapisów, specjalnie dla Was przygotuję grupę zaawansowaną. A jeśli nie chcecie bawić się w mój zestaw z płyty pilśniowej to zapraszam na warsztaty z modelowania i druk 3D – także w cyklu „Z fizyką w przyszłość” (pamiętajcie: październik 2016!).

Wakacyjne projekty?

Jeszcze raz gratuluję wytrwałości na moich zajęciach oraz pracowitości (choć przyznać muszę, że… 1) prac domowych mógłbym otrzymywać więcej, oraz 2) trzeba robić notatki!). Cieszy mnie Wasz entuzjazm, gdy sterowaliście swoim własnym pojazdem! Dziękuję za wspólnie spędzony czas i… zapraszam do chwalenia się własnymi robo-osiągnięciami w wakacje (macie pytanie odnośnie tematu? zakupów? proszę słać do mnie emaile).

K. Gawryluk

Zajęcia nr 8 – LCD16x2 oraz… zdalnie sterowany POJAZD!

LCD 16×2  (na sterowniku HD44780)

16x2-Character-LCDWłaściwie niezbędny element, jeśli chcemy stworzyć mobilnego robota na płytce Arduino. W końcu zależy nam, aby „odczepić” się od komputera i portu szeregowego, ALE  ciągle chcemy, aby Arduino do nas gadało 😉 Może to być stacja pogody, wyświetlająca na ekraniku aktualną temperaturę/ wilgotność/ prędkość wiatru/ cokolwiek (i nie musimy mieć podłączonego kompa!)…. może to być też pojazd na kółkach, którym sterujemy pilotem od TV  – poznanym na naszym poprzednim spotkaniu. Wystarczy teraz połączyć wszystko do kupy (wraz ze sterownikiem silników – modułem L298D) i mamy zabawę! Warto wspomnieć, że sterownik ekraniku HD44780 obsługiwany jest przez bibliotekę LiquidCrystal — powinna być domyślnie zainstalowana w Arduino IDE.

Poznany sposób podłączenia tego wyświetlacza angażował aż 6 pinów cyfrowych z Arduino – to dość dużo. Mogę dopowiedzieć, że istnieją inne sposoby obsługi tego wyświetlacza – przez protokół I2C – wymagające tylko 2 przewody… Wymagany do tego jest konwerter (za kwotę ~8.5zł, co jest dość sporo przy cenie samego wyświetlacza za ~10zł). Ale to opowieść na inną okazję.

millis()

Przekonaliśmy się także o tym, że funkcja millis() – zwracająca liczbę milisekund od czasu uruchomienia Arduino – jest bardzo użyteczna. Warte zapamiętania jest także dyskusja typów danych do przechowywania wartości milisekund – przy odpowiednim doborze mamy zmienną całkowitą, bez znaku i to 4-ro bajtową, gotową do zapisywania czasu 40-tu iluś tam dni w milisekundach właśnie. Chodzi oczywiście o typ unsigned long.

Liczba pi (3.141592…)

Na naszych zajęciach dużo się dzieje… Aby trenować wyświetlanie na ekraniku wyliczyliśmy liczbę pi ze wzoru Leibniza:

\sum _{{n=0}}^{{\infty }}{\frac {(-1)^{{n}}}{2n+1}}={\frac {1}{1}}-{\frac {1}{3}}+{\frac {1}{5}}-{\frac {1}{7}}+{\frac {1}{9}}-\cdots ={\frac {\pi }{4}}

I choć kod liczący tego typu wyrażenia okazał się prosty, to jednak jego zrozumienie już takie oczywiste nie było. Wypada pochwalić jednego uczestnika – Mariusza z 2LO Bstok, który napisał własny algorytm poprawnie liczący tą liczbę, cechujący się lepszą wydajnością niż mój szkoleniowy. Gratuluję!

Pilot TV + koła + ekranik = pojazd na trzech kółkach!

Przychodzi najciekawszy etap naszych zajęć – łączymy wszystkie poznane elementy w jeden projekt. Pochwalę Łukasza i Mateusza z ZSM CKP#2 za wytrwałą pracę i złożenie pojazdu, a następnie jego (proste) oprogramowanie.

DSC_1339DSC_1340

Pojazd śmigał całkiem żwawo po podłodze (8x paluszki AAA to za duże napięcie jak na te silniki, ale…) i sterowany był pilotem na podczerwień. Na kolejnym spotkaniu uczniowie oprogramują maszynę w nowy sposób – mam nadzieję 😉

DSC_1341Inni męczyli się jeszcze ze sterowaniem pojedynczym kołem przez pilot TV – mam nadzieję, że to „męczenie” było całkiem przyjemne i zachęcające do naszego następnego spotkania, za tydzień. Na nim wszyscy stworzą swojego pierwszego mobilnego robota. Zapraszam!

Ostatnie zajęcia 23-06-2016, 16:00

na nasze ostatnie zajęcia proszę przynieście piloty od TV oraz dużo zapału do pracy (jak zawsze). Będą to także zajęcia podsumowujące, czyli miło by mi było widzieć osoby, które zapisały się na moje zajęcia a uczęszczały sporadycznie (nie wnikam w przyczyny) – będę ciekaw Waszych opinii o kursie. Dodatkowo zostaną przedstawione pozalekcyjne projekty Wydziału Fizyki dotyczące kształcenia młodzieży ponadgimnazjalnej w nadchodzącym roku szkolnym. Wakacje tuż tuż, może warto łyknąć inspirację i twórczo spędzić część lata w warsztacie robotycznym? Serdecznie zapraszam!

Zajęcia nr 7 – silnik DC, sterownik silnika L293 (plus moduł) oraz pilot na podczerwień

Silnik DC
silnik_dc

Typowa zabaweczka z Allegro… zaisilanie 6V, ale prądu pożera sporo (niektórym udało się to sprawdzić 😛 mierniki właśnie przeszły kolejny lift i możemy do tego wrócić, by każdy się o tym przekonał). Warto dodać, że przy obciążeniu (zatrzymywanie ręką koła), prąd wzrasta z ponad 100 mA do nawet 900 mA. Należy o tym pamiętać.

Sterownik L293N

Zaprzyjaźniliśmy się z nowym układem w obudowie DIP – od dziś jest naszym nowym kolegą 😉 Prosty w obsłudze a umożliwia: podłączenie zewnętrznego zasilania do silników (np. większego niż 5V z Arduino – jakieś akumulatorki…), sterowaniem dwoma silnikami DC, oraz sterowanie mocą silnika. Programowanie tego układu jest bardzo proste – o ile rozumiemy jak programować cyfrowe wyjścia Arduino, ale poto tyle czasu męczyliśmy się właśnie z LEDami i PWMami, aby taki L293 był bajecznie prosty. Warte zapamiętania jest sekwencja sterująca: dwa jednakowe sygnały oznaczają STOP, sygnały „zero” i „jeden” RUCH w jedną stronę, „jeden” i „zero” RUCH w drugą stronę. Proste. Dodatkowo zapoznaliśmy się z modmodul293bułem na bazie układów L293 (tutaj: L298) i pokazałem, jak się z nimi obchodzić (bateryjka + śrubokręt). Tutaj warto pamiętać o drobnych (acz istotnych) szczegółach z not katalogowych tych układów (przede wszystkim: maksymalny prąd pracy!).

Pilot na podczerwień – TSOP22xx

tsop22xx

 

Czyli wykorzystujemy bibliotekę IRLib wraz z czujką TSOP22xx. Ponieważ pożera ona bardzo mało prądu (jedynie 5 mA) zdecydowałem się pokazać Wam podłączenie jej bezpośrednio do płytki Arduino. Jedna nóżka czujki siedziała w GND, druga w pinie numer 13 (zasilanie VCC) a trzecia – sygnałowa – w pinie 12 Arduino – bardzo stabilna konfiguracja. Należało tylko włączyć zasilanie na 13-tce aby odbiornik podczerwieni pracował –  ale to już powinniśmy umieć (ponownie: pamiętacie „zabawy” z LED-ami? no właśnie po to one wszystkie…).

Dzięki poznanym elementom mogliśmy sterować silnikiem przez pilot od TV! Fajnie, nieprawdaż? Za tydzień nasze kolejne zajęcia, nie zapomnijcie przynieść swoich pilotów – może uda nam się skonstruować pojazd? Zapraszam!

Zajęcia nr 6 – fotorezystor, dzielnik napięć, map(), serwo silnik i znowu map()

Dzielnik napięć
dzielnik_napiec

Bardzo podstawowa wiedza, ale niezbędna podczas zabawy z Arduino i podobnymi. Dlatego zajęcia rozpoczęliśmy od dwóch rezystorów o tej samej wartości, wówczas ze wzoru na dzielnik Uwy= Uwe*R/(R+R1)= 0.5*Uwe i przy pomocy miernika uniwersalnego mierzyliśmy napięcie Uwy. Jako źródło mieliśmy do dyspozycji baterie AAA (różnie – jedni 2 sztuki, inni 4) o różnych napięciu. Dlatego aby prawidłowo wykonać to ćwiczenie trzeba było najpierw zmierzyć napięcie źródła. Dzielnik napięć zbudowaliśmy na płytce stykowej, o tak:

dzielnik1

Gdy już prawidłowo zbudowaliśmy dzielnik napięć i rozumieliśmy co się dzieje z mierzonym napięciem, zastąpiliśmy fotorezystorem.

Fotorezystor

fotorezystor

Oświetlenie fotorezystora powoduje zmniejszenie jego rezystancji (a tym samym zwiększenie płynącego przez niego prądu, jeśli mamy stałe napięcie zasilania). Oświetlenie zmienialiśmy albo zasłaniając ręką fotorezystor, albo oświetlając go latarką z telefonu komórkowego. Dalej zamieniliśmy jeden z rezystorów z naszego dzielnika napięć na fotoopornik i przeprowadziliśmy pomiary napięcia. Układy doświadczalne prezentowały się w ten oto sposób:

dzielnik3 dzielnik2

Warto podkreślić, że istotne jest który rezystor zastępujemy fotoopornikiem. Rysunki poniżej przedstawiają dwa podobne układy dzielnika napięć – zwróć uwagę na wskazania napięcia przy zmianie oświetlenia:

dzielnik52 dzielnik51  Czyli w jednej konfiguracji napięcie rosło oświetlając dzielnik, w drugiej – napięcie malało. Było to przyczyną kilku wątpliwości na naszych zajęciach… Proponuję pobawić się tym w domu (na wirtualnym Arduino, jeśli nie posiadamy płytki).

Inteligentne oświetlenie

Do układu podłączyliśmy LEDa, którego jasnością sterowaliśmy poprzez Arduino z pinem PWM (poprzednie zajęcia + poprzednia praca domowa). Zabawa miała polegać na oprogramowaniu układu tak, aby LED gasł gdy jest dużo światła zastanego (mierzonego przez fotorezystor i wejście analogowe Arduino), oraz aby LED świecił mocniej i mocniej gdy światła zastanego braknie. Takie proste, ale inteligentne oświetlenie 😉

Tutaj poznaliśmy nową funkcję z biblioteki Arduino: map(). Funkcja ta przeskalowywała (liniowo) podaną wartość z pewnego zakresu (dziedziny, poniżej oznaczonej jako wartości od min_x do max_x), na inna wartość z innego zakresu (przeciwdziedzina, od min_y do max_y). Formalnie wygląda to następująco:

map(war,  min_x, max_x,  min_y, max_y)

co oznacza, że chcemy przeskalować wartość war z zakresu min_x do max_x, na wartość z przedziału min_y do max_y. W naszym przykładzie chodziło o przeskalowanie wartości odczytywanych przez analogRead (czyli wartości od 0 do 1023) do wartości podawanych do sterowania jasnością LEDa (przez PWM, czyli z zakresu 0..255). Dlatego skalowaliśmy

war2= map(war, 0, 1023, 0, 255);

To liniowe skalowanie przez funkcję map() nie ma „magii” w sobie, to proste wykorzystanie funkcji liniowej y=ax+b, znanej Wam z lekcji matematyki plus umiejętność rozwiązania układu równań. Dopowiadając: w liniowym skalowaniu mamy 2 nieznane parametry – współczynniki a i b prostej. Musimy więc podać dwa równania aby je wyznaczyć (chyba każdy pamięta, że do narysowania prostej potrzebne są tylko dwa punkty? więc stąd dwa równania…). Posługuję się wartościami krańcowymi, oczywistymi przy naszym zagadnieniu: chcę bowiem, by do PWMa trafiło 255 gdy na wejściu z analogRead-a było 1023 (pierwsze równanie: y=255 gdy x=1023), oraz chcę, by mieć wartość y=0 gdy podaję x=0 (drugie równanie). Oba punkty podstawiam do niewiadomego y=a*x+b i otrzymuję układ równań. Funkcja map() znajduje a i b za nas i wyznacza każdą inną wartość leżącą na tej prostej.

UWAGA: map() działa tylko na liczbach całkowitych!

Przyjrzyjcie się ponownie mojemu rysunkowi – to prosta matematyka w zastosowaniu 😉

map1

Okazało się, że  w wyniku różnego łączenia fotoopornika w układ niektórzy uczniowie musieli stosować:

war2 = map(war, 0, 1023, 255, 0);

co oznaczało taką sytuację:

map2

Serwo silnik (a właściwie mikro-serwo)

serwo1Czyli silnik, który obraca się od 0 do 180 stopni (ma blokadę na inne wychylenia). Potem utrzymuje swoją pozycję. Służy do tworzenia obrotowych ramion itd…

Trzy przewody – zasilanie (czerowny +5V, czarny/brązowy GND) oraz jeden sterujący – musi być PWM. Za dużo nie wnikałem o co chodzi w sterowaniu tym silnikiem, tylko wspomniałem o potencjometrze wewnątrz i o wypełnieniu sygnału sterującego… więcej może później? Zobaczymy.

 

Do sterowania tym silnikiem użyliśmy 2 nowych funkcji z nowej biblioteki:

  • #include <Servo.h> – na początku programu informujemy, że chcemy funkcje z tej nowej biblioteki
  • Servo silniczek; tworzymy zmienną typu silnik-serwo, czyli właśnie o to nam chodzi!
  • silniczek.attach(3); powoduje przekazanie informacji do Arduino, że sterujemy silnikiem przez pin numer 3 (przypominam: musi być to pin PWM, czyli jak nie 3, to 5,9…)
  • silniczek.write(133); ustawia nasz silnik w pozycji 133 stopni. Albo na dowolny inny z zakresu 0..180 stopni. Dziecinie proste 😉

Serwo sterowane potencjometrem

W tym przykładzie wróciliśmy do poprzednich zajęć i ponownie wykorzystaliśmy potencjometr – tym razem czytywaliśmy wartości napięcia na potencjometrze przez Arduino (i wejście analogowe, np. A0) a następnie ustawialiśmy serwo na konkretną wartość kąta. Ponownie użyliśmy funkcję map() w taki oto sposób:

kąt = map( potencjometr, 0, 1023, 0, 180);

gdzie kąt to właśnie wartość kąta, na jaką ma się ustawić serwo (z zakresu 0..180 stopni), a potencjometr to wartość napięcia na wyjściu z potencjometra (z zakresu 0..1023). Upewnij się, że rozumiesz kolejność przekazywania parametrów do funkcji map().

Program działał na prostej zasadzie:

  • potencjometr = analogRead(A0);
  • kąt = map( potencjometr, 0, 1023, 0, 180);
  • silniczek.write(kąt);

i ponownie od początku. Taki program miał jednak pewien problem, gdyż gdy nic nie zmienialiśmy na potencjometrze, to nasz program ciągle przeliczał wartość napięcia na kąt i ciągle ustawiał serwo w pozycji, w której już był! To głupie, prawda? Jak na pierwsze rozwiązanie OK, ale po dłuższym przyjrzeniu się widać, że nie jest dobrze. Dlatego zaproponowałem ulepszyć program tak, by serwo nie było ustawiane gdy pozycja potencjometru się nie zmieniła. W tym celu należało pamiętać poprzednie ustawienia potencjometru (lub poprzedni kąt) i porównywać tą wartość z nowymi ustawieniami. Zaproponowałem taki oto kod:

#include <Servo.h>
#define potencjometr A0

Servo silniczek;  
void setup() {
  Serial.begin(9600);
  silniczek.attach(3);
  pinMode(potencometr, INPUT);
}

int pot, kat, ost_kat;
void loop() {
  pot = analogRead(potencjometr);
  kat = map(pot, 0, 1023, 0, 180);
  if (kat != ost_kat){
    Serial.print(pot);
    Serial.print(" czyli  ");
    Serial.println(kat);
    silniczek.write(kat);           
    ost_kat=kat;
  }
  delay(100);                 
}

Gratuluję tym, którym udało się samodzielnie na to wpaść! Przy okazji: w powyższym programie jest o jedną zmienną za dużo… nie ma bowiem potrzeby tworzyć zmiennej pot. Można się jej pozbyć i zastąpić dwie linijki tak:

int kat, ost_kat;
void loop() {
  kat = analogRead(potencjometr);
  kat = map(kat, 0, 1023, 0, 180);
...
}

Kluczowa tutaj linijka to  kat = map(kat, 0, 1023, 0, 180); którą należy rozumieć tak, że nowa wartość zmiennej kat zostaje ustawioina na postawie funkcji map() ze starej wartości zmiennej kat. Symbol = („równa się”) jest tak zwanym w informatyce operatorem left-assign operator (czyli operator przypisania lewostronnego, tj. najpierw obliczamy wszystko z lewej strony, a dopiero potem obliczona wartość przekazana jest to prawej strony – zmiennej). Z matematycznego punktu widzenia jest to skomplikowana funkcja rekurencyjna…. ale tutaj symbol = trzeba rozumieć w sposób informatyczny.

Prąd „zjadany” przez serwo – mierzymy!

W skrajnych ustawieniach serwa (tj. w okolicy 0 stopni, oraz w okolicach 180 stopni) słyszymy buczenie/piszczenie serwo-silnika. Coś się dzieje. Amperomierz w garść i mierzymy prąd.

serwo1

Przyjrzyj się uważnie obrazkowi i zwróć uwagę, jak podłączony jest amperomierz.

Oczywiście w wirtualnym Arduino silniczek serwo jest idealny i nie widzimy tego, co było u nas na zajęciach….

Dodatkowo: w przypadku mierników uniwersalnych ustaw największą wartość prądu, jaką się spodziewasz dostać – nie odwrotnie! W przeciwnym przypadku zwiększając zakres przepalisz bezpiecznik w multimetrze…

Gratulacje

Wypada pogratulować jednemu z uczestników BTXXIw, który w międzyczasie zbudował układ sterujący serwem za pomocą… fotorezystora! To świetny przykład na to, że nie ma co się nudzić na moich zajęciach – jeśli wyprzedzasz grupę, wykombinuj coś samemu! A ten projekt nie jest bynajmniej głupi – może to być sterowanie jakimś silnikiem w kierunku światła… Gratuluję pomysłowości Mariuszowi Karpowiczowi z II LO. Kto zabłyśnie następnym razem? Nagrody czekają …

Praca domowa

Zbudować układ w wirtualnym Arduino z serwem i zrobić tak, aby czytać z klawiatury kąt, na jaki należy ustawić silniczek. Zajrzyj do poprzednich notatek z naszych spotkań aby przypomnieć sobie o prawidłowym czytaniu liczb z portu szeregowego Arduino.