Przed czytaniem upewnij się, że znasz podstawy opisane w dotychczasowych częściach naszego darmowego kursu Arduino dla każdego!

Podobne dokumenty
ze względu na jego zaokrąglony kształt musimy go umieścić w innych bloczkach np. ze zmienną: lub jeśli chcemy sprawdzić jaki właśnie znak odczytujemy:

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Notatka lekcja_#3_1; na podstawie W.Kapica 2017 Strona 1

Krótki wstęp o wyświetlaczach. Jak zmusić wyświetlacz do pracy?

1 Podstawy c++ w pigułce.

Silnik prądu stałego. Sterowanie silnika prądu stałego

Klawiatura matrycowa

Warunek wielokrotnego wyboru switch... case

Nazwa implementacji: Nauka języka Python wyrażenia warunkowe. Autor: Piotr Fiorek. Opis implementacji: Poznanie wyrażeń warunkowych if elif - else.

Podstawy Programowania C++

W przeciwnym wypadku wykonaj instrukcję z bloku drugiego. Ćwiczenie 1 utworzyć program dzielący przez siebie dwie liczby

lekcja 8a Gry komputerowe MasterMind

Uczeń/Uczennica po zestawieniu połączeń zgłasza nauczycielowi gotowość do sprawdzenia układu i wszystkich połączeń.

Pomiar natężenia światła (005; ; arduino, processing)

Programowanie - wykład 4

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Kod produktu: MP01105

Podstawy i języki programowania

Informatyka II. Laboratorium Aplikacja okienkowa

Python jest interpreterem poleceń. Mamy dwie możliwości wydawania owych poleceń:

OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)

Czym jest sygnał PWM?

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Uwaga: dioda na wyjściu 13 świeci gdy na wyjście podamy 0.

Nazwa implementacji: Nauka języka Python pętla for. Autor: Piotr Fiorek

Języki C i C++ Wykład: 2. Wstęp Instrukcje sterujące. dr Artur Bartoszewski - Języki C i C++, sem. 1I- WYKŁAD

Dla człowieka naturalnym sposobem liczenia jest korzystanie z systemu dziesiętnego, dla komputera natomiast korzystanie z zapisu dwójkowego

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Urządzenia Techniki. Klasa I TI. System dwójkowy (binarny) -> BIN. Przykład zamiany liczby dziesiętnej na binarną (DEC -> BIN):

Podstawy Programowania Podstawowa składnia języka C++

Powtórka algorytmów. Wprowadzenie do języka Java.

Kurs Elektroniki. Zastosowanie elektroniki w robotyce cz

Laboratorium Wstawianie skryptu na stroną: 2. Komentarze: 3. Deklaracja zmiennych

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Schemat blokowy architektury AVR

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

Poradnik programowania procesorów AVR na przykładzie ATMEGA8

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Kurs Arduino dla początkujących - Michał Jaworski str. 1. Lekcja 5

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

1 Podstawy c++ w pigułce.

Wprowadzenie do języka Java

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

Podstawy programowania w C++

Instrukcja do programu BASIC PR-02

instrukcja użytkownika terminala ARGOX PA-20 SYSTEMY AUTOMATYCZNEJ IDENTYFIKACJI

Instrukcje warunkowe i skoku. Spotkanie 2. Wyrażenia i operatory logiczne. Instrukcje warunkowe: if else, switch.

Rafał Staszewski Maciej Trzebiński, Dominik Derendarz

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Projekt współfinansowany ze środków Unii Europejskiej w ramach Europejskiego Funduszu Społecznego

Temat 1. Więcej o opracowywaniu tekstu

Tematem projektu jest oparty na Arduino zegar pokazujący godzinę oraz datę.

Zmierzyć się z żywiołami, czyli jak zbudować własną stację badawczą! Zaczynamy! Pole komunikatów programu. Nawigacja w programie Arduino

Laboratorium Komputerowe Systemy Pomiarowe

Jak zawsze wyjdziemy od terminologii. While oznacza dopóki, podczas gdy. Pętla while jest

Podstawy i języki programowania

Naukę zaczynamy od poznania interpretera. Interpreter uruchamiamy z konsoli poleceniem

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

