Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

intel Galileo - programowanie i obsługa GPIO w Arduino IDE

intel Galileo posiada identyczny układ złącz GPIO jak w Arduino UNO R3, do którego pasują takie same moduły i skorupki (shield) jak w R3. Programowanie wygląda identycznie jak z każdym innym Arduino za pomocą specjalnej wersji Arduino IDE. intel Galileo posiada również możliwość sterowania pinami z poziomu systemu Linux, ale dziś skupimy się na programowaniu za pomocą Arduino IDE.

Poniżej przestawiam programy do sterowania urządzeniami. Ma to na celu pokazania tylko możliwości sterowania tymi urządzeniami przez intel Galileo, dlatego opisy i schematy podłączenia nie są szerzej opisane jak w typowych poradnikach.

Sterowanie diodami i przekaźnikami

Sterowanie diodami i przekaźnikami odbywa się na zasadzie ustawienia stanów wysokich (włączony) i niskich (wyłączony) na danym cyfrowym pinie.

Dioda RGB

Przykładowy program sterujący diodą RGB wykorzystuje 3 piny cyfrowe oraz jeden pin GND. Ustawienie jednego z pinów na wysoki daje na każdym inny kolor.
Dioda RGB posiada cztery nóżki z czego najdłuższa jest nóżka GND trzy pozostałe to kolory czerwony, zielony i niebieski.

// Ustawiamy nazwy trzech pinów z których będziemy korzystać int red = 2; int green = 5; int blue = 6; void setup() { // ustawiamy piny jako wyjściowe pinMode(red, OUTPUT); pinMode(green, OUTPUT); pinMode(blue, OUTPUT); } void loop() { //ustawiamy czerwony pin na stan wysoki, zaś pozostałe na stan niski digitalWrite(red, HIGH); digitalWrite(green, LOW); digitalWrite(blue, LOW); delay(2000); // czekamy 2 sekundy // ustawiamy stan wysoki na pinie zielonym, na pozostałych niski digitalWrite(red, LOW); digitalWrite(green, HIGH); digitalWrite(blue, LOW); delay(2000); // czekamy 2 sekundy // ustawiamy stan wysoki na pinie niebieskim, na pozostałych niski digitalWrite(red, LOW); digitalWrite(green, LOW); digitalWrite(blue, HIGH); delay(2000); }Po uruchomieniu dioda będzie co dwie sekundy zmieniać kolor świecenia.

Moduł przekaźnikowy

Za pomocą przekaźników możemy sterować zasilaniem różnych urządzeń np. lampami. Sterowanie nimi polega na ustawieniu pinu na stan wysoki gdzie przez układ popłynie prąd, który za pomocą cewki w przekaźniku przełącza włącznik. Więcej informacji o działaniu przekaźnika można przeczytać na wikipedii

Podłączenie wygląda tak że podłączamy piny z intel Galileo do modułu odpowiednio:

  • 5V <> VCC
  • Pin7 <> In1
  • Pin8 <> In2
  • GND <> GND
// ustawiamy numery pinów którymi będziemy sterować int in1 = 7; int in2 = 8; void setup() { //ustawiamy te piny na wyjście pinMode(in1, OUTPUT); pinMode(in2, OUTPUT); } void loop() { //ustawiamy oba piny na stan niski digitalWrite(in1, LOW); digitalWrite(in2, LOW); delay(2000); // czekamy 2 sekundy // ustawiamy pin In1 na stan wysoki digitalWrite(in1, HIGH); digitalWrite(in2, LOW); delay(2000); // czekamy 2 sekundy // ustawiamy oba piny na stan wysoki digitalWrite(in1, HIGH); digitalWrite(in2, HIGH); delay(2000); // czekamy 2 sekundy // ustyawiamy pin In2 na stan wysoki a drugi na niski digitalWrite(in1, LOW); digitalWrite(in2, HIGH); delay(2000); // czekamy 2 sekundy }

Po wgraniu programu nasze przekaźniki będą się włączać po kolei i wyłączać.

Sterowanie silnikiem krokowym i serwem

Silnik krokowy

