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.

Jest kolorowo – OragnePi, ODRIOD…

Nie wiem, czy to powinien być „nius” – bo to dość przenoszone kapcie… Niemniej jednak warto wiedzieć o różnych takich nowościach. Dlatego dołączam wpis o hardwarowych zabawkach.

Orange Pi (rodzina)

Chyba niesłuszne jest nazywać tą maszynkę klonem Raspberry Pi, gdyż jest to po prostu inny komputer jednopłytkowy na bazie procesora ARM. Oczywiście z pinami GPIO do programowania.

orange-pi

Występuje sporo wersji tego komputera: Orange PI PC, Orange Pi Mini 2, Orange Pi 2, Orange Pi Plus… generalnie działają na Linuxie (sporo dystrybucji, warto tu zajrzeć). Parametrami często przewyższa Raspberrego – jednak wsparcie środowiska jest zdecydowanie mniejsze. Trzeba o tym pamiętać! Ach, no i warto zauważyć, że choć dystrybucji Linuxa jest kilka, to żadna z nich nie ma odpowiedniej umowy z Wolframem – brak jest więc Mathematicy! Cena takiej maszynki to coś od 120 zł (w zależności od wersji, można zajrzeć do allegro).

Obszerny (ale nie nudny!) artykuł o tych maszynkach znajdziecie tu: http://www.jarzebski.pl/blog/2016/04/04/orange-pi-rodzina-sbc-z-procesorem-allwinner-h3.html

ODROID (rodzina)

Wrzucam zdjęcie porównujące ODROID-C2 (najnowszy) maszynę do Maliny v3 i już wiadomo o co chodzi:

raspberry-pi-3-odroid-c2-comparison

Kolejny konkurent dla Maliny 😉 Specyfikacja przewyższa nawet Malinę w wersji 3 (ale i cena też, bo ~260 zł), a to za sprawą:

  • 2GHz quad core Cortex A53 processor (Pi3 śmiga na 1.2 GHz)
  • RAM 2GB (Pi3 ma o połowę mniej)
  • sieciówka gigabajtowa (Pi3 to „tylko” 10/100 Mb)
  • eMMC slot(brak w Pi3)

Nie jest jednak tak różowo, bo przyglądamy się bliżej i widać, że

  • ODROID-C2 nie ma wbudowanego modułu Bluetooth ani WiFi (RPi3 ma!)
  • brak też Wolfram Mathematicy!

Warto zajrzeć do Wiki i poczytać pełną specyfikację: http://odroid.com/dokuwiki/doku.php?id=en:odroid-c2

Wydajność – benchmarki

ODROID-C2 wypada zdecydowanie lepiej niż RPi3, zachęcam by przyjrzeć się wykresikom porównawczym: http://www.jeffgeerling.com/blog/2016/review-odroid-c2-compared-raspberry-pi-3-and-orange-pi-plus

Kolejny członek rodziny ODROID-XU4 fajnie prezentuje się nie tylko na wykresach wydajności:

XU4packagem

Obecność sporego radiatora (sporego, jak na gabaryty komputerów jednopłytkowych) świadczy o grzaniu, a więc i o niezłych parametrach wydajnościowych. A i owszem:

benchmark1

Mamy tu zebrane wykresy 4-ech róznych maszyn testowanych pod kątem 6-ciu różnych parametrów: wydajność zmiennoprzecinkowa (im więcej, tym lepiej) w różnych programach testujących. Wyraźnie widać, że rodzina ODROIDa mocno bije Malinę (tutaj w wersji 2). Dla lubiących wykresiki polecam ten artykuł.

Zakończę tak