urządzenia BLIX POWER do sieci. Urządzenie podłączane jest równolegle do

Teraz możesz kupić zestaw ponad 70 elementów niezbędnych do przeprowadzenia ćwiczeń z kursu u naszych dystrybutorów!

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

MoboLab roboty i tablety w Twojej szkole Obszar II. Stwórz własnego robota Scenariusze lekcji i zajęć pozalekcyjnych

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Ćwiczenia podstawowe, zestaw 5, część 1

Projekt współfinansowany ze środków Unii Europejskiej w ramach Europejskiego Funduszu Społecznego

System Liczbowe. Szesnastkowy ( heksadecymalny)

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Ćwiczenia nr 2. Edycja tekstu (Microsoft Word)

1. Wprowadzanie danych z klawiatury funkcja scanf

while(wyrażenie) instrukcja

Pytania sprawdzające wiedzę z programowania C++

Python wprowadzenie. Warszawa, 24 marca PROGRAMOWANIE I SZKOLENIA

Laboratorium Wykorzystanie kalkulatora Windows do obliczania adresów sieciowych

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Język C : programowanie dla początkujących : przewodnik dla adeptów programowania / Greg Perry, Dean Miller. Gliwice, cop

Kod produktu: MP01105T

Instrukcja dla: Icomsat v1.0 SIM900 GSM/GPRS shield for Arduino oraz dla GPRS Shield produkcji Seeedstudio.

ARCHITEKTURA KOMPUTERÓW Systemy liczbowe

Ćwiczenie: JavaScript Cookies (3x45 minut)

1 Przygotował: mgr inż. Maciej Lasota

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

Opis procedur asemblera AVR

INFORMATYKA Studia Niestacjonarne Elektrotechnika

Pętle. Dodał Administrator niedziela, 14 marzec :27

while (test) instrukcja; int i=0; while (i<10) i++; dopóki test prawdziwy wykonuj instrukcję Wykonano: 35% / \ fałsz test prawda instrukcja

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

XII. Warunek wielokrotnego wyboru switch... case

PODSTAWY OBSŁUGI EDYTORA TEKSTU WORD

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Łączenie liczb i tekstu.

for (i=0; i<10; i=i+1) instrukcja; instrukcja zostanie wykonana 10 razy for (inicjalizacja; test; aktualizacja) instrukcja;

Powtórka algorytmów. Wprowadzenie do języka Java.

Widoczność zmiennych Czy wartości każdej zmiennej można zmieniać w dowolnym miejscu kodu? Czy można zadeklarować dwie zmienne o takich samych nazwach?

Czym są właściwości. Poprawne projektowanie klas

Transkrypt:

Kurs Arduino # kontynuacja UART, serwomechanizmy W tej części zajmiemy się kilkoma tematami. Po pierwsze wrócimy na chwilę do UART, omówimy również nowe instrukcje sterujące. Na koniec praktyczne zastosowanie dla serwa. Przed czytaniem upewnij się, że znasz podstawy opisane w dotychczasowych częściach naszego darmowego kursu Arduino dla każdego! Reprezentacja liczb w terminalu W trzeciej części kursu wykorzystywaliśmy interfejs UART do komunikacji z komputerem. Były tam używane funkcje do nadawania oraz odbierania informacji. Jednak nie omówiłem wtedy wszystkich możliwości jakie daje nam pozornie prosta funkcja println. W przykładach, które pojawiły się do tej pory wykorzystana była ona w najprostszej formie, czyli z jednym argumentem liczbą lub ciągiem znaków, który ma zostać przesłany. Informacje widoczne w terminu są czytelne dla człowieka, ponieważ Arduino zamienia je na kody ASCII. Tak naprawdę, nawet liczby przesyłane są jako tekst. Wszystkie wartości, które przesyłaliśmy w realizowanych zadaniach wyświetlaliśmy w systemie dziesiętnym. Co jeśli zależałoby nam na wyświetlaniu liczb np.: binarnych? Czy musimy stworzyć własne funkcje zamieniające reprezentację wartości na inne systemy? Nie! W tym miejscu warto przypomnieć, że komputery posługują się głównie systemem binarnym, więc każdy inny (w tym nasz, dziesiętny) jest wymuszany sztucznie. Na szczęście biblioteki Arduino zawierają szereg udogodnień dla użytkowników końcowych. W tym wsparcie kilku systemów reprezentacji liczb. Gdy przesyłamy za pomocą println jakąś wartość, to możemy zadecydować jak ma być ona wyświetlana na komputerze: 0 [...] int liczba = ; Serial.println(liczba); //Wyświetl w systemie dziesiętnym Serial.println(liczba, DEC); //Wyświetl w systemie dziesiętnym Serial.println(liczba, HEX); //Wyświetl w systemie szesnastkowym Serial.println(liczba, OCT); //Wyświetl w systemie ósemkowym Serial.println(liczba, BIN); //Wyświetl w systemie binarnym [...] Jak widać było to w eksperymentach z poprzednich części domyślnie liczby wyświetlane są w formie dziesiętnej, ale do wyboru mamy jeszcze system: szesnastkowy, ósemkowy oraz binarny. W praktyce najczęściej wykorzystywać będziesz zapewne domyślną, dziesiątkową reprezentację oraz binarną. Pamiętaj, że podstawą w zrozumieniu programowania jest praktyka. Nie będziesz umiał wykorzystać zdobytej tu wiedzy, jeśli nie wykonasz ćwiczeń z kursu. Zestaw elementów do przeprowadzenia ćwiczeń Gwarancja pomocy na forum dla osób, które kupią poniższy zestaw!

