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
Arduino board-ok
Az Arduino eleinte az Uno board-ot jelentette, de fejlődéstörténete töretlen. Egyrészt az olasz Arduino-s fejlesztőgárda is folyamatosan dob a piacra új típusokat, másrészt, mivel a típus open-project, azaz a hardvere szabadon másolható és módosítható, hihetetlen széles palettán mozognak az Arduino kompatibilis klónok is. A teljes Arduino-világot szinte lehetetlen áttekinteni, én is csak az általam ismert rész felületes összefoglalására vállalkozok ezen az oldalon.
Néhány Arduino board összevetése
Típus | chip | CPU 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 Uno | ATmega328P | 16 MHz | 6..20V | 5V | 14 (6) | 6 | 32 KB | 2 KB | 1 KB | - |
Arduino Mega2560 | ATmega2560 | 16 MHz | 6..20V | 5V | 54 (15) | 16 | 256 KB | 8 KB | 4 KB | - |
Arduino Nano | 3.x: ATmega328, 2.x: ATmega168 | 16 MHz | 7..12V | 5V | 14 (6) | 8 | 32 KB 16 KB | 2 KB 1 KB | 1 KB 512 Byte | Mini-B USB csatlakozó |
Arduino Micro | ATmega32u4 | 16 MHz | 7..12V | 5V | 20 (7) | 12 | 32 KB | 2.5 KB | 1 KB | 5 hardveres megszakítás, teljes sebességű USB |
Keyes Pro Micro | ATmega32u4 | 8 MHz | 7..9V | 3.3V | 12 (5) | 4 | 32 KB | 2.5 KB | 1 KB | 5 hardveres megszakítás, teljes sebességű USB |
Pro Micro 5V | ATmega32u4 | 16 MHz | 7..9V | 5V | 12 (5) | 4 | 32 KB | 2.5 KB | 1 KB | - |
Arduino Mini | ATmega328P | 3,3V: 8MHz 5V: 16 MHz | 6..20V | 3,3V 5V | 14 (6) | 8 | 32 KB | 2 KB | 1 KB | 2 hardveres megszakítás, nincs USB portja |
STM32F103 | STM32 32-bit Arm Cortex | 72 MHz | 5V | 2.7V..3.6V | 16 | 16 | 64 KB | 20 KB | - | USART / I2C / SPI / USB / CAN / DMA |
STM32F401 | STM32 32-bit Arm Cortex | 25 MHz | 5V | 2.7V..3.6V | 16 | 16 | 256 KB | 64 KB | - | USART / I2C / SPI / USB / CAN / DMA |
Wemos D1 | ESP8266EX- | 9..12V | 3.3V | 11 (11) | 1 | 4 KB | 2 KB | 1 KB | - integrált ESP8266 | |
Duemilanove | ATmega168 ATmega328- | 6..20V | 5V | 14 (6) | 6 | 16KB 32KB | 1KB | 512 byte 1KB | - | |
Digispark | - | - | - | 5V | 14 | 10 | 16KB | 2KB | 1KB | - |
RoboRED | - | - | - | 5V/3.3V | 14 | 6 | 32KB | 2KB | 1KB | - |
ATmega1280 | ATmega1280 | - | 5V | 54 | 16 | 128KB | 8KB | 4KB | - | |
Arduino Leonardo | - | - | 5V | 20 | 12 | 32KB | 2.5KB | 1K | - | |
Arduino Due | - | - | 3.3V | 54 | 12 | 512KB | 96K | - | - | |
ChipKIT Max32 | Diligent | - | 3.3V | 83 | 16 | 512KB | 128KB | - | - | |
Típus | chip | CPU speed | Táp | Üzemi fesz. | Digitális pinek száma | Analóg pinek száma | Flash memória | SRAM memória | EEPROM mérete | Extrák |
Arduino MKR FOX 1200 | SAMD21 Cortex | 32.768 kHz (RTC) 48 MHz | 5V | 3.3V | 8 | 1 | 256 KB | 32 KB | no | Wifi on board |
Az Arduino board-ok memóriatípusai
Memóriafelosztás az ATmega328P-ben
A “Bootloader” a flash memória végén, a kód elől foglal nagyjából 512 bájtot. Ez a terület a kód számára felhasználható, ha nem az USB-s bootloader-t használjuk kódletöltésre, hanem a ICSP-re csatlakoztatunk kódletöltő hardvert. (lásd ICSP modulok)
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
A különböző Arduino board-ok eltérő méretű EEPROM-mal rendelkeznek:
- ATmega168: 512 Bytes
- ATmega8: 512 Byte
- ATmega328P: 1024 Byte
- ATmega32U4: 1024 Byte
- ATmega1280: 4096 Bytes
- ATmega2560: 4096 Bytes
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
EEPROM-ot használó projektek:
- nodemcu_compact_1: nodeMCU compakt
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:
Arduino OTA
en: Over the Air
Az arduino is lehetőséget ad a programok wifin, vagy akár ethernet-shield-en keresztüli letöltésére. Különösen jó lehetőséget kínálnak ennek a funkciónak a kiaknázására az ESP-modulok (ESP8266 vagy ESP32), amiket közvetlenül lehet integrálni az Arduino board-okkal, és így a Wifin keresztüli letöltés megvalósításának nagy részét ezek a modulok viszik el.
Az OTA telepítését az Arduino IDE-ben Eszközök / Könyvtárak kezelése pont alatt a rendelkezésre álló könyvtárak listájából lehet kiválasztani:
Arduino API
en: Application Programming Interface
Az Arduino funkcionalitása a könyvtárrendszeren keresztül bővíthető. A könyvtárak alkalmazása memóriaigényes, de alapos kiválasztásukkal jól optimalizálható a memóriaterhelés, és a programozás jelentős részét is meg lehet spórolni az alkalmazásukkal. Vannak standard könyvtárak, például a Wire, AVR_C, String,.., de rendkívül sok, nagyon alaposan kidolgozott könyvtár tölthető le a Github-ról is. A szenzorok ismertetésénél szinte minden esetben a Github könyvtárakra hivatkozok.
Arduino Bootloader
Az Arduino Boardokon előre betöltött és az Arduino IDE-vel kompatibilis speciális program, amely lehetővé teszi a programok board-okra való feltöltését speciális eszközök nélkül; általában USB-n keresztül.
Sketch
Az Arduino-n futatható programok neve a sketch (vázlat). A sketch-eket .ino fájlokba lehet menteni, vagy onnan betölteni. Az Arduino IDE-ben sok (alap) példaprogram található a File / Examples pont alatt, de szinte minden feltelepített könyvtár is tartalmaz példaprogramokat (ezek szintén a File / Examples pontban nyithatók a telepítésük után, a listán alul találhatók).
Sok sketch soros kapcsolaton keresztül kommunikál a számítógéppel. Az Arduino IDE beépített soros monitorral vagy terminállal rendelkezik, hogy segítsen ezeknek az adatoknak a megjelenítésében. Emellett adatokat is küldhet a board-ra a Monitor segítségével. A soros monitort az „Eszközök” → „Soros monitor” pont alatt találja. Ennek indítása általában újraindítja az Arduino board-ot. Győződjön meg arról, hogy a sebességet, vagyis a baudrátát a megfelelő értékre állította. Ha ezt nem teszi meg, akkor vagy csak szemetet vagy semmit nem fog itt látni. A jellemző adatátviteli sebességek: 9600 vagy 115.200 baud.
Arduino és USB
Az Arduino board-okat alapvetően PC-nkről az USB porton keresztül programozhatjuk (lásd fent, Bootloader, de 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 vagy AtMega16U2 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.
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.
Arduino USB UART konverter típusok:
- FTDI: A korai Arduino-k konverter-típusa, túl drágának bizonyult. Külső konverterként továbbra is szokás használni (az ISP-re csatlakoztatva)
- Atmega8U2: Az első szériás Uno-k konvertere, az R2 verzióig
- AtMega16U2: Aktuálisan a legtöbb (hivatalos) Arduino board UART konvertere
- CH340/CH340G/CH341: a kínai gyártású Arduino klónok jellemző konvertere, a driverek letöltése némileg körülményes
Kapcsolódó oldalak:
Igazság szerint a legegyszerűbb az összes (CH340, CH341) drivernek a telepítése (lásd lent). Helyet igazán nem foglalnak, de ha szükség van rájuk, a rendszer automatikusan eléri ezeket, és ezekkel azonosítani tudja a csatlakoztatott board-okat. Első nekifutásra érdemes csak az újabb fejlesztésű CH341-et telepíteni.
Letöltések:
CH340 driver (régebbi Windows verziókhoz):
Direkt letöltés: CH340 Windows driver
CH341 driver (Windows 10, 32/64 bit) (CH340G,CH340T,CH340C,CH340N, CH340K, CH340E,CH340B,CH341A,CH341F, CH341T,CH341B,CH341C,CH341U):
Direkt letöltés: CH341 Windows driver
Letöltés a driverfejlesztő oldaláról: http://www.wch.cn/download/CH341SER_ZIP.html
FTDI (vagy CH340G) konverter
Sok esetben a letöltés nem lehetséges (vagy nem a legjobb megoldás) az USB-n keresztül. Az Arduino Mini és az Arduino Pro Mini sorozat például a helytakarékosság miatt eleve nem rendelkezik USB-csatlakozóval, így ezeknél elkerülhetetlen a külső letöltő alkalmazása.
A legegyszerűbb megoldás egy FTDI konverter beszerzése, így a PC irányából ugyanúgy USB-n történik a csatlakoztatás, csak a board-hoz kell megfelelő módon illeszteni az átalakítót.
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 tapasztalatom 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/ICSP
Az ISP (In-circuit Serial Programming) az áramköri soros programozást, míg az ICSP (In Circuit Serial Programming) az áramkör soros programozását jelenti. Bármely olyan megoldást, mely lehetővé teszi a mikrovezérlő programozását egy soros protokollt használó áramkörben, ISP-nek vagy ICSP-nek is nevezhetjük.
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 port | neve | rövid leírás |
---|---|---|
MISO | Master In Slave Out | masterként bemenet, slaveként kimenet |
VTG | 5V | betáp 5V+ |
SCK | Serial Clock | soros órajel, SPI-nél a master adja |
MOSI | Master Out Slave In | masterként kimenet, slaveként bemenet |
RST | Reset | reset |
GND | 0V | 0V |
Bővebben: Arduino ICSP modulok
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ártya | interrupt-ra kijelölt digitális portok |
---|---|
Arduino Uno, Arduino Nano, Mini, egyéb 328-alapú | 2, 3 |
Arduino Mega, Mega2560, MegaADK | 2, 3, 18, 19, 20, 21 |
Micro, Leonardo, egyéb 32u4-alapú | 0, 1, 2, 3, 7 |
Wemos D1 | az ö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
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 érhető el a PWM funkció.
Board | kijelölt PWM kimenetek |
---|---|
A legtöbb, ATmega168-as vagy ATmega328-as board-oknál Arduino Uno, Arduino Nano* | 3, 5, 6, 9, 10, 11 pin, pin 5-6: 980 Hz, a többi: 490 Hz |
Arduino Mega | 2..13. és 44..46. pin |
Wemos D1 | az összes digitális kimenet (kivéve a D0) |
Arduino Micro | 0, 1, 2, 3, 7 |
régebbi board-oknál | 9, 10 és 11. pin |
*: az ATmega168-as vagy ATmega328-as board-oknál:
- timer0: pin 5 és 6, 8-bites PWM
- timer1: pin 9 és 10, 16-bites PWM
- timer2: pin 11 és 3, 8-bites PWM
Olyan szervoknál, amik 16 bites felbontást igényelnek, előfordulhat, hogy csak a 9. és 10. pin fog működni!
Az Arduino Micro-val csak 8-bites PWM valósítható meg.
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 kommunikáció
Az Arduino rendszereknél a leggyakrabban használt közvetlen* kommunikációs megoldások összevetése:
*: az Ethernet, Wifi, Can,.. ebben az értelemben nem közvetlen kommunikáció, mert valamilyen átalakítót igényelnek, és az átalakítók csak a lenti kommunikációs formákkal érhetők el.
kommunikációs megoldás | Soros (UART) | I²C | 1-Wire | SPI |
---|---|---|---|---|
partnerek / slave-ek száma maximum | P2P kommunikáció, 1 master + 1 slave | elméletileg 128 állomás | elméleti korlát nincs, gyakorlatilag kb. 150 | Az SS pinek száma határozza meg. SS nélkül 1 master és 1 slave |
áthidalható távolság (≈) | 9600 baud: 2-3 m 300 baud: >100 m (sodort érpár) | 100 Kbaud: 1 m 10 Kbaud: 6-8 m | 20 szenzorral max. 100 m | max. 5 m |
felhasznált pinek száma | 2: Tx, Rx | 2: SDA, SCL | 1: DATA | 3 vagy 4: SCK, MOSI, MISO, (SS) |
korlátozások | Pin 0 és 1 használata esetén a soros letöltés és a soros monitor nem működik | I²C | 1-Wire | SPI |
szenzorok | - | I²C | 1-Wire | SPI |
a kommunikáció általános leírása | - | I²C | 1-Wire | SPI |
Arduino soros kommunikáció
Arduino hardveres 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:
board | soros kommunikáció pin-jei |
---|---|
Arduino Uno, Nano | Rx←0, Tx→1 |
Arduino Mega, Due | Serial1: 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 szoftveres soros kommunikáció
A szoftveres soros kommunikációt a SoftwareSerial könyvtár alkalmazása teszi lehetővé. Míg a HW soros kommunikáció HW komponenseket alkalmaz az UART-hoz, és ez működik más feladatok elvégzése közben is (amíg van hely a 64 byte méretű pufferben), addig a szoftver soros kommunikáció szoftverből megy. Ez nyilván a többi szoftver végrehajtásának a rovására megy, de egyszerre több soros kommunikációt tesz lehetővé, akár 1115.200-as sebességgel.
Az ehhez szükséges SoftwareSerial.h innen tölthető le: http://arduiniana.org/libraries/newsoftserial/
A szoftveres soros kommunikáció korlátai
- Ha több szoftver soros portot kell használni, akkor egyidejűleg csak egy tud fogadni adatokat
- A Mega és a Mega 2560 nem minden pinje alkalmas a szoftver soros kommunikációra, az RX-hez az alábbi pinek használhatók: 10, 11, 12, 13, 14, 15, 50, 51, 52, 53, A8 (62), A9 ( 63), A10 (64), A11 (65), A12 (66), A13 (67), A14 (68), A15 (69).
- A Leonardo esetén az RX-hez csak a következő pinek használhatók: 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).
- Az Arduino Genuino 101 estén az RX maximális sebessége 57.600 bps lehet, és a pin 13 RX-ként nem használható.
Adatvesztés a szoftveres soros kommunikáció során
Ha hosszú üzeneteket küld vagy fogad a szoftveres soros kommunikációval, előfordulhat, néhány hiányzó karakterrel érkeznek ezek meg. Ennek az oka nem feltétlenül a kódban keresendő. Lehet, hogy a SoftwareSerial receive puffer megtelik és ezután eldobja a karaktereket.
A legegyszerűbb megoldás erre az, ha a szoftver soros pufferét alapértelmezett 64 bájttól 256 bájtra növeli (vagy csak nagyobb méretre, mint 64 bájt):
A PC-n nyissa meg az alábbi fájlt: C:\Program Files (x86) → Arduino → hardware → Arduino → avr → libraries → SoftwareSerial → SoftwareSerial.h és módosítsa az alábbi sort:
// RX buffer size #define _SS_MAX_RX_BUFF 64 // 64 módosítása például a maximális 256-ra
Szimultán többszörös szoftver soros kommunikáció
Szimultán többszörös szoftver soros kommunikációhoz az alábbi könyvtárt érdemes használni: https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html
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önböző board-okon az alábbiak:
kártya neve | SDA (adat-port) | SCL (órajel-port) | megjegyzés |
---|---|---|---|
Arduino Uno | A4 | A5 | |
Arduino Mega | 20 | 21 | |
Arduino Nano | 4 | 5 | |
Wemos D1 | A4 (SDA) | A5 (SCL) | az összes digitális kimenet (kivéve a D0) alkalmazható I²C-re |
NodeMCU (ESP8266) | D2(GPIO4) | D1(GPIO5) | a D0 nem használható 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 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 neve | SPI SS (kiválasztás) | SPI MOSI | SPI MISO | SPI SCK |
---|---|---|---|---|
Arduino UNO | 10 | 11 | 12 | 13 |
Arduino Mega | 53 | 50 | 51 | 52 |
Arduino Nano | D10 | D11 | D12 | D13 |
NodeMCU (ESP8266) | D8(GPIO15) | D7(GPIO13) | D6(GPIO12) | D5(GPIO14) |
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 1-wire
Az 1-vezetékes busz a Dallas Semiconductor Corp. soros interfészét írja le, amely egy adatvezetéket (DQ) kezel, mely mind tápegységként, mind pedig adó- és vevővezetékként használnak. Az 1-vezetékes kifejezés félrevezető, mivel a kommunikáció földelést (GND) is igényel. Valójában a 1-wire esetén is mindig minimum két fizikai vezetéket használunk (GND, DQ).
Egy összefoglalót a 1-wire kommunikációt alkalmazó Arduino szenzorokról itt talál: Arduino 1-wire kommunikáció.
Arduino Ethernet
Az Arduino természetesen alkalmas az etherneten keresztüli kommunikációra, az internetes funkciók elérésére. Az ethernet elérésének a legegyszerűbb módja ehternet modul vagy bővítmény alkalmazása. A modulok és bővítmények jellemzően SPI kommunikációt folytatnak az Arduino boardokkal:
A legtöbb ethernet boardra micro-SD kártyaolvasót is integráltak. Ennek a használata opcionális, de plusz egy pin-t foglal a board-on.
Az aktuális Arduino könyvtárinformációk itt találhatók: https://www.arduino.cc/en/reference/ethernet
A modulok / bővítmények ethernet kommunikációját jellemzően WIZnet W5x00 sorozatú IC-i végzik. Ezeknek a főbb tulajdonságainak összehasnlítása:
Funkció | W5100 | W5300 | W5500 |
---|---|---|---|
Interface Mode | direkt, indirekt, SPI | direkt, indirekt | SPI |
Socket-ek száma | 4 | 4 | 8 |
Sebesség (max, MBPS) | 25 | 25 | 15 |
Adatbusz | Only 8 Bit, DATA[7:0] | 16/8 Bit, DATA[15:8]/DATA[7:0] | 16/8 Bit |
Címbusz | 15 PINs, ADDR[14:0] | 10PINs, ADDR[9:0] | 10PINs, ADDR[9:0] |
Memória mérete | (Fix) 16KBytes TX : 8KBytes, RX : 8Kbytes | (konfigurálható) 128KBytes TX : 0~128KBytes, RX : 0~128KBytes | (Fix) 32KBytes TX : 16KBytes, RX : 16Kbytes |