Oldalforrás megtekintése Korábbi változatok Hivatkozások Tartalomjegyzék Arduino Néhány Arduino board összevetése Az Arduino board-ok memóriatípusai Flash memória SRAM EEPROM Arduino IDE Arduino és USB TTL logikai szintek Pin-ek terhelhetősége Pin-ek felhasználása Arduino ISP Arduino SPI Arduino ISR Példák az interrupt-hívásra Arduino PWM Arduio AREF pin Arduino soros kommunikáció Arduino I²C Arduino EEPROM Arduino Az Arduino egy szabad szoftveres, nyílt forráskódú elektronikai fejlesztőplatform. Alacsony ára, széleskörű bővítési lehetőségei és „nyitottsága” világszerte nagyon népszerűvé tette. Habár az Egyesült Államokon kívül hivatalosan csak a Genuino testvérmárka termékeit lehet kapni, ennek ellenére a platformra mindenki az Arduino néven hivatkozik, itt az OB121-en sem fogok ettől a "szokástól" eltérni. Az Arduino-val kapcsolatos információk, szoftverpéldák és könyvtárak a termék ismertetőoldalán találhatók meg. A programokat nyílt (c++ vagy arduino native) forráskódú fejlesztői rendszerekkel lehet megírni és fordítani (az „alap”-szoftver például innen tölthető le) elsősorban az USB-n keresztül az un. Board-okra. A Boardok az Arduino elsődleges hardveresztközei, ezek futtatják a programot és ezek bővíthetők elsősorban könnyen a board-okhoz illeszthető shield-ekkel, vagy az io csatlakozókon kívül szinte bármilyen egyéb hardvereszközökkel. A board-okat és a bővítőeszközöket jelenleg ontja a sok különféle gyártó, és kínai internetoldalakról fillérekért is megszerezhetők ezek az eszközök, ezeknek az ismertetése található itt, kategóriákra bontva, illetve HW-típusonként is kereshetők ebben a jegyzékben: OB121.com hardver-index. Arduino referenciák: Arduino funkciók, Arduino változók, Arduino struktúrák Arduino szoftver: Arduino szoftver alapok, Arduino szoftvermegoldások, Arduino könyvtárak, avr-libc, Wemos D1 Wifi Arduino hardvermegoldások: Kapcsolók, nyomógombok, IO bővítőmodulok, EEPROM, Relé-Modulok, DC Motorvezérlés, Szervovezérlés, Léptetőmotor vezérlés, Micro SD kártyamodul, USB vezérlőmodul, RFID (Wiegand), MP3 modulok, Lézer modulok, Joystick Arduino Kommunikáció: I²C, SPI, 1-Wire, Wifi,.., nRF24, Bluetooth-Modulok, IR, Board to board, Rádiókommunikáció, Arduino LoRaWAN Arduino szenzortechnika: Időmérés, Hőmérsékletmérés, Páratartalom-mérés, Nedvesség / esőszenzor, Súlymérés, Távérzékelés, Árammérés, Mozgásérzékelés, Nyomásérzékelés, Áramlásmérés, Elmozdulás / vibráció, Fény- és színérzékelés, Mágneses tér érzékelés, Levegő összetétel Arduino HMI/LED: LiquidCristal LCD Modulok, 7 szegmenses kijelzők, LED / RGB LED vezérlés, Címezhető RGB LED-ek Boardok: Arduino board-ok, Wemos board-ok, Arduino shield-ek Néhány Arduino board összevetése TípuschipCPU speedTápÜzemi fesz.Digitális pinek száma (pwm pinek)Analóg pinek számaFlash memóriaSRAM memóriaEEPROM méreteExtrák Arduino UNOATmega328P16 MHz6..20V5V14 (6)632 KB2 KB1 KB - Arduino MINIATmega328P3,3V: 8MHz 5V: 16 MHz6..20V3,3V 5V14 (6)832 KB2 KB1 KB nincs USB portja Arduino MEGA2560ATmega256016 MHz6..20V5V54 (15)16256 KB8 KB4 KB - Arduino NanoATmega328P16 MHz7..12V5V22 (6)832 KB2 KB1 KB - Wemos D1ESP8266EX-9..12V3.3V11 (11)14 KB2 KB1 KB- integrált ESP8266 DuemilanoveATmega168 ATmega328-6..20V5V14 (6)616KB 32KB1KB512 byte 1KB- Digispark---5V141016KB2KB1KB- RoboRED---5V/3.3V14632KB2KB1KB- ATmega1280ATmega1280-5V5416128KB8KB4KB- Arduino Leonardo--5V201232KB2.5KB1K- Arduino Due--3.3V5412512KB96K-- ChipKIT Max32Diligent-3.3V8316512KB128KB-- Az Arduino board-ok memóriatípusai Flash memória Ez számít az Arduino-k "fő" memóriájának, ez tárolja a letöltött programot, és kikapcsolás után is megőrzi a tartalmát, azaz a programot elegendő csak egyszer letölteni ide, az minden ismételt bekapcsolás esetén "magától" újraindul. Programozás során nem számolhatunk a teljes memóriával, mivel a letöltőprogram (bootloader) és például a különböző kommunikációk is innen "csípnek le" részeket. Ráadásul a letöltött könyvtárak is sok helyet tudnak innen foglalni, ezért alaphangon is egy 32 kb-s memória esetlén csak 24-30 kb-val számolhatunk (könyvtárak nélkül). Ezen kívül a flash nem írható végtelenül újra, a maximális írásciklus-számát 100.000-ben limitálták. Ez arra elég, hogy egy naponta 10-szer újraírt programot mintegy 27 évig gond nélkül tároljon. SRAM hu: statikus véletlen hozzáférésű memória en: static random-access memory Leegyszerűsítve, az SRAM tárolja a programban definiált belső változókat. Az SRAM - szemben a flash-memóriával - árammentes állapotában nem őrzi meg a tartalmát, ezért minden bekapcsolást követően a program újradefiniálja a változókat és azok az ott meghatározott "default" értékükkel kerülnek az SRAM-ba. EEPROM hu: programozható, törölhető, csak olvasható memória en: Electrically Erasable Programmable Read-Only Memory Az EEPROM a board-ok nem felejtő változómemóriája. Ez - hasonlóan a Flash-hez - kikapcsolás során is megőrzi a tartalmát, de - és szintúgy, mint a Flash esetén - "csak" 100.000 írásciklusra van hitelesítve, azaz például a ciklikus adatírásra nem igazán alkalmas. Ráadásul egy kicsit lassabb is a kezelése, mint a "normál" SRAM-é. Ezekből a technikai jellemzőkből adódóan az EEPROM az alábbi funkciókra alkalmazható: konfiguráció(k) letárolása indulási alapbeállítások mentése újraindulásoktól független számlálók, értékek, gyüjtött értékek (pl. Üzemóraszámláló) mentése Az EEPROM többféle módon is bővíthető: I²C-n keresztül elérhető EEPROM IC-vel: AT24C256 I²C EEPROM IC és modul SD kártyával: Micro SD kártyamodul Arduino IDE Az Arduino IDE egy JAVA nyelven írt feljesztői rendszer, mellyel miután programogokat írunk az Arduino-ra, ezekett lefordítja és debug-olja, majd le is tölti a kártyákra. A letöltés leggyakrabban az USB porton keresztül történik, mely szinte minden Arduino board-on megtalálható, de lehetőség van ISP vagy OTA letöltésre is, ha az adott kártya is biztosítja ezeket a lehetőségeket. Az Arduino-k egy előre beégetett bootloader-rel rendelkeznek, ez teszi lehetővé a kódok letöltését külső hardver nélkül, egyszerűen az STK500 protokollon keresztül. Amennyiben ez szükséges, a fenti bootloader az ICSP (In-Circuit Serial Programming) (→ISP) csatlakozó használatával megkerülhető. Az Arduinók programozásához természetesen nagyon sok lehetőségünk van a meglehetősen fapados (de hatékony és ingyenes) Arduino IDE-n kívül is. használható például a VisualStudio is erre a célra egy Arduino bővítmény telepítése után. Kapcsolódó oldalak: Az Arduino IDE telepítése lépésről lépésre Az Arduino IDE magyarra kapcsolása Felmerülő problémák az Arduino csatlakoztatása kapcsán Arduino és USB Az Arduino board-okat alapvetően PC-nkről az USB porton keresztül programozhatjuk (van jópár más megoldás is..), és a program futása során a "serial" információk is ezen keresztül érkez(het)nek a PC-nkre. A legtöbb board a "klasszikus" FTDI USB kommunikáció-IC-t tartalmazza a kapcsolatra, de előfordulhat, hogy az un. (kínai) CH340..CH341 IC-ket építettek be. Ezeknek mindegyike más-más drivert igényel, erre ügyelni kell az első eltérő board alkalmazásánál, mert előfordulhat, hogy a PC-nk nem látja az Arduino-t. Ráadásul a legtöbb Arduino USB port rendelkezik egy túláramvédelemmel (resettable polyfuse), mely az 500 mA-t meghaladó áramfelvétel vagy rövidzárlat esetén automatikusan leold. Kapcsolódó oldalak: Az Arduino csatlakoztatása a PC-hez Felmerülő problémák az Arduino csatlakoztatása kapcsán TTL logikai szintek A logikai magas (HIGH) és alacsony (LOW) szinteket alkalmazó (digitális) elektronikai berendezések többnyire az un. TTL logika (Transistor-Transistor Logic) alapján definiálják a magas/alacsony jelekhez köthető feszültségszinteket. Ezektől a szintektől az Arduino logikai szintjei némileg eltérnek: VOH: Minimális kimeneti tápfeszültségszint. Efölött a TTL eszköz HIGH jelet biztosít. VIH: Minimális bemeneti feszültségszint a magas (HIGH) jelhez. VIL: Maximális bemeneti feszültségszint az alacsony (LOW) jelhez. VOL: Maximális kimeneti feszültsége egy alacsony (LOW) jelhez. A letakart részeken a bemenet kiértékelése (HIGH vagy LOW) bizonytalanná válik. Míg a program-logikai szinteket a true (igaz, 1) és false (hamis, 0) konstansokkal, addig a pin-ek állapotát a HIGH (magas, 1) illetve a LOW (alacsony, 0) konstansokkal lehet jellemezni. A HIGH állapot egy jel olvasása esetén az 5V-os bemeneteken 3V jelszint felett, míg a 3,3V bemeneteken 2,0V felett jelentkezik. A LOW állapotok 5-os board-oknál 1,5V alatt, 3,3V-os boardoknál kb. 1,0V alatt jelentkeznek. A köztes feszültségszinteket (5V-os boardoknál 1,5V - 3,0V, 3,3V-os board-oknál 1,0V - 2,0V) érdemes kerülni, mert a bemeneti állapot bizonytalanná válik. Amennyiben a bemeneti felhúzóellenállás előzőleg aktiválásra került az adott pin-en, akkor onnan jó eséllyel soha nem fogunk HIGH állapotot olvasni, lásd: digitalRead(). Kimenetek esetén a HIGH állapot kiadását követően a pin a maximális feszültségszintet veszi fel, azaz 3,3V-os board-oknál a 3,3V-ot, az 5V-osoknál az 5V-ot. Amennyiben előzően a belső felhúzóellenállást aktiváltuk, a kimeneti feszültség is HIGH jel esetén az 5V helyett kevesebb (kb. 3,3V) lesz, lásd: digitalWrite(). Pin-ek terhelhetősége Az Arduino-k (már csak egyszerű konstrukciójuknál fogva) nem igazán terhelhetők, és ezzel minden nagyobb áramot igénylő vezérlésnél (szolenid szelepek, relék,..) figyelembe kell venni. Komolyabb túlterhelés esetén a board egyszerűen meghal, kisebb (és rövid idejű túlterhelés esetén) lekapcsol. Rosszul méretezett relévezérlés esetén előfordulhat, hogy az Arduino egyszerűen ki-be kapcsolgat (a relék meg ennek megfelelően "klattyognak") - nos ilyen esetben érdemes átgondolni a board terhelését. Főbb terhelhetőségi határértékek (ezek persze típusonként változhatnak): Pinek terhelhetősége az UNO esetén (5V): 20 mA Pinek terhelhetősége az Mega board esetén (5V): 40 mA Pinek terhelhetősége (3.3V esetén): 10 mA Az összes pin (Vcc, GND) maximális terhelhetősége (UNO): 200 mA Az összes pin (Vcc, GND) maximális terhelhetősége (Mega): 400..800 mA Tapasztalatom szerint a pineket nem érdemes 15 mA és az egész board-ot (UNO) 150 mA felett terhelni, mert "klattyogás" lesz a dolog vége. A nagyobb áramfelvételű fogyasztókat érdemes optóval leválasztott relékkel, solid-state relékkel vagy tranzisztorokkal (triac, TIP120, miegyéb..) leválasztani az Arduino-tól, már csak azért is, mert a túl nagy - előre nem látott - áramokkal (felfutási terhelés, visszaáram, generátoros ezmegaz) szemben a board egyáltalán nem védett, azaz le fog égni. Pin-ek felhasználása Az Arduino pinek felhasználására van pár "apróbb" tudnivaló és trükk, ezek számos "megmagyarázhatatlan" problémának is az okai adott esetben: A pin0 és pin1 a soros kommunikációhoz van kötve, így amennyiben információt akarunk kapni a board-tól, és használjuk a "Serial.print" utasítást, hogy a serial monitorra információt küldjünk, ezek a pinek erre az időre digitális ki-bemenetként nem használhatók. Lehetőség szerint ne is definiáljuk ezeket digitális csatornaként, vagy ha ez nem meg, mert kifogytunk a pin-ekből, akkor olyan funkciót pakoljunk ide, melytől el tudunk köszönni a serial használatának az idejére. Az analog pin-eket minden további nélkül fel lehet használni digitális portként, ilyenkor egyszerűen, például az Uno esetén pin 14..19-ként kell rájuk hivatkozni, mint az a lenti ábrán is látható. Saját tapasztalaom az, hogy már a tervezésnél érdemes "kijelölni" a szabadon hagyandó portokat. Mivel kommunikációra leginkább az I²C-t használom, ezért az Uno esetén az A4-et és A5-öt erre a kommunikációra tarom fel. Ugyanígy - főleg a teszteléshez - érdemes számolni a soros kommunikációval és az ahhoz tartozó portokkal, azaz az Uno esetén a 0 (Rx) és 1 (Tx) pinekkel. Arduino ISP Az ISP (In-system programming) port, ami jellemzően az Arduino (és kompatibilis) kártyákra van integrálva, lehetőséget biztosít arra, hogy az USB/bootload megkerülésével törtsünk le programot a kártyára. Emellett kommunikációs lehetőséget is biztosít SPI kommunikációra, például kártyák között. A lehetséges portok lábkiosztásai: Ráadásul ezek a lábak az IO portok megfelelő lábaival (lásd lent) is párhuzamosan vannak kötve, így itt egyszerűen csak össze vannak "csoportosítva" a letöltésekhez. Lehetőség van arra is, hogy egy Arduino kártyát alkalmazunk arra, hogy más Arduino-kra programokat töltsünk fel az ISP-n keresztül. Arduino ISP portneverövid leírás MISOMaster In Slave Outmasterként bemenet, slaveként kimenet VTG5Vbetáp 5V+ SCKSerial Clocksoros órajel, SPI-nél a master adja MOSIMaster Out Slave Inmasterként kimenet, slaveként bemenet RSTResetreset GND0V0V Arduino SPI Az Arduino kártyákon egyik gyakran alkalmazott kommunikáció az SPI. Az ehhez szükséges könyvtárakat és a példa-bekötéseket a konkrét moduloknál ismertetem, ezeknek az összefoglalása itt található: Arduino SPI kommunikáció. Az Arduino-kon az ISP csatlakozómodul is SPI-t alkalmaz, ez viszonylag egyszerűen projektálható (sajnos az "SS" itt nem kapott helyet): Az alapértelmezett portok a kommunikációhoz a külömböző board-okon az alábbiak: kártya neveSPI SS (kiválasztás)SPI MOSISPI MISOSPI SCK Arduino UNO10111213 Arduino Mega53505152 Arduino NanoD10D11D12D13 Az Aduino-s SPI megoldások összefoglalása itt található: Arduino SPI kommunikáció. Az Aduino SPI könyvtár leírása: https://www.arduino.cc/en/Reference/SPI Meg ez is (de bővebb): http://www.gammon.com.au/spi Arduino ISR en: interrupt service routine Az ISR (interrupt service routine) (magyarul megszakításkezelés) funkció a gyorsan váltakozó állapotú bemenetek felügyeletére lett kifejlesztve. Ezek a megszakítások jellemzően a gyors impulzusok (Hall-impulzusok - átfolyásmérők, áramjel-impulzusok) számlálására vagy figyelésére alkalmasak, függetlenek a program futásciklusától. Szoftver oldalról ezeket a jeleket az attachInterrupt() funkcióval kell lekezelni, és csak az erre a célra kijelölt portokon lehet ezeket a gyors jeleket beolvasni: kártyainterrupt-ra kijelölt digitális portok Arduino Uno, Arduino Nano, Mini, egyéb 328-alapú2, 3 Arduino Mega, Mega2560, MegaADK2, 3, 18, 19, 20, 21 Micro, Leonardo, egyéb 32u4-alapú0, 1, 2, 3, 7 Wemos D1az összes digitális kimenet (kivéve a D0) A interrupthívásokhoz szükséges funkciók leírása itt található: attachInterrupt() detachInterrupt() interrupts() noInterrupts() Példák az interrupt-hívásra YF-S201 áramlásmérés Arduino PWM A PWM (pulse-width modulation) egy olyan jelképzési forma, mellyel a digitális kimeneten analóg kimeneti jeleket képezhetünk, azaz ez egy digitális-analóg konverter funkció. A PWM kimenetek vezérlését az Arduino-knál az analogWrite() funkcióval lehet végezni. A kijelölt - ~-lal jelölt - PWM digitális kimeneteken 980 Hz-es frekvencia érhető el, a többin pedig 490 Hz. Boardkijelölt PWM kimenetek A legtöbb, ATmega168-as vagy ATmega328-as board-oknál Arduino Uno, Arduino Nano3., 5., 6., 9., 10. és 11. pin Arduino Mega2..13. és 44..46. pin Wemos D1az összes digitális kimenet (kivéve a D0) régebbi board-oknál9, 10 és 11. pin Arduio AREF pin Az AREF pinen keresztül, az analogReference() funkción keresztül az analóg bemenethez használt külső (type: EXTERNAL) referenciafeszültséget (azaz a bemeneti tartomány maximális értékét) lehet beállítani. Arduino soros kommunikáció Az Arduino board-ok alapértelmezett kommunikációja a soros (UART), melyet az USB-n keresztül folytatnak a programozókészülékkel vagy a kommunikációs partner PC-vel. Az USB porttal párhuzamosan van kötve a board-ok TX és RX pin-jei is, így amennyiben soros kommunikációt használ, ezeket a pin-eket nem használhatja digitális portként. Ez a csatorna természetesen használható más UART kommunikációra is, például RS-232-re, de ebben az esetben ügyelni kell a feszültségszintekre, ami az RS-232 esetén jellemzően ± 12V. Valamennyi Arduino board-nak legalább egy soros (UART) portja van, ezeknek a pin-kiosztása: boardsoros kommunikáció pin-jei Arduino Uno, NanoRx←0, Tx→1 Arduino Mega, DueSerial1: pin 19 (RX) pin 18 (TX), Serial2: pin 17 (RX) pin 16 (TX), Serial3: pin 15 (RX) pin 14 (TX) Alkalmazása: Serial funkció Arduino I²C Az Arduino kártyákon az egyik leggyakrabban alkalmazott kommunikáció az I²C. Az ehhez szükséges könyvtárakat és a példa-bekötéseket a konkrét moduloknál ismertetem, ezeknek az összefoglalása itt található: Arduino I²C kommunikáció. Az alapértelmezett portok a kommunikációhoz a külömböző board-okon az alábbiak: kártya neveSDA (adat-port)SCL (órajel-port)megjegyzés Arduino UNOA4A5 Wemos D1A4 (SDA)A5 (SCL)az összes digitális kimenet (kivéve a D0) alkalmazható I²C-re Az I²C általános leírása: I²C Az Aduino-s I²C megoldások összefoglalása itt található: Arduino I²C kommunikáció. Az Arduino WIRE könyvtárának a leírása (ez valósítja meg az I²C kommunikációt) itt található: WIRE library funkciók Arduino EEPROM A különböző Arduino board-ok eltérő méretű EEPROM-mal rendelkeznek: ATmega328P: 1024 bájt ATmega168: 512 bájt ATmega8: 512 bájt ATmega1280: 4096 bájt ATmega2560: 4096 bájt Tovbbi információk az EEPROM alkalmazására: EEPROM