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 UNOATmega328P-6..20V5V14 (6)632 KB2 KB1 KB -
Arduino MEGA2560ATmega2560-6..20V5V54 (15)16256 KB8 KB4 KB -
Arduino NanoATmega328P-7..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 Aduino-s I²C megoldások összefoglalása itt található: Arduino I²C kommunikáció.

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