PID oraz podstawy: PWM + (mikro)serwo

Podstawy Arduino

Piny cyfrowe PWM z multimetrem i LED-em, a potem serwosilniczek (Serwo.h, silnik.attache(pin), silnik.write(stopnie).

Maskotka

BB: regulator PID dla 1 koła: poniżej wynik działania algorytmu regulującego pracę silnika: kolor czerwony to krzywa pożądana (nastaw użytkownika, potencjometrem), kolor niebieski to aktualna praca koła. Oś Y na wykresie to RPS, czyli obroty na sekundę.

Praca regulatora PID ma polegać na tym, że RPS koła ma podążać za ustaloną wartością niezależnie od zewnętrznych czynników (np. koło na lodzie=kręci się praktycznie bez oporów, lub koło w błocie =ciężko mu wyjechać). Najważniejsze współczynniki regulatora PID Pab bartek dobrał metodą „prób i błędów” (plus własne, wcześniejsze doświadczenie) i są dobrane dla konkretnego silnika (dlatego ich tutaj nie podaję). Zauważ, jak szybko silnik dopasowuje się do pożądanej wartości). Przy okazji: wykres ze „starej” wersji algorytmu, na zajęciach Pan Bartek go udoskonalił i reakcja koła jest jeszcze szybsza!

Krańcówka w PM2D3D oraz samochodzik (L293N)

Sterownik silników L293N

Pan Przemek zapoznał się z sygnałami PWM (obowiązkowy programik „gaszący” LEDa – i funkcja analogWrite) a następnie poznał sterowanie silnikami DC – za pomocą sterownika L293N. Najpierw podłączaliśmy zasilanie 6V z żelowego akumulatorka:a następnie konstrukcja uległa modyfikacji (w tym także zasilanie) i powstała taka oto platforma testowa:
Udało się „nauczyć” jeździć ten pojazd do przodu, tyłu i skręcać. Na razie wykonuje on wszystkie te czynności w kółko – więc jest to mało sensowne. Ale kolejny krok to zdalne sterowanie i ten krok to już duży krok w kierunku Wojny Robotów 😉

Precyzyjna Maszyna (PM2D3D) – krańcówka

Pan Bartek zamontował krańcówki – wydrukował odpowiednie elementy trzymające.
  Skoro są już krańcówki, to należy je oprogramować. Drogi są (co najmniej) dwie: 1) w programie realizującym poruszanie silnikami sprawdzamy, co się dzieje z krańcówkami – i w razie czego zatrzymujemy konkretny silnik, lub 2) inicjalizujemy przerwania, które robią to automatycznie. Jednak zanim doszło do tego to… pojawiły się problemy z rysowaniem linii po skosie. Przygotowany przez Pana Bartka kod miał działać – jednak okazało się, że ma wady. Wiadomo – ten się nie myli, kto nic nie robi 😉 Dlatego dzisiejsze zajęcia poszły w kierunku naprawy softwaru… Jeszcze jest trochę roboty 😉

Więcej o projekcie Maszyny na stronie projektu.

(c) K.G.

Sygnały analogowe

Konwerter analogowo cyfrowy (DAC)

Sygnały analogowe to takie sygnały elektroniczne, które możemy zapisywac nie tylko jako 0 lub 1 (tak/nie, prawda/fałsz – tylko dwie wartości), ale w wielu „odcieniach” – w końcu pomiędzy zerem a jedynką jest nieskończenie wiele liczb. Oczywiście w informatyce wszystko musi byc skończone, tak więc tych „odcieni” (poziomów pomiędzy zerem a jedynką) jest skończona liczba. Układ zamianiający sygnał elektroniczny na informację cyfrową nazywa się konwerter analogowo cyffrowy (DAC) i mówiąc o nim podajemy jego zakres – liczbę bitów. Dla 8-bitowego DACa mamy wartości sygnału analogowego z przedziału od 0..255 (256 poziomów = 2^8), natomiast w przypadku 10-bitów 0..1023 (1024 poziomy = 2^10).

Potencjometr

