Bevezető
Az Arduino egy hobbielektronikusoknak szánt fejlesztőplatform. Segítségével minimális programozói és elektronikai tudással is készíthetünk elektronikai projekteket, egyszerű LED-eket villogtató áramkörtől a robotokig.
Arduinonak a szoftver és a hardver együttesét hívjuk: a hardver egy Atmel AVR mikrokontroller köré épülő boardból, a szoftver az Arduino IDE-ből (fejlesztőkörnyezet) áll.
A boardok áramköri rajzai elérhetőek a honlapján, így akár magunk is elkészíthetjük, ha értünk hozzá, vagy vehetünk egy olcsó klónt is. A fejlesztőkörnyezet ingyenes, nyílt forráskódú, keresztplatformos (windowsoson kívül van Maces, Linuxos, BSD-s kliens is). A nyíltságnak, olcsóságának és egyszerűségének köszönhetően egy igen népes és lelkes közösség alakult ki körülötte az utóbbi években.
Az Arduino board
Az Arduino IDE
A board USB-n keresztül csatlakoztatható a számítógépre, így tölthetjük fel a kész kódot, valamint áramot is ezen kap, ha egyéb külső áramforráshoz nem csatlakoztatjuk. A rajta levő csatlakozókat pineknek nevezzük, ezekhez kábeleket, és egyéb áramköri elemeket csatlakoztathatunk. Kész shieldeket is vehetünk hozzá, ezek a szabvány board méretű lapkára helyezett szenzorokból, Ethernet, Wi-Fi, GPS, motorvezérlő interface-ből állhatnak, és általában kapunk hozzájuk használható forráskódokat is.
A következő fejezetekben egyszerű áramköri elemekből fogok építeni egy alkonykapcsolót és egy digitális hőmérőt, ezzel is szemléltetve az Arduino működését.
Az Arduino IDE
Miután feltelepítettük az Arduino IDE-t, első dolgunk a tools → board menüpontba vezet. Itt ki kell választanunk, hogy milyen boardot használunk. Az én esetemben ez egy Arduino Mega.
Ezután a tools → serial port menüpont alatt kiválasztjuk a megfelelő portot, amire csatlakoztatva van. Ez Windows esetén valamelyik COM port, Unix-szerű rendszerek esetén pedig terminálban egy dmesg parancsot kiadva nézhetjük meg (/dev/tty... ). Ezután már használatba is vehetjük az IDE-t.
A felület elég puritán és átlátható, különös magyarázatot nem igényel. Középen látható a sketch (program) szerkesztő, ide írjuk a programunkat. A pipa jelzésű verify/compile gombra nyomva lefordul a programunk (jó esetben), az esetleges hibákat alul a konzolban láthatjuk. A mellette levő upload gombra nyomva pedig feltölthetjük a programunkat a boardra.
A soros port monitor sok mindenre használható, a beolvasott értékek kiíratásától kezdve a debuggolásig.
Maga a nyelv C/C++ -szerű, így aki ezeket ismeri, az gyorsan ki fogja ismerni magát itt is. A programunk két kötelező eleme a setup és a loop függvény. A setup rész az inicializálás, ez egyszer fut le mikor áramforráshoz csatlakoztatjuk, a loop része pedig a főprogram, ez végtelen ciklusban fut, egészen amíg áram alatt van. Ezek jelentését illusztrálom is mindjárt egy példával.
Szemléltetésképp az Arduino „Hello World”-jét, a blink nevű LED villogtató sketchet mutatnám be. Ez a fájl → examples → basics → blink menüpont alatt megtalálható.
A setup függvényben inicializáljuk a 13-as pint, ami egy boardra integrált ellenállás és LED. Ezután a loopban a LED-et másodpercenként (1000 msec) fel- és lekapcsoljuk.
Áramkört forrasztás nélkül legegyszerűbben próbapanelen tudunk létrehozni. A próbapanel a műanyag burkolat alatt párhuzamos fém lemezeket tartalmaz, így a vízszintesen egymás mellett levő lyukak egy ágon vannak (zölddel illusztrálva).
A két szélén levő függőleges hosszanti sáv pedig a tápfeszültségre (piros), és a földelésre (kék/fekete) használatos. Középen egy sávban el van választva, ide rakhatjuk pl. az IC-ket.
Az előbbi példa próbapanelen:
Alkonykapcsoló
Az alkonykapcsoló fényforrások és egyéb fogyasztók vezérlésére használható: például alkonyatkor bekapcsolja, hajnalban pedig kikapcsolja a világítást. Erre a célra egy fényellenállás (fotoellenállás) tökéletesen megfelel.
A fényellenállás olyan ellenállás, aminek fény hatására csökken az ellenállása.
A fényellenállást az analóg 0-s pinre kötve a board egy 0 és 5 volt közötti feszültségértéket képes beolvasni, és ezt skálázza be egy 0 és 1023 közé eső egész számra. A beolvasott feszültségesés mértékéből következtethetni lehet a fényerősségre.
A fényviszonyok alapján tetszőlegesen be kell állítani egy határértéket, ami felett a 8-as pinre csatlakoztatott LED fel-, alatta pedig lekapcsol.
(forráskód és modell a mellékletek fejezetben)
A soros port monitoron láthatjuk az analóg 0 pinről beolvasott értékeket
Digitális hőmérő
Egy digitális hőmérő egyszerűen megvalósítható egy termisztor (ellenállás-hőmérő) segítségével. Én egy NTC (negatív hőfoktényezőjű) termisztort használtam, ennek a hőmérséklet csökkenésekor nő az ellenállása. Nem lineárisan, viszont szobahőmérsékleten jól közelíthető a Steinhart-Hart egyenlettel. Ez három hőállandót használ, amit általában a termisztor adatlapján megtalálunk.
Előző projekt gondolatmenete itt is alkalmazható, termisztort az analóg 0-s pinre kötve a feszültségesésből megállapítható a hőmérséklet.
Végszó, melléklet
Remélem, ti is annyira élveztétek a cikket, mint én az írását, és meghozta a kedveteket az Arduinohoz. A negatív és pozitív kritikákat szívesen várom kommentekben.
Irodalomjegyzék
Szakkönyv
Michael Margolis – Arduino Cookbook O'REILLY
Brian Evans – Beginning Arduino Programming
Internetes irodalomjegyzék
http://arduino.cc/en/Reference/HomePage
http://playground.arduino.cc/
http://www.ladyada.net/learn/arduino/
Mellékletek
Alkonykapcsoló forráskód
int fenyellenallas = 0; // analog in pin 0
int R = 0;
int led = 8;
void setup() {
Serial.begin(9600);
pinMode(led, OUTPUT);
}
void loop() {
R = analogRead(fenyellenallas);
Serial.println(R); // a fenyellenallas erteket a soros monitorra kiiratjuk
//soros port monitorjan megnezzuk a beolvasott ertekeket, az alapjan belovunk egy hatart
if (R > 700) {
digitalWrite(led,HIGH);
} else {
digitalWrite(led,LOW);
}
delay(25);
}
(a modell a Fritzing nevű programmal készült)
Hőmérő forráskód
double thermistor(int RawADC) {
double temp;
temp = log(((10240000/RawADC) - 10000)); // 10k Ohm hőellenállás
temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * temp * temp ))* temp ); //Steinhart–Hart egyenlet
temp = temp - 273.15; // Konvertálás Kelvinből Celsiusba
return temp;
}
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println(int(thermistor(analogRead(0))));
delay(500);
}