Arduino IDE, mukoggy, mukoggy...

2018-10-25

 

Mint azt korábban már írtam, az Arduinoval nem csak egy mikrovezérlőre épülő kártyát kapunk, hanem egy csomó szolgáltatást, egy összetett környezetet. Most az Ardduino-tól letölthető Arduino IDE-t (Integrated Development Enviroment), a program fejlesztő környezetet fogom bemutatni. Mivel az egész GNU, szabadon használható, ingyen van. Az Arduino IDE-ben mindent meg fogunk tudni csinálni, nem szükséges más programot használnunk (de lehet). Talán első nekifutásra egyszerűbb, ha a telepíthető, nem .zip változatát töltjük le és telepítjük, mert ez szépen beállít mindent, míg a .zip az inkább a haladó fejlesztőknek való, annál néhány dolgot magunknak kell beállítani. A programot egy .ino fájlra, vagy az ikonjára kattintva indíthatjuk.

Elnézést kérek azoktól, akik az ánglius nyelvvel nehezen birkóznak, ők állítsák a kezelési nyelvet magyarra (FILE/PREFERENCES/EDITOR LANGUAGE), de én nem nagyon szeretem a bikfa nyelvű fordításokat, amikor a magyart elősző vissza kell fordítani angolra, hogy megértsem mi volt a kiindulás. Örök becsű Shakespeare fordítók követték el az első magyar nyelvű Unix könyvben az ösvény, meg a bög kifejezéseket. Eltelt egy kis idő, mire rájöttem, hogy path-ról, meg node ról van szó. Hogy minek fizetik a lektort? Bár, ha Cooper könyveiben az indiánoknak jó volt az ösvény, akkor én sem kritizálhatom. Ha számítéástechnikával szeretne az ember foglakozni, akkor nem kerülheti meg az angol nyelvet, egy gépésznek is meg kell tanulnia mi az a cirkli, meg subler, a vinkliről meg a drehálásról nem is beszélve.

De kanyarodjunk csak vissza a témánkhoz. Itt látjuk az IDE felületét. Rögtön egy üres program sablonnal kedveskedik, amibe már írhatjuk is az utasításainkat. A felső kék sávban az ikonok fölé mozgatva az egeret, kiírja mi/micsoda. Van ott egy pipa, amivel lefordíthatjuk/ellenőrizhetjük a programunkat. Utána van egy jobbra nyíl, amivel lefordítjuk és feltöltjük a programukat az Arduinio kártyánkra. Azután van egy új, egy megnyit és egy ment ikonunk. A jobb szélén a soros monitorról egy kicsit később fogok írni. Középen az a nagy fehér "üres" terület a szerkesztő ablak. Arduinoék azt találták ki, hogy azt a csúnya C++ megpróbálják elrejteni, és két fügvényt kapunk, ezekbe írjuk amit akarunk. A setup()-ba (beállítás) kerülnek azok az utasításaink, amiket a programuk elején csak egyszer kell végrehajtani. A loop()-ba (hurok) kerülnek azok, amiket ciklikusan újra, meg újra végre kell hajtani. A fordító program az alsó fekete sávban üzenget nekünk.

Mielőtt elköveténk az első programunkat, azért meg kellene mondanunk az IDE-nek, hogy milyen Arduino kártyával, és milyen porton szeretnénk dolgozni? Jó, persze látjuk, hogy nálam már be van állítva, de a következőket kell tegyük. Fogjuk a kártyánkat (esetemben egy Arduino Nano-t) és USb kábellel dugjuk a PC-re, majd belegyaloglunk azokba a menüpontokba, amikbe általában nem szoktunk, kivéve rögtön az elején. Tehát előszőr állítsuk be, milyen kártyánk van?

Bármennyire is elavultnak mondják a soros portot, az Arduino mint sok más kütyü is, az USB porton keresztül egy ilyet emulál, szimulál, virtualizál, variál... szóval a PC-nk egy soros (COM) portnak fogja érzékelni. Az én alaplapomon van egy "elavult" COM1 port, és az Arduinot COM3-nak érzékeli, ezt kiválasztom. Attól függően, hogy melyik USB csatiba döfjük a kábelt, más és más portszámot kapunk. Ha több port között nem tudunk dönteni, húzzuk le a kábelt, és akkor a menüt megint megnyitva eltűnik, amit lehúztunk.

