Mechatronika - FAQ
Dodany 6 Listopad 2011 przez krzysztof.bytow Komentarze: 0
1. Podstawowe elementy modułu-interfejsu.
Musisz być zalogowany w serwisie aby móc zobaczyć tą treść.
2. Podłączenie i uruchomienie zestawu.
Podłączenie i uruchomienie sprowadza się do podłączenia modułu-interfejsu przewodem USB do gniazda w komputerze PC. O poprawnej pracy sygnalizuje dioda świecąca na zielono. W przypadku gdy dioda się nie świeci należy sprawdzić przewód USB, gdyby dalej występował problem należy sprawdzić port USB (najlepiej w innym komputerze), może się zdarzyć iż wydajność portu jest za mała aby zasilić układ (dotyczy w szczególności starszych komputerów oraz wszelkiego typu przedłużaczy USB na których można zauważyć spadek napięcia)
3. Uruchomienie środowiska Arduino jego wstępna konfiguracja i obsługa.
Opis panelu środowiska Arduino
Musisz być zalogowany w serwisie aby móc zobaczyć tą treść.
4. Budowa i elementy składowe języka programowania.
Standardowo IDE Arduino zawiera bibliotekę C/C++ o nazwie 'Wiring’, dzięki czemu wykonywanie podstawowych operacji wejścia/wyjścia staje się znacznie łatwiejsze. Programy dla Arduino są napisane głównie w języku C/C++, jednak użytkownicy muszą zdefiniować jedynie dwie funkcje, aby otrzymać gotowy do uruchomienia program:
void setup()
{
...
}
void loop()
{
...
}
Zadaniem funkcji 'setup’ jest wstępna inicjalizacja programu, ustawia się tu stan układów, tak by w głównej części z nich korzystać. (funkcja wykonywana raz, na początku działania programu)
Funkcja 'loop’ to główna pętla programu. Jest wywoływana bez przerwy od nowa i wykonywana do momentu zaniku zasilania. Umieszczamy w niej główne części programu. (funkcja wywoływana wielokrotnie).
5. Do czego służą Biblioteki – jak z nich korzystać i tworzyć własne.
Programowanie w środowisku Arduino dzięki dostępności przeróżnych bibliotek obsługujących zewnętrzne urządzenia staje się bardzo proste. Biblioteki obsługują między innymi wyświetlacze LCD, układy zegarowe, akcelerometry, zewnętrzne pamięci, EEPROM, GPS itd. Dzięki temu, że każdy może stworzyć własną bibliotekę i opublikować ją w internecie, osoba programująca ma ułatwione zadanie w sterowaniu zewnętrznymi układami. Uruchomienie i obsługa skomplikowanego urządzenia odbywa się w kilku liniach kodu. Dlatego warto wiedzieć jak zbudować własną bibliotekę.
Przeanalizujmy schemat i kod do sterowania buzzerem
Musisz być zalogowany w serwisie aby móc zobaczyć tą treść.
Kod Alarmu
int pin = 7;
void setup ()
{
pinMode(pin, OUTPUT);
}
void loop ()
{
wlacz(750, 500);
delay(750);
}
void wlacz(long x1, int x2)
{
x1 *= 1000;
int dl = (1.0 / x2) * 1000000;
long czas = 0;
while (czas < x1)
{
digitalWrite(pin,HIGH);
delayMicroseconds(dl / 2);
digitalWrite(pin, LOW);
delayMicroseconds(dl / 2);
czas += (dl);
}
}
Powyższy kod składa się z kilku różnych części, które umieścimy w naszej bibliotece. Po pierwsze, mamy funkcje: wlacz(), która odpowiada za generowanie dzwięku. Po za tym, w projekcie korzystamy ze zmiennej pin definiującej pin do którego podłączyliśmy buzzer oraz funkcję pinMode, która ustawia ten pin w tryb wyjściowy.
Zamiana projektu w bibliotekę
Biblioteka, zawsze składa się z minimum dwóch plików. Należy utworzyć plik nagłówkowy alarm.h oraz plik źródłowy alarm.cpp. Pliki można utworzyć w dowolnym edytorze tekstowym. Plik nagłówkowy zawiera wszystkie definicje biblioteki, czyli spis wszystkiego co jest w niej zawarte. Plik źródłowy zawiera właściwy kod.
Plik nagłówkowy:
class Alarm
{
public:
Alarm (int pin);
void wlacz(long x1, int x2);
private:
int _pin;
};
———————————————
Plik nagłówkowy składa się z deklaracji wszystkich funkcji zastosowanych w bibliotece oraz deklaracji potrzebnych zmiennych. Całość znajduje się wewnątrz klasy. Klasa jest zbiorem zmiennych i funkcji, które na nich operują. Elementy klasy mogą być zdefiniowane jako publiczne (public), co oznacza, że dostęp do nich nie jest niczym ograniczony oraz jako prywatne (private), co oznacza, że dostęp do nich mają tylko inne elementy tej klasy . Każda klasa posiada specyficzną funkcję zwaną konstruktorem, która jest wykorzystywana przy tworzeniu instancji klasy. Konstruktor ma tą samą nazwę, co klasa i nie zwraca żadnej wartości. Plik nagłówkowy uzupełnimy jeszcze o dołączenie pliku dającego nam dostęp do standardowych typów i stałych stosowanych przez Arduino (#include “WProgram.h”) oraz zabezpieczenie przed kilkukrotnym dołączeniem naszego pliku nagłówkowego do projektu (#ifndef alarm_h)*.
Ostatecznie mamy:
#ifndef alarm_h
#define alarm_h
#include “WProgram.h”
class Alarm
{
public:
Alarm (int pin);
void wlacz(long x1, int x2);
private:
int _pin;
};
#endif
——————————————
Plik źródłowy alarm.cpp
Na początek dołączmy plik WProgram.h oraz plik nagłówkowy.
#include “WProgram.h”
#include “alarm.h”
Teraz zdefiniujmy konstruktor – jest to funkcja wywoływana w momencie utworzenia obiektu z naszej klasy. W naszym przypadku użytkownik definiuje na którym wyjściu ma się pojawić sygnał. Ustawiamy więc ten pin jako wyjściowy i zapamiętujemy w wewnętrznej zmiennej jego numer.
Alarm::Alarm(int pin)
{
pinMode(pin, OUTPUT);
_pin = pin;
}
Zapis Alarm:: oznacza, że funkcja której nazwa pojawia się za tym zapisem, jest częścią klasy Alarm.
void Alarm::wlacz(long x1, int x2)
{
x1 *= 1000;
int dl = (1.0/x2)*1000000;
long czas = 0;
while (czas < x1)
{
digitalWrite(_pin,HIGH);
delayMicroseconds(dl / 2);
igitalWrite(_pin, LOW);
delayMicroseconds(dl / 2);
czas += (dl);
}
}
A oto wynikowy kod pliku źródłowego alarm.cpp
#include “WProgram.h”
#include “alarm.h”
Alarm::Alarm (int pin)
{
pinMode (pin, OUTPUT);
_pin = pin;
}
void Alarm::wlacz(long x1, int x2)
{
x1 *= 1000;
int dl = (1.0/x2)*1000000;
long czas = 0;
while (czas < x1)
{
digitalWrite(_pin,HIGH);
delayMicroseconds(dl / 2);
digitalWrite(_pin, LOW);
delayMicroseconds(dl / 2);
czas += (dl);
}
}
—————————————
Mając stworzone dwa wyżej wymienione pliki możemy użyć naszej biblioteki. W tym celu należy stworzyć katalog alarm w podkatalogu libraries Arduino. Do utworzonego katalogu skopiujmy pliki alarm.h oraz alarm.cpp. Teraz można już uruchomić środowisko programistyczne Arduino. Gdy otworzymy menu Sketch > Import Library, ujrzymy pozycję Alarm.
Zmieńmy zatem nasz stary kod w nowy, korzystający z biblioteki.
#include <alarm.h>
Alarm Alarm(7);
void setup ()
{
}
void loop ()
{
Alarm.wlacz(750,500);
delay(750);
}
W nowym kodzie musimy dołączyć naszą bibliotekę, aby jej funkcjonalność była dla nas dostępna (#include “alarm.h”). Druga rzecz, to wywołanie instancji naszej klasy (Alarm alarm(7);). Instancja klasy będzie miała w tym przypadku nazwę alarm.
W porównaniu do poprzedniego kodu, tym razem, aby wygenerować dźwięk musimy wywołać funkcję wlącz() z odpowiednim przedrostkiem.
6. Wpisywanie kodu implementacji, kompilacja i wgrywanie do modułu-interfejsu.
Musisz być zalogowany w serwisie aby móc zobaczyć tą treść.
Musisz być zalogowany w serwisie aby móc zobaczyć tą treść.
Musisz być zalogowany w serwisie aby móc zobaczyć tą treść.
Musisz być zalogowany w serwisie aby móc zobaczyć tą treść.
Musisz być zalogowany w serwisie aby móc zobaczyć tą treść.
Musisz być zalogowany w serwisie aby móc zobaczyć tą treść.
Musisz być zalogowany w serwisie aby móc zobaczyć tą treść.
7. Niech stanie się światło – prosty kod do obsługi diody LED.
Jednym z najprostszych ćwiczeń jest sterowanie diodą zarówno wbudowaną w moduł jak i złożoną z elementów. Ćwiczenie z diodą pozwoli nam na zaprezentowanie różnych modyfikacji urozmaicając implementacje. Podstawą jest schemat gdzie zapalamy diodę i gasimy ją przy zadanym czasie.
Musisz być zalogowany w serwisie aby móc zobaczyć tą treść.
Kod pozwalający na zapalenie i gaszenie diody:
int dioda = 7;
void setup()
{
pinMode(dioda, OUTPUT);
}
void loop()
{
digitalWrite(dioda, HIGH);
delay(1500);
digitalWrite(dioda, LOW);
delay(500);
}
Efekt działania
Lecz tak naprawdę na prezentowany wyżej układ nie mamy wpływu, a z reguły to my chcemy decydować kiedy zapalać i gasić diodę. Dlatego też pozwólmy sobie rozbudować układ o dodatkowy element button (przycisk).
Musisz być zalogowany w serwisie aby móc zobaczyć tą treść.
Przykładowy kod pozwalający na sterowanie diodą – kod_D001:
int dioda = 7;
int button = 8;
void setup()
{
pinMode(dioda, OUTPUT);
digitalWrite(dioda, LOW);
pinMode(button, INPUT);
digitalWrite(button, HIGH);
}
void loop()
{
if(digitalRead(button) == LOW)
{
if(digitalRead(dioda)== HIGH)
{
digitalWrite(dioda, LOW);
delay(250);
}
else
{
digitalWrite(dioda, HIGH);
delay(250);
}
}
}
Kod pozwalający na sterowanie diodą – kod_D002:
Inna możliwość efekt podobny
int dioda = 7;
int button = 8;
void setup()
{
pinMode(dioda, OUTPUT);
digitalWrite(dioda, LOW);
pinMode(button, INPUT);
digitalWrite(button, HIGH);
}
void loop()
{
if(digitalRead(button) == LOW)
{
digitalWrite(dioda, digitalRead(dioda) != HIGH ? HIGH : LOW);
delay(250);
}
}
Kod pozwalający na sterowanie diodą – kod_D003:
Inna możliwość efekt podobny
int dioda = 7;
int button = 8;
void setup()
{
pinMode(dioda, OUTPUT);
digitalWrite(dioda, LOW);
pinMode(button, INPUT)
digitalWrite(button, HIGH);
}
void loop()
{
if(digitalRead(button) == LOW)
{
if(digitalRead(dioda)== HIGH)
{
digitalWrite(dioda, LOW);
delay(250);
goto fin;
}
if(digitalRead(dioda)== LOW)
{
digitalWrite(dioda, HIGH);
delay(250);
goto fin;
}
}
fin:
{
}
}
Efekt działania
Efektem powyższych kodów jest tak naprawdę zapalanie i gaszenie diody. Różnorodność w programowaniu pozwala nam dojść do tego samego efektu różnymi drogami. Niektóre pozwolą skrócić czas i osiągnąć zamierzony efekt niskim kosztem programowania , a niektóre pochłoną czas lecz i tak osiągniemy efekt. Ile osób tyle pomysłów na zrealizowanie jednego celu.
Lecz pójdźmy dalej, zamierzeniem będzie zapalanie diody gdy osiągnięta zostanie określona temperatura, nie interesuje nas tutaj aby dowiedzieć się o odczytanej wartości chcemy tylko aby przykładowo gdy zostanie osiągnięta temperatura 25⁰ C zapali nam się dioda, a gdy temperatura opadnie dioda zgaśnie (przykładowe zastosowanie można zaobserwować latem zamiast diody upraszczając mamy wentylator który załączy się gdy przy zadanej temperaturze i wyłączy gdy spadnie; inne zastosowanie to sterowanie zaworem węża ogrodowego przy odpowiedniej temperaturze zacznie podlewać; idąc jeszcze dalej możemy użyć schematu jako alarmu gdy zostanie przekroczona temperatura buzzer zacznie piszczeć; przykładów zastosowania można by mnożyć) skupmy się na schemacie
Musisz być zalogowany w serwisie aby móc zobaczyć tą treść.
Kod pozwalający na sterowanie diodą
int dioda = 7;
float temp;
void setup()
{
pinMode(dioda, OUTPUT);
digitalWrite(dioda, LOW);
}
void loop()
{
temp = (analogRead(0)*5/1024.0);
temp = temp – 0.5;
temp = temp / 0.01;
if(temp >= 25)
{
digitalWrite(dioda, HIGH);
}
if(temp <= 25)
{
digitalWrite(dioda, LOW);
}
}
Efekt działania
Rozpatrzmy teraz przypadek iż chcemy sterować diodą w zależności od jasności (natężenia) światła (przykładowo działają ogrodowe lampki solarne led, gdy zapada zmierzch zapalają się, a z rana wyłączają)
Musisz być zalogowany w serwisie aby móc zobaczyć tą treść.
Kod pozwalający na sterowanie diodą
int dioda = 7;
void setup()
{
pinMode(dioda, OUTPUT);
digitalWrite(dioda, LOW);
}
void loop()
{
if (analogRead(0) < 400)
{
digitalWrite(dioda, HIGH);
}
else
{
digitalWrite(dioda, LOW);
}
}
Efekt działania
8. Hello e-SWOI – obsługa wyświetlacza LCD 2×16 opis dodatkowych poleceń.
W przypadku problemu z uruchomieniem wyświetlacza LCD zaleca się ograniczyć liczbę przewodów, poniżej prezentacja schematu i efektu jaki oczekujemy. Kolejnym etapem będzie podłączenie przewodów do sterowania wyświetlanym tekstem.
Kolejnym krokiem jest podłączenie przewodów odpowiedzialnych za dane (wyświetlanie tekstu)
Na koniec pozostało już tylko oprogramowanie układu kodem:
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
void setup()
{
lcd.begin(16, 2);
}
void loop()
{
lcd.clear();
lcd.print(” !!! SWOI !!!”);
lcd.setCursor(0, 1);
lcd.print(” Witaj “);
delay(1000);
}
—————————
Napis przesuwny
—————————
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
void setup()
{
lcd.begin(16, 2);
lcd.print(“Witaj e-SWOI !!!”);
delay(1000);
}
void loop()
{
for (int licznik = 0; licznik < 17; licznik++)
{
lcd.scrollDisplayLeft();
delay(150);
}
for (int licznik = 0; licznik < 34; licznik++)
{
lcd.scrollDisplayRight();
delay(150);
}
for (int licznik = 0; licznik < 16; licznik++)
{
lcd.scrollDisplayLeft();
delay(150);
}
delay(1000);
}

Autor: wieslawa.amietszajewa
7 listopada 2011 10:08:23
Wielkie dzięki Panie Krzysztofie za tak szczegółowe instrukcje. Jest to bardzo cenna pomoc dla trenerów a przede wszystkim dla uczniów. No i oczywiście czekamy na pozostałe...:-)
Autor: rafal.b
8 listopada 2011 03:18:19
Żałuję, że sam nie miałem mechatroniki w szkole. Świetna instrukcja!
Autor: jarek.zok
8 listopada 2011 09:27:34
Instrukcja istotnie pomocna :)
@rafal.b - na naukę człowiek nigdy nie jest za stary ;)