330 likes | 563 Views
http://arduino.cc nyílt forráskódú (hw+sw) prototípus platform. Arduino programoz ási alapok. joe@mogi.bme.hu. A készítők célja: „ It's intended for artists, designers, hobbyists and anyone interested in creating interactive objects or environments. ” Ezek közül melyikek vagyunk ?.
E N D
http://arduino.cc nyílt forráskódú (hw+sw) prototípus platform. Arduino programozási alapok joe@mogi.bme.hu A készítők célja: „It's intended for artists, designers, hobbyists and anyone interested in creating interactive objects or environments.” Ezek közül melyikek vagyunk ? „Bárhogy is rakom össze, harckocsi lesz belőle”
A fejlesztő részei • Tápellátás • Programozható eszköz (uC), kivezetett csatlakozókkal a bővítőkhöz • Programozó („égető”), számítógéphez (pl. PC) kötve • Futtatható programot készítő rendszer (compiler + GUI) A tápellátás feladata: az alappanel és az esetleg rákapcsolt plusz panelek energiaellátása. PC-vel összekapcsolva USB-ről (5V, 500 mA), önálló működés esetén külső tápegységről (7-16V DC), esetleg telepről képes üzemelni. Szükséges kimeneti feszültségek: 5V, 3.3V. Külső táp + 5V-os lineáris stabilizátor. Védődióda, elkó. Átkapcsoló és 3.3V-os stabilizátor. Komparátor, FET.
A mikrokontroller (μC) felépítése: ATmega328P, UNO • CPU: processzor (ALU+regiszterek+vezérlő áramkörök), csatlakozásai nincsenek közvetlenül kivezetve. A PC processzora (i7) hasonló, de más hardvert nem tartalmaz. Gyakran Harvard architektúrájú RISC: AVR. • (flash)ROM: a processzort működtető gépi kódú programot tartalmazza, az eszköz bekapcsolásakor azonnal indul. Arduino-nál mindig tartalmazza a „bootloader”-t, amely megfelelő feltételek esetén (amit a programozó teremt meg) képes a flashROM-ba kódot írni és átadni neki a vezérlést. 32 kbyte méretű. • Operatív memória - regiszterek (RAM): statikus RAM, írható és olvasható. Általában ide vannak ágyazva az I/O portok is. 2 kbyte méretű. Veremtárat is mindig tartalmaz, címezhető vagy fix helyen. • I/O portok (GPIO): tetszőlegesen konfigurálható ki/bemenetre. A legtöbb általános célú lábon van i/o port. Amennyiben 1-et írunk a hozzá tartozó RAM megfelelő bitjébe, a kimenetre konfigurált lábon logikai magas szint lesz 5V, ha 0-t, alacsony. Kimeneti áram max 20 mA. A bemenetre konfigurált lábhoz a tokon belül felhúzó ellenállás is bekapcsolható, ezzel csökkentve a külső elemek számát. Pl. nyomógomb a föld és a láb közé. • oszcillátor, kvarckristály/kerámia rezonátor csatlakoztatására, belső r/c oszcillátor órajelgenerálás. 16MHz-es kerámia rezonátor • Interrupt vezérlő: valamely láb vagy belső jellemző megváltozása megszakítást generál, és egy kezelő függvény lefut. • A/D átalakító: a bemeneti lábak nem csak digitálisak lehetnek, hanem analógok is. Általában multiplexelve kerül a bemenetekről a jel az átalakítóra. 6 csatorna, 1 átalakító, 10 bites felbontás, beépített hőmérő. • Analóg komparátor: bemeneti lábak feszültségkülönbsége (A>B) digitális formában rendelkezésre áll, megszakitást kérhet. • Időzitő/Számláló: Külső/belső órajelet képes számolni, ha túlcsordul, megszakítást generál. 2 db 8 bites, 1 db 16 bites timer előosztóval. • PWM kimenet: impulzusszélesség modulált kimenet. 6 PWM csatorna, kitöltési tényező 0..255. • soros ki/bemenet pl RS-232, RX és TX lábak. A soros portot az égető használja, 1k-s ellenállásokon keresztül. • i2c: Philips által kifejlesztett kétvezetékes (SCL,SDA) busz. ATMEL nem vette meg, TWI-nek (kétvezetékes interface) hívják. AD4-AD5 lábak az SDA és SCL. Alkalmazás: LM75AD hőmérő, giroszkóp. • SPI: soros periféria interface. I2c-nél több lábat használ, nagyobb órajellel. Ethernet, SD kártya.
Multifunkciós lábak: szoftverből döntjük el, melyik funkció jelenjen meg. ATmega328 lábai Arduino-ban majdnem minden láb fix funkciójú Kis túlzás: pic32, az RPxxx elnevezésű lábak programozható funkciókkal rendelkeznek
Program beégetési módok, a programozó egység • A µC kétféle módon programozható: • Különálló égetővel: az égető hardvert a µC-hez csatlakoztatva. ICSP Header kiépítve. • Bootloaderrel, ekkor a bootloader program végzi el a beégetést.Kapható bootloaderes µC is. • Ha reset után bizonyos ideig nincs égetési parancs, az általa beégetett programra ugrik. USB a PC fele ICSP header az ATmega328-hoz USB-RS232 átalakítóként használt ATmega16u2 RS-232 RX-TX az ATmega328 fele
A fejlesztő környezet: IDE (GUI + GCC) Az IDE környezet JAVA-ban íródott, a portolás megkönnyítésére. A kész, felinstallálható IDE-t letölthetjük Windows-ra, MAC-OS-re és Linux-ra. Természetesen a forrás is letölthető. Windows-nál installálni sem szükséges: kicsomagolva a Zip fájlt, a program indítható. A kicsomagolás után lesz „Drivers” könyvtár is, a hardver csatlakoztatásához szükséges INF fájlt tartalmazza. Az inf fájl egy USB-s soros portot készít a fejlesztőnek, amit (a felhasznált Ardunio típussal együtt) kézzel kell az IDE menüjében beállítanunk. Fordítás (csak teszt, szintaktikai ellenőrzés) Fordítás + feltöltés új-megnyit-ment. Mentés nélkül is tud fordítani. Soros monitor. Ha már kész a feltöltés, a soros port a PC-vel való kommunikációra használható. Feltöltéskor a terminál ablak bezáródik. Baud-ra ügyelni
A GCC fordító A GCC fordító a GNU projekten belül, a GNU operációs rendszerhez készült. A GCC fordító tervezésénél és a kódolásánál a fő szempont egy jó minőségű, ingyenes eszköz készítése volt. Hasonló cél a különféle számítógép architektúrák támogatása. Az avr-gcc egy cross-compiler: PC(MAC)-on futva állít elő avr-en futó kódot. A compiler fordítás közbeni üzeneteit akkor fogjuk látni, ha a File/Preferences menüben bekapcsoltuk a „Show verbose output during compilation” kijelölőnégyzetet. Mindent bekapcsoltunk Fordítás eredménye: .HEX fájl keletkezett. Ezt lehet betölteni a µC flash-romjába (program storage space). Kaptunk memória foglaltsági statisztikákat is: mennyi ROM, és RAM (dynamic memory) szükséges a programnak. Mint minden Unix jellegű fordítási folyamatban, itt is assemblerre fordítunk először, majd az avr-as segítségével (amely a binutils része) lesz futtatható kódunk. avr-gcc –v kimenete: Using built-in specs. Target: avr Thread model: single gcc version 4.3.2 (WinAVR 20081205)
Sketch (vázlat) A sketch az általunk megírandó programot jelenti. Nem a teljes lefordítandó anyagot látjuk, hanem csak egy részét. A régebbi verziók üres oldallal indultak, az 1.5.5-r2 béta változat megír nekünk két függvény fejlécet. setup()függvény: reset után egyszer lefut. Ide kell írni az inicializáló részt, például a GPIO-k kimenetre programozását, a soros port inicializálását. Az A/D átalakító vagy a PWM inicializálása nem szükséges. loop()függvény: folyamatosan, végtelen ciklusban fut. Ide írjuk a működtető programot. Amikor a végéhez ér, azonnal újraindul. A Sketch programozási nyelve C++. (Ezen az előző dia alapján nem lepődünk meg) Az elmentett sketch .ino kiterjesztést kap, ez egy Unix-os soremeléseket tartalmazó szövegfájl. Jegyzettömbbel egy sornak látszik, wordpad-dal kinyitható.
A főprogram: hardware/arduino/cores/arduino/main.cpp Cpp fájlt nem tud betölteni, csak ino-t. Az init() függvény a rendszer inicializáló. A setup() függvény a felhasználó által megírandó inicializáló. Ha nincs meg, hiba. A loop() függvény végtelen ciklusban fut. A serialEventRun függvénypointer, ha nem definiáltuk, NULL. #include <Arduino.h> int main(void) { init(); #if defined(USBCON) USBDevice.attach(); #endif setup(); for (;;) { loop(); if (serialEventRun) serialEventRun(); } return 0; } „Az intelligens programkészítők vidáman elolvassák a 400 oldalas leírást egyetlen programsor leírása előtt. Az Arduino programozók akkor olvasnak leírást, ha már felszállt a füst.” – RTFM mai változatban.
Gyakran használt függvények és osztályok void pinMode(lábszám,üzemmód): a digitális lábat állítja adott üzemmódra. A loop()-ban is használható. Üzemmódok: INPUT, OUTPUT, INPUT_PULLUP. Az analóg input lábak (A0,A1 stb) is használhatóak. void digitalWrite(lábszám,adat): a digitális lábra kimenetet kapcsol. Az adat HIGH vagy LOW lehet, ezek csak definiált konstansok (HIGH=1, LOW=0). int digitalRead(lábszám): beolvas egy digitális bemenet. Az eredmény 0 vagy 1 lesz. int analogRead(lábnév): beolvas egy analóg bemenetet. 10 bites átalakító, alapesetben 5V referencia. 5V=1023 void analogWrite(lábszám, érték): pwm képes kimenet (3,5,6,9,10,11) kitöltési tényezőjének állítása 0..255 intervallumban. void delay(ezredmásodperc): adott idejű várakozás. Serial: soros port osztály. Inicializásása a Serial.begin(baudrate) függvénnyel történik. Ezt a számot kell a serialMonitor-ban beállitani, különben értelmetlen jelsorozatot kapunk. int Serial.available(): hány karakter érkezett a PC felől. Ha 0, nem érkezett karakter. char Serial.read(): egy karakter olvasása a serial bufferből void Serial.print(adat): kiírás a portra. Az adat lehet int, char, double és string is. Void Serial.println(adat): mint print(), csak egy soremeléssel lezárva a kiírást.
Sebességteszt A következő program futását nézzük meg: void setup() { pinMode(3,OUTPUT); } void loop() { digitalWrite(3,HIGH); digitalWrite(3,LOW); }
PWM teszt void setup() { pinMode(3,OUTPUT); pinMode(5,OUTPUT); } void loop() { analogWrite(3,64); analogWrite(5,128); delay(10000); }
Delay teszt void setup() { pinMode(3,OUTPUT); } void loop() { digitalWrite(3,HIGH); delay(2); digitalWrite(3,LOW); delay(2); }
Az i2c kommunikáció Az i2c-t a Philips (ma NXP) fejlesztette ki, tőlük kell licenszelni. Az ATMEL nem fizetett, emiatt a kétdrótos buszt TwoWireInterface-nek (TWI) nevezi. Természetesen a felhúzó ellenállások és a buszprotokoll ugyanaz, mint az I2c-nél. A library-t Wire-nek nevezzük. 2006 óta nem kell fizetni az nxp-nek. #include <Wire.h> // library betöltése (c++) Wire.begin(); // inicializálás, analóg lábak lekapcsolása, felhúzó ellenállások bekapcsolása Wire.requestFrom(i2c cím, byteok száma); // adott számú byte átvitelének kérése slave eszköztől Wire.available() true, ha van adat az i2c pufferben Wire.read() 1 byte olvasása Wire.beginTransmission(i2c cím) átvitel kezdete, start bit Wire.write(adat) írás az i2c slave-nek Wire.endTransmission() átvitel vége, ack bit Wire.onReceive(függvény) beérkezett adatnál meghívja a függvényünket. A függvény megkapja a pufferben lévő bájtok számát. Wire.onRequest(függvény) szolgaként programozott eszköznél a függvényünk fut le, ha adatot kér tőlünk a master eszköz.
Interrupt (mert azt senki sem tudja) informatika-I ea. Ha bekövetkezik egy megszakítási szituáció (int.0: 2-es láb, int.1: 3-as), egy függvényt írhatunk, amely az eseményre azonnalreagál. A hozzárendelés a következő: attachInterrupt(megszakítás, kezelőfüggvényünk, esemény); Megszakítás: 0 vagy 1 Kezelőfüggvényünk: általunk megírt függvény neve Esemény: LOW – alacsony láb, CHANGE – láb állapot változás, RISING: felfutó és, FALLING: lefutó él int c; void setup() { c=0; pinMode(2,INPUT_PULLUP); pinMode(4,INPUT_PULLUP); attachInterrupt(0,megszakitas,FALLING); Serial.begin(9600); } void loop() { Serial.print("c="); Serial.println(c); delay(1000); } void megszakitas() { if (digitalRead(4)==1) c++; else c--; } Példa: encoder. Akkor fut le a megszakitas(), ha a 2-es lábat földrehúzzuk Itt a c-t csak kiíratjuk. Ha a 4-es bemenet magas, előre, egyébként vissza.
LabView kezelői felület Az Arduino-ba egy NI által készített firmware-t töltve használható LabView komponensként is. Ezt a diát és a következőt is Szakály Norbi kolléga készítette. 1. VI Package Manager (VIPM) letöltése és telepítése 2 lefordítani és feltölteni a Arduino Firmware-t, LabVIEW \vi.lib\LabVIEW Interface for Arduino\Firmware\LIFA_Base\LabVIEWInterface.ino. 3. LabView indul
Előnyök és hátrányok • Előnyök: • Olcsó • Kezdők is könnyen boldogulnak • Nagyszámú kiegészítő (shield) kapható • Jól dokumentált, komplett mintaprogramok (examples) a fejlesztőben • Nyílt forráskód • Hátrányok: • Drága • Debug lehetőség nincs • Nem tartalmaz semmilyen perifériát egy db LED-en kívül • Nem használható ki a teljes uC • A shieldek legtöbbször csak egy, max kettő funkciósak. • Legtöbbször fórumokon van csak a problémára megoldás • Ellustul a programozó LilyPad
Arduino a tanszéken K. Brúnó szakdolgozata Mechatronika szakosztály szakkör Gerincőr: 30 db Arduino UNO i2c beszerezve Mechatronika gólyatábor - augusztus 15. (D506) shield még nincs. 20 db Arduino kölcsön a szakosztálynak. Szakkör a D506-ban. 2014 január: Mogi shield Mechatronikai Szimulációk c. MSC tantárgy 2 alkalom előadás, 1 alkalom gyakorlat Bármelyik számítógépterem Arduino laborrá alakítható
MOGI Shield Minden gyári shield célspecifikus és 10-50$. Czmerk András kolléga ötlete: készítsünk egy shield-et, amin egy izzólámpa, egy hőmérő és egy ventilátor található. Hw konfiguráció: sda,scl(a4,a5): lm75a, 0x48, internal pull-up out 11: lamp output (fet, pwm) out 10: cooler fan output (fet,pwm) pwm 3,5,6: pwm output to rgb led a0,a1,a2: 10k pots 2,4,7: buttons in internal pull-up a3: phototransistor in
Library készítés A programból osztályt készítünk Az osztályt .h és .cpp fileba rakjuk Plusz #include-ok: Ardunio.h, és az általunk használt library-k Megírjuk a keywords.txt-t Betesszük a „libraries” könyvtárba, ugyanolyan nevű könyvtárba, mint a cpp és a h
Gyári library-k EEPROM: a cpu-ba épített nem felejtő eeprom kezelő függvényei. UNO: 1024 byte. read(int cím), write(int cím, byte adat). Ethernet: az ethernet shield kezelő felülete. Ezzel lehet készíteni távoli elérésű gpio-t például. Connect(),write(), read(). Mintaprogram: WebServer GSM: mobiltelefon shield-hez. VoiceClass, GSM_SMS osztály, GPRS osztály, GSMclient, GSM szerver osztály. Connect(), read(), write(). LiquidCrystal: LCD. Szinte az összes olcsó LCD modulban hd4470 kompatibilis vezérlő van. 4 vagy 8 bites interface választható. Begin(), write(), blink(), setCursor(), clear(). SD: memóriakártya elérés, fat16 vagy fat32 üzemmódban. Több file is kinyitható. File osztállyal együtt. open(), print(), read(), close(). Servo: szervómotor vezérlése. A write()-ben fokot adunk meg, a motor oda áll be. SPI: az spi protokoll megvalósítása. Transfer() függvény. Az SD is ezt használja. SoftwareSerial: Az UNO-ban az egy uart-ot az égető használja. Bármelyik két lábon tudunk szoftveres soros portot készíteni. Készült egy NewSoftSerial library is. Stepper: léptetőmotor vezérlésére. setSpeed(int rpm), step(int lépés). TFT: színes kijelző vezérlése. Adafruit gyártmányú vezérlőhöz. SPI-t használ. Image(), line(), circle(). Wire: i2c. Már volt róla szó. FFT: hangmintákra. nem része a fejlesztőnek, de letölthető. Frekvencia-analízis
Az UNO32 (digilent, chipkit) Az Arduino felület népszerűsége és nyílt forráskódja egyéb gyártókat is megihletett. Az UNO32-ben Microchip Pic32mx található, 80 Mhz órajellel. Lábkiosztása szinte kompatibilis, szoftvere egy régebbi Arduino-ból lett Kialakítva. Természetesen a gcc itt nem avr-t fordít, hanem pic32-t xc32 néven. MPLAB is használható a fejlesztésre 3.3V a gpio-kon Az analóg inputok Védődiódákkal ellátva Icsp csatlakozó Pickit3-hoz
A következő program futását nézzük meg: void setup() { pinMode(3,OUTPUT); } void loop() { digitalWrite(3,HIGH); digitalWrite(3,LOW); } UNO-32: 442 kHz, de csak 3.3V-os jel
1.1usec ! Mplab: int main(void) { // rd0 : arduino pin 3 TRISDbits.TRISD0=0; // output while (1) { LATDbits.LATD0=1; LATDbits.LATD0=0; } }