A következő parám az volt, hogy még nem tudtam, hogyan működik ez az egész, jó-e az Arduino kártyám, ilyesmi. Tehát előszőr pütyögjük be az alább látható, talán legminimálabb Arduino progit. Az Arduino paneleken van egy L LED, ami amúgy a 13-as lábnak felel meg. A program ezt a lábat kimenetre állítja, majd 1-be kapcsolja, vár fél másodpercet, majd 0-ba, megint vár fél másodpercet, ezután a hurok (ciklus) újra kezdődik. A LED ennek megfelelően villogni fog. Ha nem működik, akkor gáz van :(.


void setup()
{
   pinMode( 13, OUTPUT);
}


void loop()
{
   digitalWrite( 13, 1);
   delay( 500);
   digitalWrite( 13, 0);
   delay( 500);
}

Az IDE-vel kapunk egy nagy kupac minta progit is. Ha az alábbiak szerint kiválasztjuk a blink programot, pontosan ugyan azt kapjuk, mint amit az imént bepötyögtünk (kicsit komplikáltabb). Azért remélem nincs öri hari, a gyakorlás teszi a mestert, bár Murphy szerint a mesterségbeli tudás egyenes arányban van a tönkretett berendezések számával :).

Az Arduino IDE, azért hogy lelegyszerüsítse a programozást néhány dolgot a saját hatáskörébe von. Nekem jobban tetszik amit a C-nél már 50 éve kitaláltak, és a C++-nál is megefelelt, nevezetesen hogyan lehet a programunkat modulokra bontani és az előfordítónak beállítani milyen modulokat kell összefordítania, de itt egy kicsit másképpen működik. Működik a korábbi fordító és előfordító is, de nekem az jött le, hogy az Arduino IDE egy második előforditóként előemészti a programunkat. Korábban már írtam, hiába nevezzük .ino fájloknak a programjainkat, az színtiszta C++. Az IDE elvárja, ha mondjuk írtunk egy program.ino-t, az egy vele azonos nevű \program mappában legyen, mert ha nem, irgum-burgum, és mentéskor inkább létrehoz egyet neki. Ezen felül, ha ebben a mappában vannak további dolgaink, azt is a program részének tekinti, konkrétan amit tud (.ino, .h...) meg is nyit külön füleken, és fordításkor egybefordítja. Útálom. Az IDE minden egyes elindulásakor végignézi a rendszert, nevezetesen a megkeresi a library-ket (könyvtárakat). A library-król külön fogok írni, most elég talán annyi, hogy ezekben találjuk/helyezzük el az egyes kiegészítő áramkörök C++-ban megírt kezelő programjait. Funkciójuk hasonlít a PC-knél használt driver-ekhez. A legtöbb Arduinohoz készített kiegészítő áramkörhöz jó eséllyel valaki már megírta a kezelést, és mi már viszonylag egyszerűen néhány utasítással dolgozhatunk velük. Kapunk az IDE-vel is néhány library-t, de magunk is keresgélhetünk az Interneten. Amit tudnunk kell, hogy ezek helye \URERS\user_name\DOCUMENTS\ARDUINO\LIBRARIES mappa. Ha sikerült letöltenünk a kívánt library-t, egyszerűen ide kell betennünk, hasonlóan a már itt lévőkhöz. Más dolgunk nincs vele, az IDE minden indulásakor ezeket feltérképezi. Ezekből az alábbi módon kiválaszthatjuk a nekünk szükségeset, tulajdonképpen a használatához szükséges utasítást beszúrja a programunkba.