Warto wiedzieć o tych zabawkach (oraz o innych, nie wspomnianych tutaj przez mnie, jak chocby Intel Edison), ale trzeba się na coś zdecydować i robić swoje – programować, knuć, klecić 😉 Od nadmiaru sprzętu może zaboleć głowa więc polecam prostą zasadę dla inwestujących w swój pierwszy komputerk jednopłytkowy – kupujcie taki, jakie mają Twoi znajomi. W ten sposób będziesz mieć wsparcie zawsze pod ręką 😉 Taka strategia sprawdza się najlepiej. Druga rada z zakupem też jest prosta: trzeba się szybko na coś zdecydować, gdyż czas płynie nieubłagalnie i nie ma co go tracić na zbyt długie zastanawianie się nad konkretnym modelem. Niech przestrogą będzie osiołek z bajki Ezopa, który zdechł z głodu nie mogąc wybrać miski, z której zacznie jeść posiłek.

 

 

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.

Potencjometr liniowy – dzielnik napięć

Bardzo 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óżkek tego elementu:

  • 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.

 

XIV Podlaski Festiwal — się działo!

Dziękujemy wszystkim odwiedzającym Koło Naukowe Fi-BOT na Wydziale Fizyki! Mamy nadzieję, że zainteresowaliśmy tematem i pokazaliśmy, że ta cała otaczająca nas elektronika nie jest wcale taka tajemnicza… da się ją okiełznać przy odrobinie chęci!

13220914_10153780417743155_5875256925842735021_n

Cała drużyna Fi-BOTowców w komplecie 😉 A oto oni w akcji plus ich zabawki:

13246405_913443745431035_667158345755222820_o 13243697_913444435430966_8800788880044038664_o 13217281_913444228764320_3602832745414270024_o 13246409_913443225431087_3378527510244600120_o 13243686_913443958764347_1186093791345968823_o 13227508_913443205431089_2566577491681815011_oDSC_1198 DSC_1199 DSC_1200 DSC_1201

No i oczywiście pamiętalismy o naszym sponsorze – Parlamecie Studenckim UwB:DSC_1213

A na koniec krótkie wideo z prostego, choć efektownego układu (Paweł):

Studentom: Pani Noemi, Panom Adrianowi, Kamilowi, Marcinowi i Pawłowi serdecznie dziękuję za wysiłek włożony w przygotowanie ich układów, a także za ich prezentację – K. G.

Zajęcia nr 4 – cyferki, cyferki, komu komu, bo idę do domu

Kto nie był niech żałuje. Prawie zakończyliśmy budowę naszego pojazdu podróżującego w czasie 😉 Pracowaliśmy nad konsoletą do sterowania (programowania daty podróży)

A dokładniej pracowaliśmy nad jednym z elementów:

878-00

A jeszcze dokładniej: nad pojedynczą cyferką!

7 segment display (SSD) – przeczytaj Wikipedię (ale nie całą).


Wszyscy uczestnicy Talenów pracowali wytrwale i już po chwili każdyemu udało się tak sterować LEDami 7-mio segmentowego wyświetlacza, by pokazywał jedynkę, dwójkę i trójkę. Jeden z uczestników kursu okazał się bardzo sprytny i bardzo szybko miał zaprogramowane wszystkie 10 cyfr (gratuluję Jakubowi M. (VIII LO) – nagroda na koniec kursu).

W celu sterowania 7-mio segmentowym wyświetlaczem szlifowaliśmy techniki programowania strukturalnego:

  • tworzyliśmy własne funkcje, w tym funkcje z argumentami
  • wykorzystywaliśmy tablice (do przechowywania numerów pinów z Arduino)
  • wykorzystaliśmy tablice dwuwymiarowe – tzw. tablice tablic, czyli elementami tablicy była… tablica! Okazało się to bardzo użyteczne (z odpowiednim programowaniem funkcji)
  • no i poznaliśmy hardware, czyli 7 segment display ze wspólną anodą (CA – common anode – w naszym przypadku). Musieliśmy troszkę zmienić nasze myślenie – przywykliśmy do schematu: 1=włączone, 0=wyłączone. A tutaj odwrotnie. Włączając napięcie 5V na pinie Arduino powodujemy zgaszenie segmentu, z kolei ustawiając napięcie na 0V włączamy segment! Tak – specjalnie dałem Wam taki właśnie sprzęt, by troszkę wysilić szare komórki!