Wygląda dość topornie – ale jeśl macie w domu zbyteczną gałkę z kryształów Swarowskiego to proszę śmiało przynieść i uatrakcyjnimy wygląd tego podzespołu elektronicznego 😉 Trzeba pamiętać o sposobie podłączania go do budowanych układów. Widzimy trzy nóżki więc:

  • jedna skrajna nóżka (nie ma różnicy która) powinna być podłączona do masy (nazwijmy ją GND i oznacza napięcie zero V)
  • druga skrajna nóżka musi być podłączona do danego napięcia, nazwijmy je VCC
  • środkowa nóżka będzie „wyprowadzać” napięcie od zera do VCC w zależności od ustawienia pokrętła na potencjometrze. 

Na zajęciach dość szczegółowo omówiłem budowę potencjometru i zasadę jego działania – dzielnik napięć – ale do tego jeszcze obiecuję wrócić. Na razie skupmy się na powyższych informacjach jak potencjometr łączymy w układ. Jako przykład możemy podłączyć „minus” bateryjki AAA do pierwszej nóżki, „plus” do trzeciej „nóżki”, wówczas z pinu numer dwa otrzymamy napięcie od 0..1.5V. Innym przykładem podłączenia jest wykorzystanie Arduino i pinów GND (podłączamy do pinu 1 na potencjometrze) oraz 5V (do pinu 3 na potencjometrze) – wówczas mamy kontrolę potencjometrem nad napięciem 0..5V (pin 2 na potencjometrze). 

Pinem #2 z potencjometru możemy zasilać jakiś układ – sprawdzaliśmy to z LED-em wpiętemym pomiędzy piny #1 (GND) i #2(0..3.3V) potencjometru, lub mozemy podłączyć pin #2 do wejścia A0 w Arduino – wówczas odczytamy wartość napięcia ustawionego potencjometrem jako liczbę z przedziału 0..1023 (Arduino UNO ma DAC 10-bitowy).

Kalibracja

Konieczne jest sprawdzenie poziomu napięcia 5V w Arduino – może się zdarzyć, że nasza płytka jest uszkodzona lub producent nie trzymał standartów i zamiast 5V mamy 5.1V. To spora różnica. W przypadku uszkodzonych płytek – których wcale nie ma co wyrzucać – napięcie zamiast 5V może być nawet 4.5V co jest już ogormną różnicą! Dlatego konieczne jest sprawdzenie multimetrem wartości napięcia produkowanego przez Arduino z pinu 5V. 

Odczytywanie sygnału – analogRead

void setup(){
  Serial.begin(9600);
}
int odczyt;
void loop(){
  odczyt = analogRead(A0);
  Serial.print("Odczytalem ");
  Serial.print(odczyt);
  Serial.print(" ---> ");
  Serial.print(odczyt*4.9/1024);
  Serial.println(" [V] ");   
}

Ten prosty program odczytuje sygnał podłączony do pinu A0 w Arduino (możesz wybrac inne wyjścia: A1,A2…A5) i wypisuje jego wartość jako liczbę z przedziału 0..1023 (gdyż Arduino UNO ma przetwornik DAC 10-cio bitowy, czyli 2^10=1024) a także podaje wartość w woltach. Sprawdziłem, że w moim Arduino napięcie z pinu 5V wcale nie wynosiło 5V a 4.9V i dlatego linia #10 zawiera właśnie takie przeliczenie na wolty. Zwróć też uwagę na sposób komunikowania się z ekranem – budowanie napisu w jednej linii i dopiero na koniec użycie funkcji Serial.println().

Posługują się powyższym programem najpierw sprawdzamy odczytywane napięcie z pinu 3.3V Arduino, potem 5V Arduino –  porównując wartości wypisywane na ekranie z multimetrem. Potem możemy użyć jakiś baterii a w końcu wykorzystać potencjometr i jego środkowy pin.

PWM (cyfrowe piny z „tyldą” ~)

PWM to szybkozmienny sygnał cyfrowy (cyfrowy, a więc tylko dwie wartości: 0V oraz 5V). Szybkozmienny oznacza naprawdę szybkie zmiany, 500x na sekundę – czyli co 2ms! Musimy podać jaki ułamek czasu (z przedziału 2ms) będzie napięciem wysokim (5V) a wówczas pozostały czas będzie napięciem 0V. Ten ułamek czasu musimy wyrazić jako liczbę całkowitą z przedziału 0..255 (gdzie 255 to 100%) gdyż w Arduino UNO piny PWM są 8-bitowe (a 2^8=256). Wartość 0..255 nazywa się to wypełnieniem sygnału.