Do prezentacji wykorzystałem silnik krokowy 28BYJ-48 mający przekładnię 68:1. Silnik sterowany jest za pomocą kontrolera ULN2003. Czym jest silnik krokowy oraz jak działa odsyłam na wikipedie.
Sterowanie polega na zmianie stanów wysokich na każdym z czterech pinów. Dlatego potrzebować będziemy aż czterech pinów z intel Galileo. //ustawiamy numery pinów które będziemy używać do sterowania silnikiem int Pin0 = 10; int Pin1 = 11; int Pin2 = 12; int Pin3 = 13; void setup() { //ustawiamy piny jako wyjściowe pinMode(Pin0, OUTPUT); pinMode(Pin1, OUTPUT); pinMode(Pin2, OUTPUT); pinMode(Pin3, OUTPUT); } void loop() { //ustawiamy stan wysoki tylko na pierwszym pinie digitalWrite(Pin0, HIGH); digitalWrite(Pin1, LOW); digitalWrite(Pin2, LOW); digitalWrite(Pin3, LOW); delay(1); // czekamy 1 milisekundę //ustawiamy stan wysoki tylko na drugim pinie digitalWrite(Pin0, LOW); digitalWrite(Pin1, HIGH); digitalWrite(Pin2, LOW); digitalWrite(Pin3, LOW); delay(1); //ustawiamy stan wysoki tylko na trzecim pinie digitalWrite(Pin0, LOW); digitalWrite(Pin1, LOW); digitalWrite(Pin2, HIGH); digitalWrite(Pin3, LOW); delay(1); //ustawiamy stan wysoki tylko na czwartym pinie digitalWrite(Pin0, LOW); digitalWrite(Pin1, LOW); digitalWrite(Pin2, LOW); digitalWrite(Pin3, HIGH); delay(1); } Po wgraniu programu nasz silnik zacznie się obracać.

Serowo

Serwo działa podobnie jak silnik krokowy tyle tylko , że do samego sterowania używa się jednego złącza, na które ustawia się sygnał o danej częstotliwości. Zazwyczaj serwa maja obrót ustawiony tylko na 90 lub 180 stopni, choć są i obrotowe w 360 stopniach.
Czym jest serwomechanizm i jak działa odsyłam na wikipedie.
Do naszego przykładu użyłem serwa redox s90 mające obrót o 90 stopni.
Serwo ma trzy złącza: czarne (GND), czerwone (zasilanie 5V) oraz białe do sterowania, które podłączamy do pinu trzeciego w Galileo.

#include <Servo.h> #include <Wire.h> Servo servoMain; // Definiujemy nasze serwo void setup() { servoMain.attach(3); // ustawiamy pin 3 do sterowania serwem } void loop() { servoMain.write(0); // ustawiamy serwo na położenie 0 stopni delay(1000); // czekamy 1 sekundę servoMain.write(180); // ustawiamy serwo na wychylenie pełne delay(1000); // czekamy 1 sekundę } Po wgraniu programu nasze serwo zacznie się obracać wahadłowo.

Podsumowanie

Przykłady, które przedstawiłem są tylko kroplą w morzu możliwości i jesteśmy w stanie sterować dużą ilością przeróżnych czujników, sterowników, modułów i układów m.in silnikami i jego obrotami za pomocą złącza PWM. Zainteresowanych większą ilością funkcji i możliwości sterowania odsyłam do strony z opisami funkcji i przykładami.

Poniżej przedstawiam nagranie wyniku działania powyższych programów.

Wcześniejsze części:

W kolejnej części przybliżę możliwość programowania z poziomu systemu Linux zainstalowanego na intel Galileo.

Jeśli znalazłeś błąd, zgłoś go w komentarzu.

Wpis powstał w ramach akcji DP i Intela "Przetestuj sprzęt od Intela" dlatego przy okazji dziękuję za dostarczenie płytki do testów.  

linux sprzęt programowanie

Komentarze

0 nowych
dragonn   10 #1 15.02.2014 16:58

Fajne ;), ale taka mała uwaga zamiast:
int red = 2;
int green = 5;
int blue = 6;
lepiej chyba dać:
const int red = 2;
const int green = 5;
const int blue = 6;
Jeśli nie planujemy ich zmiany w trakcie programu - po co marnować pamięć, z tego co wiem const powinny mniej jej zajmować, albo jeszcze lepiej, ja preferuję:
#define RED 2
#define GREEN 5
#define BLUE 6
Oczywiście pewnie Galileo ma dużo większe zasoby niż jakiś AVR, ale i tak warto się uczyć od razu optymalnego pisania programów ;).

KyRol   17 #2 15.02.2014 17:13

Niezły arsenał akcesoriów do Ardiuno. Chyba pobiłeś rekord jeśli chodzi o inwencję własną wśród testerów;) Bardzo fajne, przede wszystkim treściwe i nierozwlekłe demonstracje. Thumbs up!

Swoją drogą ja kupiłem moduł GSM Siemensa z dual SIM i się kurzy. Znalazłem na własną rękę do niego dokumentację, ale zestaw zawiera dodatkowy układ z 30 nieopisanymi pinami, mógłbym je sprawdzić miernikiem na ślepo, a przy takim stopniu skomplikowania układu się wszystkiego odechciewa. Koleś z aukcji oczywiście się na mnie wypiął z momentem sprzedaży;/

cyryllo   16 #3 15.02.2014 17:35

@dragonn spostrzeżenia jak najbardziej trafne ale nie chciałem zbytnio zagłębiać się w optymalizację. I wiedziałem że znajdą się tacy co przestawią bardziej fajniejszy i lepiej napisany kod :) Ja z powodu małej ilości czasu zrobiłem to na szybko i wyszło to co wyszło ;)