Ígértem, hogy megnézzük a jobb szélen lévő ikonnal indítható soros monitort. Ennek kipróbálásához előszőr pötyögjük be az alábbi programot. Ez a program beállítja a soros vonal sebességét, ami bit/sec-ben leánykori nevén baud-ban értendő, elküld az üdvözlő szöveget, azután nem csinál semmit. Amíg nem jött el az unicode, egy betü (character) az egy byte-ot jelentett, ami 8 bit. Valójában a soros kommunikációban vannak még kiegészítő információk/bitek, amit most nem részletezek, csak azért írtam, hogy arra azért ne számítsunk, hogy ezzel a sebességgel másodpercenként 1200 byte-ot át tudunk küldeni. Azt tudjuk, hogy ma a számítástechnikát a managerek a maguk képére formálták. Az első munkahelyemen ez a sebesség elegendő volt, hogy PDP számítógépeken és VT100 terminálokon teljesen használhatóan működjön a KEX full screen szövegszerkesztő, vagy potyoghasson a Tetris. Szabványos sebességek a 9600 többszörösei (x2, x4...) , meg a törtjei (/2, /4...). De miért akarhat valaki lassabb átvitel, ha lehet gyorsabb is? Vegyük azt, hogy a kütyünk egy ipari üzem/csarnok túlsó végén 1-2 km-es kábel végén lóg. Gondoljunk arra, mit csinálunk ha valaki messzebb van tőlünk, vagy nagy a zaj. Lassan, tagolva igyekszünk túlüvölteni a zajt. Na az áramkörünknek is jól jön ilyen esetben ha lassít, és magasabb jelszintet használunk.


void setup()
{
   Serial.begin( 9600);
   Serial.println( "Szia Tibi!");
}


void loop()
{
}

Igyekeztem úgy rendezni az ablakokat, hogy több dolgot is meg tudjunk figyelni. A programot a jobbra mutató nyílla lefordítottam, és a kártyára feltöltöttem. A fekete részen látszik a fordító program kiírása. Ezt általában érdemes nagyobbra méretezni, főleg, hogy elférjen a sok hibaüzenet :). Hibaüzenetekez egy tanács, mindig a legfelsővel kezdjünk. Sajnos a C++ sokkal körmönfontabb és nehezebben érthető dolgok elkövetésére képes, mint a C. Azután nagyon fontos a fekete sor fölötti kiírás, "Done uploading.", vagyis hogy a programunk feltöltése a kártyába megtörtént. Előfordul néha, hogy nem történik meg, mert a mikrovezérlőt mégicsak sikerül lekötnünk valami őrültséggel. Ilyen esetekben először az Arduino kártyákon található RESET gombhoz nyúlunk. Ez nem fogja az alap Arduino firmware-t visszatölteni, csak újraindítja az általunk utoljára feltöltött programot. Azután elvehetjük a tápot is, vagyis kihúzhatjuk az USB kábelt. Előfordult már, hogy az IDE-ből is ki kellet lépnem, mejd újra be kellett lépnem, végül is Windows programról beszélünk :). Végül fent, jobb szélen látható nagyító ikonnal elindítottam a soros monitort. Ennak a képernyőjén látható az üdvözlő szöveg. Így egyszerűen kiírathatunk hibaüzeneteket, értékeket. A programjaink belövése során nagyon hasznos.

Nagyon előrehaladt már az idő, de szeretnék még egy programot bemutatni, aminek a neve echo (visszhang). Az igazság az, hogy számítógépeknél egyáltalán nem természetes, hogy megjenik a monitoron amit begépelünk. Ezt bizony meg kell magyaráznunk neki, le kell programoznunk. Ez a szimpla program arra is jó, ha ellenőrizni akarunk egy soros összeköttetést. Gondolatban ne ragadjunk le az asztalunkon kígyózó másfél méteres USB kábelnél! Egy kóbor villanyszerelő rémes dolgokat tud művelni, ha talál egy kábelt, arréb teszi, feltekeri, levágja, átköti... A programunk úgy működik, hogy beállítjuk a soros vonalunkat, majd kiírjuk a programunk nevét. Azután létrhozunk egy c nevű, egy karakter tárolására szolgáló változót. Megnézzük jött-e valami? Ha igen, beolvassuk c-be, majd ugyanazzal a lendülettel ki ki is írjuk, majd újra kezdjük. Az Arduinonknak a monitor SEND gombba végződő sorába írjuk be a betüket, majd a SEND gombra kattintva küldjük el. Ha minden ok, akkor az alatt lévő ablakba szépen visszaírogatja nekünk.


void setup()
{
   Serial.begin( 9600);
   Serial.println( "echo.ino");
}


void loop()
{
   unsigned char c;
   if ( Serial.available())
   { 
      c= Serial.read();
      Serial.write( c);
   }   
} 

És most van vége, fuss el véle.