Sterowanie wypełnieniem – analogWrite

void setup(){
  pinMode(3, INPUT);//pin cyfrowy z tyldą = PWM 
}

void loop(){ 
  analogWrite(3, 0);
  delay(5000);
  analogWrite(3, 100);
  delay(5000);
  analogWrite(3, 200);
  delay(5000);
  analogWrite(3, 255);
  delay(5000);
}

Powyższy program wybiera pin #3 Arduino UNO (zwróć uwagę, że jest on onzaczony „tyldą” na płytce – czylli jest to pin PWM, ale można wybrac inne piny PWM) i steruje jego wypełnieniem. W tym celu używamy funkcji analogWrite(int,int) podając numer pinu którego ma dotyczyć zmiana (koniecznie pin z tyldą!) oraz wartość wypełnienia (koniecznie z przedziału 0..255). Co 5 sekund zmienia jego wartość, którą możemy odczytać na multimetrze – ale uwaga, będzie to tylko wartość średnia! Aby zobaczyć zmiany napięcia w okresach 2ms należało by użyć oscyloskopu. 

Praca domowa

Wykorzystując informacje z dzisiejszych zajęć uruchomić wirtualne Arduino i zbudować program z potencjometrem, który steruje jasnością LED-a. Musimy więc odczytywać wartości z potencjometru a następnie odpowiednio sterować zasilaniem LED-a. Powodzenia!

(c) KG, 2017

 

silniczki DC + fotorezystor

Sterujemy szybkością silniczka światłem – dlatego zaczęsliśmy od

  • zbudowania dzielnika napięć z fotorezystorem
  • wczytywaniu napięcia z tego dzielnika na port analogowy Arduino
  • podłączenie L298N z silnikiem
  • wybranie pinu PWM do sterowania szybkością obrotów
  • przydatna funkcja skalująca wartości z jednego zakresu na drugi: map

A oto i bohaterowie naszych zajęć:

Kolejne zajęcia – także we wtorek 16:00 – sterujemy dwoma silnikami za pomocą światła.  Zapraszam!

 

silniczki DC + moduł L298

Ponownie programowaliśmy silniczek DC, tym razem wykorzystywaliśmy moduł na bazie L298. Przypomnieliśmy sobie kilka istnych rzeczy:

  • wczytywanie znaków z klawiatury do Arduino – funkcja Serial.read() 
  • pisanie „niechluje” instrukcji warunkowej w C/C++
  • wczytywanie liczb z klawiatury – funkcja Serial.parseInt()
  • podłączenie modułu L298 do koła i bateryjki — sprawdzamy, czy rozumiemy jak to działa
  • jeśli rozumiemy, to podłączamy do Arduino
  • prosty program włączający obroty silnik w jedną stronę na czas 1 sekundy, a potem w stronę przeciwną (też na czas 1 sek) i tak w kółko
  • modyfikacja programu na wczytywanie liczb: liczba 0 silnik stop, liczba <0 — silnik w jedną stronę, liczba >0 silnik w przeciwną stronę
  • kolejna modyfikacja o uwzględnienie sterowania szybkością obrotów – wczytujemy liczbę z przedziału -255..255 i sterujemy nie tylko kierunkiem obrotów, ale też i szybkością
  • przy okazji zachęciłem do wirtualnego Arduino na www.circuits.io

A oto i bohater naszych zajęć:

Znalezione obrazy dla zapytania modul l298

Kolejne zajęcia – także we wtorek 16:00 – sterujemy silnikiem za pomocą światła.  Zapraszam!

 

Podstawy: dzielnik napięć, PWM, fotorezystor = inteligentne oświetlenie

Podstawy: dzielnik napięć

Obrazki z tablicy… 

Najpierw bawiliśmy się multimetrem i dzielnikiem:

fibot2016-11-22-note-19-36-1

a potem podłączyliśmy fotorezystor i próbowaliśmy go odczytywać z poziomu Arduino.

