Ez a dokumentum egy előző változata!


Arduino

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

TípuschipCPU
speed
TápÜzemi
fesz.
Digitális
pinek száma
(pwm pinek)
Analóg
pinek száma
Flash
memória
SRAM
memória
EEPROM
mérete
Extrák
Arduino UNOATmega328P16 MHz6..20V5V14 (6)632 KB2 KB1 KB -
Arduino MINIATmega328P3,3V: 8MHz
5V: 16 MHz
6..20V3,3V
5V
14 (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
32KB
1KB512 byte
1KB
-
Digispark---5V141016KB2KB1KB-
RoboRED---5V/3.3V14632KB2KB1KB-
ATmega1280ATmega1280-5V5416128KB8KB4KB-
Arduino Leonardo--5V201232KB2.5KB1K-
Arduino Due--3.3V5412512KB96K--
ChipKIT Max32Diligent-3.3V8316512KB128KB--

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ő:

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:

ATmega328 IC

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:

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:

TTL logikai szintek

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().

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.

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 UNO pinek

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:

Arduino ISP lábkiosztás

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

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):

SPI

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

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ó:

Példák az interrupt-hívásra

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 Nano
3., 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

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.

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ó

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

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