@KyRol to nie jest jeszcze arsenał ;) Akcesoriów mam naprawdę już sporo ale czasu mało aby wszystkie przedstawić i opisać, większość ich jednak używam na RPi.

Jaro070   15 #4 15.02.2014 18:11

Czekam na kolejne zabawki.

Frankfurterium   9 #5 15.02.2014 20:46

@dragonn, cyryllo

To jeszcze nie wszystkie kompilatory mają zaszyte zajmowanie się takimi drobnostkami?

dragonn   10 #6 15.02.2014 22:15

@Frankfurterium nie spotkałem się z kompilatorem który byłby w stanie zastąpić wróżkę :D, skąd on ma wiedzieć że ty nie zmienisz nigdzie wartości tej zmiennej - może wydawać to się dziwne, ale przy projekcie który korzysta z wielu biblotek/plików które po skompilowaniu są z sobą linkowane to to już takie oczywiste nie jest. Frankfurterium zapamiętaj sobie - kompilator zawsze zrobi to co ty chcesz, DOKŁADNIE TO CO CHCESZ :D!

foreste   14 #7 16.02.2014 08:05

No chyba ze gadasz do niego innym językiem , wtedy nie wie co chcesz od niego ;P
Recka ciekawa :).

GL1zdA   11 #8 16.02.2014 10:40

Nie miałem styczności z Arduino, więc może to pytanie jest trywialne. Czy te przykłady, które napisałeś zadziałają z każdą "implementacją" Arduino, czy też Galileo dostarcza własne SDK?

cyryllo   16 #9 16.02.2014 10:53

@GL1zdA powinno zadziałać z każdym popularnym arduino uno, leonardo, mega itp.. Zapewne z nano też.

Frankfurterium   9 #10 16.02.2014 10:57

@dragonn

Ok, może w C/C++, na których wyznaję się mniej niż tak sobie. Ale w przypadku języków wyższego poziomu istnieje sporo narzędzi stowarzyszonych z procesem kompilacji/budowania lub innych z zewnątrz, które takie sprawy sobie znanymi sposobami rozstrzygają i wprowadzają masę zmian. Zmieniają zmienne na stałe, opóźniają (kiedy to coś da) inicjalizację obiektów, optymalizują pętle, rekurencję i inne takie. Pewien jestem, że ktoś w jakiejś forumowej kłótni wspominał o podobnym mechanizmie w odniesieniu do C++, ale w temat nigdy nie brnąłem.

dragonn   10 #11 16.02.2014 11:38

@Frankfurterium w C++ raczej takiego mechanizmu nie ma, a już na pewno nie zmiany niezmienianych zmiennych na #define na const jeszcze w jakimś języku może się z tym spotkać, ale zmiana na #define ma trochę więcej konsekwencji o których trzeba wiedzieć. Swego czasu musiałem trochę programować w C# nie zagłębiałem się w to dokładnie, ale w przypadku kiedy stworzyłem zmienną ale nie użył jej w programie dostawałem ostrzeżenie o tym jak w C/C++ ale nie wydaje mi się że kompilator podczas kompilacji usuwał ją całkowicie w z programu - jak już mówiłem w przypadku linkowania szczególnie dynamicznego z bibliotekami już w postaci skompilowanej to takie oczywiste nie jest czy ta zmienna nie została jednak użyta/zmieniona w któreś z tych bibliotek w trakcie ich działania. Ja zawsze kierują się zasadą że kompilator zrobi dokładnie to co chcę - wydaje mi się że celowe nie poprawianie czegoś żeby kompilator zoptymalizował to w trakcie kompilacji nie jest najlepszą praktyką.

mikolaj_s   13 #12 16.02.2014 14:31

@dragon:
"Jeśli nie planujemy ich zmiany w trakcie programu - po co marnować pamięć, z tego co wiem const powinny mniej jej zajmować,"

A dlaczego mniej zajmować? Nie będzie to dalej te same 4B? Przy użyciu static const ponoć niektóre kompilatory mogą zrobić coś podobnego do tego co robi #define ale na poziomie asemblera.

dragonn   10 #13 16.02.2014 15:00

@mikolaj_s faktycznie pod tym względem masz rację, sprawdziłem ile zajmuj zasobów program dla AVR z int i z const int - tyle samo, ale i tak w tym przypadku zastosowanie const ma jak najbardziej sens. Ale co ciekawe tak jak mówisz, zastosowanie static const powoduje zmniejszenie zużycia pamięci z 4 do 2B (dla wartości 5 w tym incie). Ale jak już mówiłem zastosowanie const dla takiego przypadku ma jak najbardziej sens, a ja i tak preferuję zawsze #define.

cyryllo   16 #14 24.02.2014 13:21

@dragonn czyli mój kod nie jest aż taki zły ;)