Pomysł Pana Pawła (PPP) aby najpierw zmierzyć multimetrem prąd płynący w obwodzie, a następnie znając podane napięcie i stosując prawo Ohma otrzymywać wartość rezystancji na fotooporniku – był dobry, ale wymagał ówczesnego użycia amperomierza (z multimetru). Mi bardziej chodziło o wykorzystanie fotorezystora w ten sposób, aby uzyskać informację czy go zasłaniamy czy nie, czy jest dużo światła zastanego (w pomieszczeniu) czy jest ciemno. Dlatego nie koniecznie interesuje mnie sama wartość oporu, a raczej jej zmiany. Dlatego po sprawdzeniu działania PPP i przyznaniu mu racji (a raczej Ohmowi), zaproponowałem zastosowanie dzielnika napięć i mierzenia napięcia w standardowy spodówb

fibot2016-11-22-note-19-36-2

void setup(){
  Serial.begin(9600);
}

void loop(){
  Serial.println(analogRead(A0));  
  delay(100);
}

W zależności od kolejności oporników (stałego R i zmiennego fotorezystora) otrzymywaliśmy liczby rosnące lub malejące zasłaniając fotorezystor ręką. Dodatkowo można było użyć latarki z telefonu komórkowego i symulować mocne oświetlenie.

PWM

Aby zrobić inteligentne oświetlenie potrzebowaliśmy sposobu na kontrolowanie jasności LED-a. Poznaliśmy Pulse Width Modulation i piny cyfrowe Arduino z „falką” (wolę: tyldą).

fibot2016-11-22-note-19-36-3

Inteligentne oświetlenie

To nic innego jak połączenie dwóch poznanych schematów:

  • mierzymy napięcie na fotorezystora przez wejście analogowe, a następnie
  • ustawiamy jasność LED-a sterując wypełnieniem PWM.

Jedyny problem to kwestia zamiany odczytywanych wartości z portu A0 (fotorezystora) na wartości akceptowane przez piny PWM (przypominam: 0..255). W tym celu wróciliśmy do gimnazjum i zastosowaliśmy funkcję liniową.

Dla przykładu: Pani Emanuela zastosowała stały opornik R o takiej wartości, że na porcie A0 odczytywała wartości 130 gdy fotorezystor był zasłonięty palcem, oraz 500 gdy był oświetlany światłem zastanym. Wartości pomiędzy przedziałem 130..500 odpowiadały częściowemu zasłonięciu ręką fotorezystora. Trzeba to teraz zamienić na liczby 0..255 aby sterować LED-em przez PWM (bo PWM akceptuje właśnie takie liczby, a nie 130..500). Dlatego stosujemy liniowe skalowanie (y=ax+b, współczynniki ab na razie nie znane), gdzie wartość 130 ma odpowiadać maksymalnemu świeceniu LED-a, czyli 100% wypełnieniu PWM-a (wartość 255), natomiast gdy odczytujemy 500 (jest jasno) to LED ma się nie świecić (wypełnienie 0). Trzeba skonstruować układ równań i wyznaczyć a oraz b a następnie przeliczać wskazania z portu A0 (traktując je jako x w równaniu prostej, a otrzymany y to właśnie wartość przekazana do PWM-a). Poniższy rysunek wyjaśniał ten opis:

fibot2016-11-22-note-19-36-4

Z kolei Pan Paweł użył innego rezystora (oraz innej kolejności ustawienia oporników) i miał następujący schemat do rozważenia 

fibot2016-11-22-note-19-36-5

W obu przypadkach trzeba było rozwiązać otrzymany układ równań na kartce a następnie wpisać liczby (wyliczone współczynniki a b) to takiego prostego programiku:

#define lampka 9
float a=0.689189, b = 344.595;

void setup(){
  Serial.begin(9600);
  pinMode(lampka, OUTPUT);
}

void loop(){
  int fotorezystor = analogRead(A0);  
  Serial.print("fotorezystor=");
  Serial.print(fotorezystor);  
  Serial.print("-->");  
  int pwm = a*fotorezystor+b:
  Serial.print(" PWM=");  
  Serial.println(pwm);
  analogWrite(lampka, pwm);  
  delay(100);  
}