Teraz możesz kupić zestaw ponad 0 elementów niezbędnych do przeprowadzenia ćwiczeń z kursu u naszych dystrybutorów! Precyzja liczb niecałkowitych Jak było omawiane we wcześniejszych częściach kursu, możliwa jest również deklaracja zmiennej, które będzie przechowywała liczbę niecałkowitą, np.:,. Do tej pory nie zajmowaliśmy się takimi przykładami, bo dobrą praktyką jest unikanie na mikrokontrolerach liczb z częścią ułamkową. Operacje takie dla komputerów są stosunkowo trudne i zajmują więcej czasu. Załóżmy jednak, że koniecznie chcemy wyświetlić taką liczbę. Mógłby do tego posłużyć bardzo krótki, poniższy program: 0 void setup() { float liczbapi =.; //Deklaracja zmiennej Serial.begin(00); //Inizjalizacja UART Serial.println(liczbaPI, ); // miejsca po przecinku Serial.println(liczbaPI, 0); //0 miejsc po przecinku Serial.println(PI); //Zagadka void loop() { Uruchomienie powyższego programu, powinno przynieść następujący efekt:

Precyzja wyświetlanych liczb. Jak widać, jeśli przesyłamy liczbę, to dodatkowym parametrem może być cyfra określająca z jaką precyzją mają być wyświetlane wartości. Należy przy tym pamiętać, że zmienne typu float są reprezentowane na maksymalnie cyfrach niezależnie od tego ile jest ich za, a ile przed przecinkiem. Przykładowo: float liczba = 0. poprawnie float liczba =. poprawnie float liczba =. poprawnie float liczba =. błędnie Dla uzyskania większej precyzji ( cyfr) należy skorzystać ze zmiennych double! Wróćmy jeszcze na chwilę do powyższego programu, konkretnie do zagadkowej linijki: Serial.println(PI); //Zagadka Dlaczego komenda ta spowodowała wyświetlenie wartości.? Nawet nigdzie nie deklarowaliśmy takiej zmiennej. Otóż wartość liczby Pi jest tak często używana, że w wielu językach znaleźć można gotowe stałe, które są równie przybliżeniu liczby Pi. W przypadku jest to PI, które w dowolnym miejscu programu zostanie zamienione na odpowiednią wartość. Jednak UWAGA! Można tutaj narazić się na bardzo poważne zagrożenie! Przykładowo, dążąc do wysokiej precyzji naszego programu moglibyśmy wywołanie funkcję: Serial.print(PI, ); Ku naszemu zadowoleniu na ekranie pojawi się wtedy bardzo dokładna wartość:.0 Wróćmy jednak pamięcią do maksymalnych precyzji jakie oferują nam mikrokontrolery, okazuje się, że stała PI ma właściwości zmiennej float, czyli przyjmuje tylko cyfr! Każda kolejna jest błędna, ponieważ najbardziej dokładny zapis wartości niecałkowitych w systemie binarnym nie pozwala na uzyskanie odpowiedniego, prawdziwego Pi. Więcej na ten temat można zobaczyć w specjalnym kalkulatorze, który zasugerował w komentarzach czytelnik atmel. Poniższe zestawienie to nasza wyświetlona liczba oraz prawdziwe Pi:.00. Z powyższych przykładów należy zapamiętać, że gdy tylko można, to należy unikać liczb niecałkowitych (można obyć się bez ich pomocy w % przypadków). Jednak jeśli już je używamy, to z rozsądkiem, pamiętając o ograniczonej precyzji!

Wszystko od nowej linii? Do tej pory każda wyświetlana w terminalu wartość pojawiała się w nowej linii. Było to czytelne, ale nie zawsze użyteczne. Co w przypadku, gdy chcielibyśmy wyświetlić kilka zmiennych oraz tekstów obok siebie? Z pomocą przychodzi bliźniacza do println funkcja print (bez końcówki ln od line). Posiada ona dokładnie te same wartości, co używana do tej pory println. Oprócz tego, że każda wysłana wartość pojawia się w nowej linii. Przykład: void setup() { Serial.begin(00); //Inicjalizacja UART void loop() { Serial.print("Witaj w kursie na Forbot.pl! "); //Wyświetlenie tekstu delay(000); //Opóźnienie dla większej wygody Program nie zachwyca swoim działaniem, ale demonstruje to, co najważniejsze (brak nowej linii): Funkcja print w praktyce. Jak można przejść do nowej linii w wybranym miejscu? Na trzy sposoby: 0 Serial.print("Pierwsza linia"); Serial.println(); Serial.print("Druga linia"); LUB Serial.println("Pierwsza linia"); Serial.print("Druga linia"); LUB Serial.print("Pierwsza linia \n Druga linia"); Zdecydowanie najciekawszy sposób, to ten ostatni. Pojawia się tam nowy symbol \n. Jest on spotykany nie tylko w Arduino i oznacza przejście do nowej linii. Jak widać jest bardzo wygodny ponieważ pozwala na łamanie wiersza w dowolnym momencie. Czy istnieją inne przydatne symbole tego typu? Tak! Do formatowania wyświetlanego tekstu może przydać się jeszcze możliwość używania tabulacji (wcięcia, dużego odstępu). Jeśli będziemy chcieli przesunąć w prawo, to zamiast nieładnego wpisywania kilku spacji należy wykorzystać symbol \t tabulator. Nowa informacje o UART w praktyce

Pora na wykorzystanie powyższych informacji w praktyce. Celem naszego programu jest pomiar wartości napięcia na pinie A, a następnie wyświetlenie go w terminalu. Jednak tym razem nie wystarczy wyświetlenie liczby w systemie dziesiętnym. Dodatkowo w jednym wierszu mają być wyświetlane wartości w HEX, OCT oraz BIN. Oczywiście całość ma być ładnie sformatowana! Na początku należy podłączyć prosty układ. Ja do zmiany napięcia wykorzystałem potencjometr. Jednak równie dobrze możesz w tym miejscu umieścić dzielnik napięcia z fotorezystorem. Jeśli nie pamiętasz jak, to zajrzyj do części kursu. Potencjometr podłączony do A. Mam nadzieję, że wcześniejsze informacje nie sprawiły Ci dużo problemów, więc pozwolę sobie na umieszczenie od razu gotowego programu. Oczywiście, koniecznie przeanalizuj jego działanie i napisz samodzielnie podobny program! 0 void setup() { Serial.begin(00); //Inicjalizacja UART void loop() { int potencjometr = analogread(a); //Odczytanie wartości ADC Serial.print("Odczyt: "); Serial.print(potencjometr, DEC); Serial.print("[DEC]\t"); Serial.print(potencjometr, HEX); Serial.print("[HEX]\t"); Serial.print(potencjometr, OCT); Serial.print("[OCT]\t"); Serial.print(potencjometr, BIN); Serial.print("[BIN]\n"); delay(000); //Opóźnienie dla wygody Po uruchomieniu programu, w terminalu, powinniśmy obserwować ładnie sformatowane wartości ADC pokazywane w różnych systemach zapisu liczb:

Arduino różna reprezentacja liczb. Zachęcam do eksperymentów we własnym zakresie. Jest to również idealna okazja do ćwiczenia ręcznej konwersji liczb na różne systemy. Na tym zakończymy część o UART, pora iść dalej. Zadanie domowe. Napisz program, który odczytuje informację dwóch fotorezystorów oraz potencjometru. Następnie po wciśnięciu przycisku podłączonego do Arduino wysyłaj jeden raz linijkę zawierającą informacje: Fotorezystor : XXX, fotorezystor: XXX, potencjometr: XXX, przycisk wciśnięto XX razy Gdzie zamiast X pojawią się oczywiście właściwe wartości. Instrukcja sterująca switch Pora na omówienie bardzo często używanej instrukcji sterującej switch. Jest ona wykorzystywana w sytuacjach, gdy na podstawie jednej zmiennej wykonujemy kilka różnych akcji uzależnionych od wartości, którą sprawdzaliśmy. W celu zrozumienia instrukcji switch posłużę się przykładem, który następnie zostanie rozwiązany na dwa sposoby tradycyjnie oraz nową metodą. Załóżmy więc, że chcemy napisać program, który odczyta wartość ADC, a następnie odeśle ją do nas w formie liczby dziesiętnej, szesnastkowej, ósemkowej lub binarnej. Wszystko zależy od naszego wyboru. Dysponując aktualną wiedzą moglibyśmy napisać program korzystający z warunków: 0 0 String odebranedane = ""; //Pusty ciąg odebranych danych void setup() { Serial.begin(00); //Inicjalizacja UART void loop() { int potencjometr = analogread(a); //Odczytanie wartości ADC if(serial.available() > 0) { //Czy Arduino odebrano dane odebranedane = Serial.readStringUntil('\n'); //Jeśli tak, to odczytaj je do znaku końca linii if (odebranedane == "d") { Serial.println(potencjometr, DEC); else if (odebranedane == "h") { Serial.println(potencjometr, HEX); else if (odebranedane == "o") { Serial.println(potencjometr, OCT); else if (odebranedane == "b") { Serial.println(potencjometr, BIN);

delay(000); //Opóźnienie dla wygody Wykonalne? Tak. Wygodne? Średnio, szczególnie gdyby warunków było dużo więcej lub nagle konieczna byłaby zmiana warunków. Z pomocą przychodzi nowa instrukcja sterująca switch-case. Wygląda ona następująco: Arduino 0 switch (WartośćDoSprawdzenia) { case Wartość_: //Kod wykonywany jeśli warunek spełniony case Wartość_: //Kod wykonywany jeśli warunek spełniony [...] default: //Kod wykonywany jeśli żaden warunek nie był spełniony Na początku piszemy słowo kluczowe switch, następnie w nawiasie okrągłym podajemy zmienną, którą chcemy sprawdzić. W analogicznym przykładzie do poprzedniego z if ami byłoby to: switch (odebranedane) { Następnie otwieramy nawiasy klamrowe. W ich wnętrzu możemy wpisać dowolną ilość warunków, które będą kolejno sprawdzane. Robimy to pisząc słowo case, a po spacji wstawiamy wartość, której musi być równa sprawdzana zmienna. Całość kończymy znakiem dwukropka :. Jeśli warunek zostanie spełniony to wykona się kod od momentu warunku do najbliższego słowa break, które spowoduje wyjście z całego switcha. Gdy warunek nie będzie spełniony, to część kodu jest ignorowana i mikrokontroler przechodzi do sprawdzenia kolejnego warunku (case). Zapamiętaj! Instrukcja switch-case, przydaje się, gdy chcemy sprawdzić czy wartości są równe! Na końcu znajduje opcjonalnie możemy umieścić kod pomiędzy default oraz break. Zostanie on wykonany, gdy żaden z wcześniejszych warunków nie został spełniony. Zdaje sobie sprawę, że może brzmieć to skomplikowanie dlatego przejdziemy teraz do przykładu praktycznego i przerobimy wcześniejszy program. 0 0 int odebranedane = 0; //Pusty ciąg odebranych danych void setup() { Serial.begin(00); //Inicjalizacja UART void loop() { int potencjometr = analogread(a); //Odczytanie wartości ADC if(serial.available() > 0) { //Czy Arduino odebrano dane odebranedane = Serial.read(); //Jeśli tak, to odczytaj znak switch (odebranedane) { case 'd': Serial.println(potencjometr, DEC); case 'h': Serial.println(potencjometr, HEX);

0 case 'o': Serial.println(potencjometr, OCT); case 'b': Serial.println(potencjometr, BIN); delay(000); //Opóźnienie dla wygody Mała uwaga, instrukcja sterująca switch działa tylko na podstawie porównywania liczb. Dlatego w tym przykładzie litery, którymi sterujemy: d, h, o, b musimy traktować nie jako litery, a jako kody ASCII. Zapis litery w pojedynczych apostrofach, obok case, powoduje, że są one traktowane właśnie jako kody ASCII. Co więcej zamiast poprzednio używanej funkcji odczytującej dane: Arduino odebranedane = Serial.readStringUntil('\n'); Wykorzystana została prostsza wersja funkcji, które odczytuje jedynie pierwszy bajt (znak) danych: Arduino odebranedane = Serial.read(); //Jeśli tak, to odczytaj znak Dzięki temu mogliśmy porównywać przesyłane komendy i wykonywać odpowiednie operacje. Mam nadzieję, że instrukcja switch będzie dla Ciebie jeszcze bardziej zrozumiała, gdy wykonamy kolejne przykłady praktyczne. Zadanie domowe. Wróć do zadania domowego nr., które znajduje się w trzeciej części kursu Arduino i wykonaj je tym razem z wykorzystaniem instrukcji switch. Serwomechanizm w praktyce wskaźnik światła Pora na obiecane wykorzystanie serwomechanizmu w praktyce. Aktualnie coraz więcej informacji prezentowanych jest w sposób cyfrowy, czyli na wyświetlaczu. Jednak niektóre wartości, takie jak temperatura, intensywność oświetlenia itd. lepiej prezentują się na tradycyjnych analogowych wskaźnikach. Czyli takich ze wskazówką:

Wskaźniki analogowe. Dlatego teraz zbudujemy analogowy wskaźnik nasłonecznienia z wykorzystaniem microserwa. Wskazówka umieszczona na jego ramieniu będzie wskazywała ilość światła padającą na czujnik. Potrzebne do tego będzie Arduino z podłączonym fototranzystorem w układzie dzielnika napięcia oraz serwomechanizm. Schemat montażowy gotowego urządzenia prezentuje się tak, jak poniżej: Schemat montażowy. Jest on odrobinę zawiły, jednak tak naprawdę składa się z dwóch prostych schematów. Pierwszy to podłączenie serwomechanizmu wraz z zasilaniem ze stabilizatora. Dodatkowo dwa kondensatory pojawiły się zaraz obok tego regulatora napięcia. podobny schemat znaleźć można w poprzedniej części kursu Arduino, natomiast więcej o samych stabilizatorach zostało napisane w odpowiednim odcinku kursu elektroniki. Uważaj podłączając serwo i baterię, aby niczego nie uszkodzić! Druga część schematu to podłączenie rezystora i fotorezystora w dzielnik napięcia. Dokładniejsze informacje na ten temat znaleźć można w części dotyczącej ADC w Arduino. Cześć mechaniczna projektu

Warto od razu pomyśleć nad profesjonalną tarczą i wskazówką. Ja tarczę wykonałem z kilku sklejonych wizytówek oraz wydrukowanej skali. Strzałka została wykonana w podobny sposób. Do łączenia elementów polecam klej na ciepło (z pistoletu) lub taśmę dwustronną. Używanie klejów typu kropelka, to duża szansa na sklejenie elementów ruchomych serwa, które będzie wtedy nadawało się jedynie do wyrzucenia! Tarcza analogowe bez wskazówki. Widok od tyłu. Jakość wykonania nie jest najwyższa, jednak są to tylko eksperymenty i liczy się efekt:

Gotowy wskaźnik analogowy. Program jest stosunkowo prosty. Jego zadaniem jest cykliczny pomiar światła padającego na fotorezystor oraz sterowanie wychyleniem serwomechanizmu. Głównie zostały wykorzystane do tego poznane już wcześniej funkcje: 0 0 #include <Servo.h> //Biblioteka odpowiedzialna za serwa Servo serwomechanizm; //Tworzymy obiekt, dzięki któremu możemy odwołać się do serwa byte pozycja = 0; //Aktualna pozycja serwa 0-0 int pozycjapoprzednia = 0; void setup() { serwomechanizm.attach(); //Serwomechanizm podłączony do pinu Serial.begin(00); void loop() { int odczytczujnika = analogread(a); //Odczytujemy wartość z czujnika pozycja = map(odczytczujnika, 0, 00, 0, 0); //Zamieniamy ją na pozycję serwa if (abs(pozycja-pozycjapoprzednia) > ) { //Sprawdzamy czy pozycje różnią się o ponad stopni serwomechanizm.write(pozycja); //Wykonajujemy ruch pozycjapoprzednia = pozycja; //Zapamiętujemy aktualną pozycję jako poprzednią Serial.println(odczytCzujnika); //Wysyłamy wartość do terminala delay(00); //Opóźnienie dla lepszego efektu Wyjaśnienia może wymagać nowa funkcja abs(). Jest ona bardzo użyteczna w sytuacjach jak powyższa ponieważ zwraca wartość bezwzględną. Czyli niezależnie czy odejmiemy liczbę mniejszą od większej, czy odwrotnie, to uzyskamy wynik dodatni. W przypadku tego programu zapamiętujemy również aktualną pozycję serwa, do zmiennej globalnej pozycjapoprzednia. Dzięki temu w kolejnym obiegu pętli ruch wykonamy tylko przy dużej zamianie natężenia światła. W przeciwnym wypadku nasza wskazówka mogłaby drgać. Polecam eksperymenty z wartością, od której wykonujemy ruch.

Każdy powinien wykonać kalibrację systemu dla własnych warunków! (opis poniżej) Program jest bardzo prosty, więc nie ma mechanizmów kalibracji autoamtycznej. W związku z tym, przez UART, wysyła do komputera aktualną wartość odczytaną z czujnika światła. Najszybsza kalibracja może polegać na podejrzeniu jaką najniższą i najwyższą wartość obserwujemy podczas zasłaniania oraz oświetlania czujnika. Następnie należy uwzględnić je w tej linijce: pozycja = map(odczytczujnika, 0, 00, 0, 0); //Zamieniamy ją na pozycję serwa Po kilku minutach prób i regulacji mój wskaźnik był gotowy do działania. Efekt widoczny jest na poniższej animacji. Fotorezystor był zasłaniany ręką, a następnie stopniowo oświetlany latarką. Wskaźnik analogowy z wykorzystaniem Arduino. Zachęcam do zmian ustawień i testowania nowych programów. Odradzam jednak zbyt szybkie ruszanie serwem. Może to wprowadzać pewne problemy lub uszkodzić stosunkowo delikatny silnik. proponuję nie schodzić poniżej 00 ms ustawianych w tej linijce: Arduino delay(00); //Opóźnienie dla lepszego efektu Zadanie domowe. Dopracuj układ ze wskaźnikiem analogowym. Spróbuj dodać mechanizm kalibracji. Znajdź inne praktyczne zastosowanie dla takiego układu! Zadanie domowe. Wstaw w komentarzu zdjęcie przygotowanego przez siebie wskaźnika! Podsumowanie Część dodatkowa, uzupełniająca wyszła całkiem długa. Mam jednak nadzieję, że będzie pomocna. Ze smutkiem po raz kolejny ze smutkiem stwierdzam, że rozpisałem się zbyt mocno. W związku z tym część materiału została przesunięta do kolejnego artykułu. Konkretnie chodzi o sterowanie silnikami DC. Zagadnienie to jest (nie)stety zbyt ważne, aby potraktować je skrótowo.