Niestety – programowanie pojedynczej cyferki wymagało wykorzystania 8 pinów cyfrowych z Arduino. To dość dużo… 2 Takie cyferki wymagają już 16 pinów, a nasze UNO ma ich 14 (tylko? aż?). OK, można ustawić piny analogowe jako cyfrowe, tym samy będziemy mieć ich dodatkowo 6 sztuk – czyli oprogramujemy 2 cyferki. Ale co z naszą konsolą do podróży w czasie?? Pojazd już mamy, tylko ta konsola nas blokuje…

Rejestr przesuwny 74HC595 (ang. shift register)

Jako rozwiązanie powyższego problemu poznaliśmy rejestr przesuwny 74HC595. Cena tego cuda na czarnym rynku to około 1 zł w detalu, a umożliwia ono sterowanie 8 wyjściami (czyli np. jedną cyferką) za pomocą tylko 3 pinów cyfrowych z Arduino! Co więcej, łącząc ze sobą dwa takie układy (za łączną kwotę 2 zł) możemy mieć już oprogramowane 2 cyferki, ciągle wykorzystując tylko 3 piny cyfrowe z Arduino. Układy można łączyć w kolejne szeregi aż do 8 sztuk.

Przy tej okazji poznaliśmy:

  • orientację modułu w kasiecie DIP (pamiętacie tą kropeczkę? wcięcie?)
  • numerację pinów na module (odwrotnie do ruchu wskazówek zegara, gdy patrzę mu w twarz…)
  • nazewnictwo niektórych pinów (GND, Vcc, Qa, Qb…)

No i na koniec okazało się, że aż 3 uczniów zrobiło błąd przepisując mój cudowny kod z tablicy, tym samym rejestr przesuwny nie działał. Trudno powiedzieć o co chodzi w tej plątaninie przewodów,

DSC_0322

ale od kłopotów uratował nas Sylwester K. (ZSH-E) – bezbłędnie przepisując program, uruchamiając i ciesząc oczy działającym układem. Był nawet na tyle szczodry, że po chwili rozsyłał swój (mój?) program kolegom, którzy tylko czerwienieli widząc, że już u nich wszystko gra 😉

Praca domowa – tym razem – dobrowolna!

Proszę zmusić Arduino by odliczało od 9 do 0 z wykorzystaniem rejestru przesuwnego. W tym celu zalogujcie się do 123d.circuits.io i tam przygotujcie hardware (poszukajcie wyświetlacza oraz rejestru – czekają tam na Was, przy czym najpierw sprawdźcie wirtualną bateryjką, czy wyświetlacz jest ze wspólną anodą, czy katodą), a software macie już prawie gotowy. Kto się na to pokusi? Nagroda czeka…

P.S.

Lubicie dobranocki z dreszczykiem? Jeśli tak, i nie lękacie się języka angielskiego to zapraszam do lektury

 

Przygotowania cdn…

  • Pan Paweł atakuje temat wyświetlaczy, ciekawe, czy mu się uda zrealizować grę 😉
  • Pani Noemi zaprzyjaźnia się z bluetoothem i sterownikiem silników…
  • Pan Kamil niedługo stanie się mistrzem Processingu…
  • Pana Marcina nie było 🙁 ciekawe, jak jego serwa?
  • Pan Adrian jest już na ostatniej prostej – pojazd jeździ (prosto!), reaguje na zderzenia, więc… dostał nowe zderzaki do zamontowania + pomysł na modyfikację softu do swojego bolida 😉

Się dzieje 😉

P.S.

Jak na razie zapisało się do nas:

  • na godz. 10:00 – III LO B-stok (~15 osób),  gimnazjum nr I Grajewo (~25 osób)
  • na 11:00 – II LO Grajewo (~16 osób)
  • jak na razie zapisów brak
  • na 13:00 – II LO B-stok (~30 osób !!!)