Wrócimy do tego programu na kolejnym spotkaniu, bo trzeba tu o paru kwestiach wspomnieć. Ale już teraz zachęcam do zabawy z powyższym programikiem na wirtualnym Arduino (jest tam też wirtualny fotorezystor). Proszę też zastanowić się nad następującymi kwestiami:

  • dlaczego Pan Paweł miał prostą o współczynniki kierunkowym a>0, a Pani Ema a<0 ?
  • kto zastosował lepszą wartość opornika stałego – Pani Ema czy Pan Paweł, a może to nieistotne? 

Zapraszam za tydzień!

 

Zajęcia nr 6 – pilot IR, fotorezystor, map() i serwa

Pilot na podczerwień – TSOP22xx

tsop22xx

Czyli wykorzystujemy bibliotekę IRLib wraz z czujką TSOP22xx. Przy tej okazji pokazałem, jak instalowac biblioteki w Arduino IDE na 2 sposoby: z pliku zip, oraz ze środowiska.

Cujka TSOP22xx pożera bardzo mało prądu (jedynie 5 mA – patrz nota katalogowa) i dlatego zdecydowałem się pokazać Wam podłączenie jej bezpośrednio do płytki Arduino (czyli bez przewodów lub płytki stykowej). 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…).

Nasz pierwszy projekt polegał na odczytywaniu kodów klawiszy z domowego pilota, a potem sterowanie trzema LEDami. Przy tej okazji poznaliśmy też wygodny zamiennik instrukcji if/else w języku C – a mianowicie switch/case.

Dzielnik napięć

Wróciliśmy do dzielnika aby pobawić się miernikami oraz… aby za chwilę wykorzystać je w projekcie inteligentnego oświetlenia sterowanego Arduio. Ale to za chwilę. Najpierw fajna (mam nadzieję) zabawa z multimetrem 😉dzielnik_napiec

Dzielnik napięć – 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. Najpierw każdy z nas ustalił więc, co ma na swojej płytce aby kontrolować swój układ.

Odczyt zastanego oświetlenia

W tym ćwiczeniu do zbudowanego układu podłączyliśmy Arduino z pinem analogowym i odczytywaliśmy napięcie, niezależnie od miernika – to ważne, aby kontrolować to co wypisuje nam Arduino niezależnym miernikiem (u nas multimetrem). Ponownie okazało się, że aby otrzymać wyniki bardzo zbliżone do multimetru należało najpierw upewnić się jakie mamy faktycznie napięcie 5V w naszym Arduino (wiadomo – uczniowie/studenci popełniają błędy –  a kto nie! – i płytka się uszkadza…. są więc płytki z napięciem 4.7V zamiast katalogowych 5V).

Inteligentne oświetlenie

Do układu podłączyliśmy LEDa, którego jasnością sterowaliśmy poprzez Arduino z pinem PWM (poprzednie zajęcia z przykładem Fade). 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, 255, 0);

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 0 (pierwsze równanie: y=255 gdy x=0), oraz chcę, by mieć wartość y=0 gdy podaję x=1023 (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 😉

map2

Sterowanie jasnością LDEa przez PWM robiliśmy poleceniem analogWrite(9, war2);

Okazało się, że aby wszystko działało dość widowiskowo należało najpierw wyskalować nasze odczyty jasności zastanej zmniejszając zakres…. W wielu przypadkach było więc potrzebne:

war2 = map(war, 400, 800, 255, 0);

co sprawdziło się metodą prób-i-błędów – w tym celu mocno debugowaliśmy nasz kod wypisując na ekran monitora odczytywane liczby.

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 z klawiatury

Przypomnieliśmy sobie jak odczytywać liczby z klawiatury (funkcja parseInt() dla obiektu Serial) i stworzyliśmy program ustawiający silnik w pozycji wczytanej z klawiatury. Proste a przyjemne. No i zawsze warto powtarzać wiedzę 😉

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…

Serwo sterowane pilotem na podczerwień

W tym przykładzie wróciliśmy do początku zajęć i ponownie wykorzystaliśmy pilot od telewizora  – tym razem czytywaliśmy klawisze i ustawialiśmy serwo na konkretną wartość kąta. Dwa przyciski obracały serwo w lewo i w prawo, trzeci zaś ustawiał serwo w pozycję 90 stopni.

Serwo pracy ciągłej (aka 360 stopni)

Serwo obrotowe360stop. FS90R 1,3kg/cm FeetechPoznaliśmy też serwa obracające się „w kółko”, ale z kontrolą szybkości swoich obrotów. Sterowanie polegało na używaniu funkcji writeMicroseconds(), w której komenda STOP dla silnika wymagała podania wypełnienia 1500 ms, natomiast wypełnienie z zakresu 1501-2000 ms oznaczało obrót w prawą stronę z prędkością proporcjonalną do tego wypełnienia (i analogicznie z obrotami w lewą stroną – wypełnienie z przedziału 1000-1499 ms).

Ta sama funkcja writeMicroseconds() może być przydatna w korygowaniu niedoskonałości tanich, chińskich serw, które nie trzymają katalogowych parametrów – obrót od 0 do 180 stopni. Proszę tylko obchodzić się z nią ostrożnie, bo z poprzedniego ćwiczenia – gdzie mierzyliśmy prąd zjadany przez serwo – wiemy, że dużo się dzieje w skrajnych położeniach.

Koniec? Początek!

Z wielkim niedosytem kończymy nasze spotkania w ramach Talentów XXI w. Niedosyt bierze się z faktu, że umiemy obsługiwać kilka fajnych „klocków” i aż się prosi, aby je teraz połączyć w jakąś całość (samochodzik sterowany pilotem, albo obrotowa wieżyczka z laserem). Ale czas naszych spotkań dobiegł końca. Cóż… zachęcam do samodzielnej pracy i koniecznie pochwalcie się swoimi osiągnięciami – dlatego dla Was jest to początek przygody z Arduino (mam nadzieję!). Proszę śmiało pisać do mnie na email! Pozdrawiam i dziękuję za wspólną pracę, K. Gawryluk

Zajęcia nr 5 – sygnały cyfrowe, analogowe…

Sygnały cyfrowe – czujka ruchu PIR

Prosta w obsłudze czujka ruchu. Trzy piny  – zasilanie, masa oraz wyjście. W przypadku wykrycia ruchu wyjście jest w stanie wysokim (5V) przez chwilę (można sterować tym czasem),  a gdy ruchu brak – wyjście przechodzi w stan niski (0V). Aby to odczytać przy pomocy Arduino poznaliśmy dwie nowe rzeczy:

  • pinMode(7, INPUT) – czyli właśnie informujemy Arduino, że będziemy odczytywać wartość napięcia na konkretnym pinie (w tym przypadku: pinie numer 7),
  • digitalRead(7) – funkcja odczytująca napięcie i zwracająca wartość 1 (jedynka) gdy napięcie jest wysokie (2.4 – 5V) oraz 0 (zero) gdy napięcie jest niskie (0 – 0.8V).

Warto pamiętać, że Arduino UNO ma 14 pinów cyfrowych, a inne modele – patrz specyfikacja (kupując płytkę dla siebie weź to pod uwagę).

Sygnały analogowe

Czyli czytanie napięcia z przedziału od zera do 5V z rozdzielczością 10 bitów – a więc 1024 poziomów napięć (bo 2 do potęgi 10-tej to właśnie 1024). Nasze płytki są już lekko zdezelowane i wcale na wyjściu pinu 5V z Arduino nie mamy 5V a np. 4.57V, dlatego warto to mieć na uwadze czytając konkretną wartość napięcia. Poznaliśmy:

  • wejścia analogowe: A0, A1, A2, …, A5 (6 sztuk w UNO)
  • analogRead(A0 – funkcja odczytująca napięcie i zwracająca wartości od 0..1023 w zależności od napięcia na wejściu A0.
  • wejście AREF na płytce Arduino do podawania napięcia referencyjnego z przedziału 0..5V oraz funckję analogReference(EXTERNAL) uruchamiającą tę funkcję. Dzięki temu można wykorzystać całą rozdzielczość 10-ciu bitów na czytanie napięcia w przedziale 0..AREF V – ale tego nie testowaliśmy w praktyce.
  • inne możliwości ustawienia punktu odniesienia w funkcji analogReference, np. INTERNAL1v1 w zależności od płytki Arduino daje to pożliwość wykorzystania całej rozdzielczości 10-ciu bitów w zakresie 0..1V.

Galeria:

dsc_2177

Na zdjęciu: 4-ka wspaniałych czyli mała lecz silna grupa, która soboty ma wolne 😉 A ten piąty? widać, że nie z grupy, taki na peryferiach… soboty ciekawie spędza 😉 zresztą nie tylko On, inni (spoza kadru) też.

Potencjometr liniowy – dzielnik napięć (3 piny, nie „bolce” !!!)

potencjometr-osiowy-liniowy-5kBardzo przydatny element elektroniczny – będziemy go wielokrotnie wykorzystywać. Dlatego przypominam, że działanie oparte jest na dzielniku napięć, i należy pamiętać roli 3 nóżek tego elementu (proszę nie nazywać pinów „bolcami” – to mało profesjonalne):

  • pierwsza – zasilanie (np. 5V)
  • druga – napięcie na wyjściu, czyli zmodyfikowane konkretnym ustawieniem gałki potencjometru (np. 1.2V)
  • trzecia – masa (0V)

Oczywiście nóżki piersza i trzecia mogą być zamienione rolami. Przy pomocy miernika uniwersalnego sprawdziliśmy w praktyce działanie tego potencjometru, a już po chwili wczytywaliśmy do Arduino to napięcie i pisaliśmy na ekranie – dzięki funkcji  Serial.println().

Ważne: zauważyliśmy, że ustawiony potencjometr w jednej pozycji i nie poruszany daje lekko różne wartości, np. 600, 600, 601, 600, 600, 600, 598, 600, 600, 601, 600… Niby widać, że odczytana wartość wynosi 600, a te drobne odstępstwa nazywamy fluktuacjami. Dzieje się tak gdyż przetwornik DAC w Arduino nie jest doskonały (a niby co jest?!), wrażliwy na szumy i inne rzeczy. Warto o tym pamiętać.

Sygnały PWM – sygnały cyfrowe

Czyli Pulse Width Modulation – sygnały szybkozmienne w czasie (Arduino UNO – 2ms, czyli 500Hz), o dwóch wartościach – 0V i 5V. Mamy możliwość wybrania wypełnienia sygnału 5V – czyli jak długo wartość 5V utrzymuje się w okresie 2ms (a następnie wszystko się powtarza). Mamy 8 bitów do sterowania wypełnieniem – a więc wartości z przedziału 0..255.

Ku pamięci:

  • PWM jest dla sygnałów cyfrowych, oznaczonych tyldą w Arduino (a więc ~3, ~5, ~6, ~9, ~10 – aż 6 takich wyjść!)
  • pinMode(7, OUTPUT)
  • analogWrite(3, 127) – funkcja sterująca wypełnieniem (w tym przykładzie 50%, gdyż podałem 127, a maksymalna wartość to 255)

Przykłady -> 01 Basics -> Fade

Omówienie przykładu, zbudowanie układu i uruchomienie.

Pamiętaj:

wybierając płytkę Arduino dla siebie pamiętaj o jej parametrach: z dzisiejszych zajęć już wiesz, że musisz zwracać uwagę na liczbę pinów cyfrowych, analogowych oraz pinów cyfrowych z możliwością PWM. Zajrzyj na specyfikację Arduino Mega i porównaj z UNO – zobaczysz różnicę. A kolejne istotne parametry poznasz na dalszych zajęciach.

Praca domowa

Proszę zaprogramować w wirtualnym Arduino (przypominam: 123d.circuits.io) układ potencometr 10k + LED sterowany PWM tak, by LED rozjaśniał się wskutek nastwień potencjometu. W tym celu trzeba 1) czytać potencjometr analogowo, 2) sterować jasnością LEDa przez PWM (podobnie do omawianego przykładu Fade).

Podpowiedź: analogRead() zwróci nam wartości od 0..1023, a PWM potrzebuje wartości od 0..255. Jak widać te wartości do siebie nie pasują… rozwiązanie najprostrze to podzielenie przez 4 wczytanej wartości i ustawienie właśnie na tyle PWMa. Lepsze rozwiązania tego „problemu” poznamy na kolejnych zajęciach.

 

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!