Bevezetés a mikrovezérlők programozásába: WS2812 RGB LED-ek vezérlése



Hasonló dokumentumok
MSP430 programozás Energia környezetben

Bevezetés a mikrovezérlők programozásába: Fényérzékelés, fénymérés

MSP430 programozás Energia környezetben. Nokia 5110 grafikus kijelzo vezérlése

Bevezetés a mikrovezérlők programozásába: Léptetőmotorok vezérlése

3. Hőmérők elkészítése

MSP430 programozás Energia környezetben. Alfanumerikus LCD kijelzok

MSP430 programozás Energia környezetben. LED kijelzok második rész

Mérési útmutató. A/D konverteres mérés. // Első lépésként tanulmányozzuk a digitális jelfeldolgozás előnyeit és határait.

Bevezetés a mikrovezérlők programozásába: Programciklusok szervezése, analóg I/O

Vegyes témakörök. A KAT120B kijelző vezérlése Arduinoval

A Hobbielektronika csoport. bemutatója

AVR assembly és AVR C modulok együttes használata AVR C projektben. Összeállította: Sándor Tamás

Bevezetés az elektronikába

Mintavételes szabályozás mikrovezérlő segítségével

16F628A megszakítás kezelése

MSP430 programozás Energia környezetben. LED mátrix vezérlése MAX7219 IC-vel

Bevezetés a mikrovezérlők programozásába: MAX6958: Hétszegmenses LED kijelző vezérlő

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

MSP430 programozás Energia környezetben. Az I/O portok kezelése

Készítette: Ruzsinszki Gábor webmaster442

Országzászlók (2015. május 27., Sz14)

MSP430 programozás Energia környezetben. LED kijelzok második rész

KNX távirat nyugtázása. Épületinformatika. KNX távirat példa. KNX távirat példa

Léptetőmotorok. Előnyök: Hátrányok:

3. Gyakorlat Ismerkedés a Java nyelvvel

MSP430 programozás Energia környezetben. Digitális szenzorok

SZERVER OLDALI JAVASCRIPT. 3. hét Javascript nyelvi elemek

Programozás 5. Dr. Iványi Péter

Információs Technológia

loop() Referencia:

C# osztályok. Krizsán Zoltán

Bevezetés az Arduino mikrovezérlők programozásába

Matematikai alapok. Dr. Iványi Péter

Mielıtt használná termékünket Az eltérı környezeti körülmény elektromos áramütést, tüzet, hibás mőködést vagy. okozhat.

DIGITÁLIS TECHNIKA 7. Előadó: Dr. Oniga István

DIGITÁLIS TECHNIKA 7-ik előadás


A mikroszámítógép felépítése.

Bevezetés a mikrovezérlők programozásába: LCD kijelzők

Megjegyzés: A leírás abszolút kezdők számára készült elnézést azoktól, akik ezen a szinten már túlvannak!

Információs Technológia

Többfunkciós hobbirobot építése és vezérlése Arduino UNO mikrovezérlő kártya segítségével

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

MSP430 programozás Energia környezetben. Hétszegmenses LED kijelzok

Nyomtatóport szintillesztő 3V2

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Egyszerű RISC CPU tervezése

MSP430 programozás Energia környezetben. Analóg jelek mérése

Mérési útmutató a Mobil Kommunikáció és Kvantumtechnológiák Laboratórium méréseihez

117. AA Megoldó Alfréd AA 117.

BESZERELÉSI ÉS HASZNÁLATI ÚTMUTATÓ. Fejtámlamonitor

MSP430 programozás Energia környezetben. Szervó motorok vezérlése

DUALCOM SIA IP TELEPÍTÉSI ÉS ALKALMAZÁSI ÚTMUTATÓ. V és újabb modulverziókhoz. Dokumentum verzió:

SZÍNES KÉPEK FELDOLGOZÁSA

ÉRZÉKELŐK ÉS BEAVATKOZÓK I. GY1.1 SENSACT0 PÉLDAPROGRAM

Mobil Car 08 /08d. Gépkocsi riasztó és központi zár vezérlő GSM modul hívószám felismeréssel

A rendszerbe foglalt reléprogram 1954 óta. Újdonságok nyara

Feladat: Hogyan tudunk létrehozni egy olyan vector nevű tömb típust, amely egy háromdimenziós térbeli vektort reprezentál?

Az MSP430 energiatakarékos használata

Jelformáló áramkörök vizsgálata Billenő áramkörök vizsgálata (Időkeret: 5óra) Név:

Budapesti Műszaki és Gazdaságtudományi Egyetem Villamosmérnöki és Informatikai Kar Irányítástechnika és Informatika Tanszék DARU IRÁNYÍTÁSA

Programozás C++ -ban 2007/4

WiLARM-ONE GSM Átjelző Modul Telepítői kivonat Version: 1.1

Vegyes témakörök. 5. Gagyiszkóp házilag hangfrekvenciás jelek vizsgálata. Hobbielektronika csoport 2018/2019. Debreceni Megtestesülés Plébánia

UH-zongora - zenélés mikrokontrollerrel

DIGITÁLIS ADATTÁRAK (MEMÓRIÁK)

0.1. Mi az a standard be- és kimenet? A két mintafeladat leírása

Hardver modellezés SystemC-vel és SDL grafikus könyvtárral Visual Stúdió alatt

Bevezetés az elektronikába

Arduino bevezető Szenzorhálózatok és alkalmazásaik

Kanadai DOC közlemény Fontos biztonsági utasítások fejezet Üzembehelyezés A monitor kicsomagolása... 4

Tartalmi táblázat. Óvintézkedések...2 SPECIÁLIS MEGJEGYZÉSEK AZ LCD MONITOROKON...3. Csomag tartalma...3. Installációs utasítások...

Mikrovezérlők Alkalmazástechnikája

WiLARM-1 GSM Átjelző Modul Telepítői útmutató

Technológia funkciók Számláló, PWM

Bevezetés a Modbus kommunikációba

Programozás 3. Dr. Iványi Péter

TC3XY NT/MT Beléptető rendszer 1.0 verzió Telepítési Útmutató

Üzembe helyezési és telepítési kézikönyv. S Sorozat Duplasugár

Digitális mérœtapintók és interfész-modulok adatgyüjtéshez és elemzéshez

Elektronikus dobókocka

80-as sorozat - Idõrelék A

M-Bus Master MultiPort 250D/L

4. Öröklődés. Programozás II

DIGITAL LUX

Bevezetés a mikrovezérlők programozásába: DC motorok vezérlése

Katalógus. BUDAPEST 1064 RÓZSA UTCA 90. TEL. (06-1) FAX. (06-1) Web:

Whead 3.0. Szélsebesség és széliránymérő illesztő távadó. Előzetes

Utasítások. Excel VII. Visual Basic programozás alapok. A Visual Basic-kel megoldható feladatok típusai Objektumok, változók Alprogramok

LOGSYS LOGSYS ECP2 FPGA KÁRTYA FELHASZNÁLÓI ÚTMUTATÓ szeptember 18. Verzió

Termékismertető BRE2-SG típusú kombikészülék egyszerű bináris ki- és bemenettel

TC3XY Gyorskezdés Segéd Útmutató es verzió

as sorozat - Időrelék A Felu gyeleti és időrelék

PANELMÛSZEREK. 2 relé K3GN-NDC DC24V K3GN-NDC-FLK DC24V. 3 tranzisztor K3GN-NDT1 DC24V K3GN-NDT1-FLK DC24V. 2 relé K3GN-PDC DC24V K3GN-PDC-FLK DC24V

Általános tudnivalók. Rendszerfelépítés

Bevezetés a mikrovezérlők programozásába: I/O portok kezelése, számrendszerek, bitműveletek

Bevezetés a programozásba 2

Zelio Time időrelék. Katalógus 2012

kezelési útmutató PC1-s88 interfész digitools.hu

Használati Utasítás SZÍNES LCD TELEVÍZIÓ LC5-D20BB. Modellszám: Sorozatszám: MEGFElELŐSÉGI NYILATKOZAT

Átírás:

Bevezetés a mikrovezérlők programozásába: WS2812 RGB LED-ek vezérlése 1

Megjegyzések: Lab 2 projektek Neopixel_simple egy WS2812 LED beállítása előre egy megadott színre. Neopixel_random véletlen színát generálása és egy WS2812 LED vezérlése simple ugyanaz, mint a Neopixel_simple, csak itt 8 db LED-et vezérlünk strandtest különféle fényeffektusok WS2812 LED szalag kipróbálásához buttoncycler hasonló strandtest-hez, de csak nyomógombra lép tovább SimpleNeopixelDemo leegyszerűsített LED kezelés és néhány effektus Az utolsó mintaprogram kivételével mindegyik igényli az Adafruit_Neopixel könyvtárat (az Arduino_Lab23.zip állomány természetesen már ezt is tartalmazza) A honlapról letölthető Arduino_Lab23.zip állományt az alábbi mappába bontsuk ki: c:\fehasználók\<usernév>\dokumentumok\arduino Fontos, hogy a kibontott csomagban található libraries almappa tartalmát az alábbi mappába mozgassuk át: c:\fehasználók\<usernév> \Dokumentumok\Arduino\libraries 2

WS2812 alapok Kezdetben volt a WS2801 és a WS2811 LED vezérlő IC (WS = World Semi, a gyártó). A WS2812 (NeoPixel) viszont egy olyan 5x5 mmes RGB LED, amelybe már be van építve egy WS2811- hez hasonló vezérlő! 5050 méretű RGB LED 5050 méretű WS2812 3

WS2812 belső felépítése VSS VDD DO NC DI VCC 4

WS2812 lábkiosztás, paraméterek mm Láb Név Funkció 1 DO Adat kimenet 2 DI Adat bemenet 3 VCC Vezérlő tápfeszültsége 4 NC Nincs bekötve 5 VDD LED-ek tápfeszültsége 6 VSS Közös pont (GND) Paraméter Jel Határérték Egység Tápfeszültség (vezérlő) VCC +6,0 7,0 V Tápfeszültség (LED) VDD +6,0 7,0 V Bemeneti jelszint DI -0,5 VDD+0,5 V Áramfelvétel LED-enként I 0 20 ma Megjegyzések: Erős a gyanú, hogy az adatlapban van némi keveredés 1. A tápfeszültség inkább +5,0 7,0 V, nem pedig +6,0 7,0 V! 2. A bemeneti jelszint inkább a vezérlő, mintsem a LED-ek tápfeszültségéhez igazodik! 5

WS2812 szalag bekötése Az áramfelvétel számításához LED-enként 3 x 20 ma maximális áramot vegyünk! Méterenként 30 db LED-del számolva ez 1.8A/m áramfelvételt jelent. 6

WS2812 kommunikáció T0H T1H Az egyes bitek értéke a magas szinten eltöltött időtől függ. T0H: (350 ± 150) ns T1H: (700 ± 150) ns RESET: alacsony szint T 50 000 ns ideig. Adatformátum: 3 x 8 bit, GRB sorrendben, magas helyiértékű bit elöl. 7

Adafruit_Neopixel programkönyvtár Leírás: Adafruit Neopixel Überguide Letöltés: github.com/adafruit/adafruit_neopixel/archive/master.zip Használata: Az alábbi rövid kód képezi a simple.ino program vázát. #include <Adafruit_NeoPixel.h> //Fejléc becsatolás #define PIN 8 //Melyik lábról menjen a vezérlés? //Objektumosztály példányosítása Adafruit_NeoPixel strip = Adafruit_NeoPixel(8, PIN, NEO_GRB + NEO_KHZ800); void setup() { strip.begin(); void loop() { for(int i=0;i<8;i++){ //Egyenként állítjuk be a LED-eket strip.setpixelcolor(i,0,150,0); //RGB adat: közepes fényerejű zöld strip.show(); //kiküldi a beállításokat a LED-eknek delay(250); //Késleltetés (millisec) Pixelek száma Kimenet LED típusa, sebessége 8

Adafruit_Neopixel programkönyvtár A legfontosabb tagfüggvényeket az alábbi táblázatban foglaltuk össze. Adafruit_NeoPixel(uint16_t n, uint8_t p=6, neopixeltype t=neo_grb + NEO_KHZ800); Adafruit_NeoPixel(void); setpin(uint8_t p) updatelength(uint16_t n), updatetype(neopixeltype t); begin(void) show(void) setpixelcolor(uint16_t n, uint8_t r, uint8_t g, uint8_t b) setpixelcolor(uint16_t n, uint32_t c), Color(uint8_t r, uint8_t g, uint8_t b) setbrightness(uint8_t b) clear(void) Konstruktor függvény Konstruktor, alapértelmezett paraméterekkel Vezérlő láb számának megadása Pixelek számának módosítása LED típus módosítása Kezdeti beállítás, RAM memória helyfoglalás Megjelenítés az előzőleg beállított adatokkal Adott sorszámú pixel színének megadása RGB színkomponensekkel Adott sorszámú pixel színmegadása színkóddal Színkód származtatása RGB komponensekből Fényerősség beállítása (csak egyszer hívható!) Mindegyik LED színét nullázza ( fekete ) 9

Neopixel_simple.ino Az alábbi program egyetlen LED-et gyújt ki zöld fénnyel. Ha a NUMPIXELS értékét átírjuk, akkor tetszés szerinti számú LED-et vezérelhetünk. Ha D8 helyett másik kivezetést használunk, akkor a PIN makróban írjuk át az értéket! Megjegyzés: A program igényli az Adafruit_NeoPixel könyvtárat! #include <Adafruit_NeoPixel.h> //Fejléc becsatolás #define PIN 8 //Melyik lábról menjen a vezérlés? #define NUMPIXELS 1 //Pixelek száma (1 vagy 8 vagy több?) //Az objektumosztály példányosítása Adafruit_NeoPixel pixels=adafruit_neopixel(numpixels, PIN, NEO_GRB + NEO_KHZ800); void setup() { pixels.begin(); //inicializálás pixels.show(); //kiküldi a beállításokat a LED-eknek void loop() { for(int i=0;i<numpixels;i++){ //Egyenként állítjuk be a LED-eket pixels.setpixelcolor(i,0,150,0); //RGB adat: közepes fényerejű zöld pixels.show(); //kiküldi a beállításokat a LED-eknek delay(500); //Késleltetés (500 millisec) 10

Neopixel_random.ino Az alábbi programban egyetlen LED színét változtatjuk véletlenszerűen, fokozatos színátmenettel. Az átmenetet 50 lépésre bontjuk, lépésenként 50 ms-ot várunk. Megjegyzés: A program igényli az Adafruit_NeoPixel könyvtárat! #include <Adafruit_NeoPixel.h> //Fejléc becsatolás #define PIN 8 //Melyik lábról menjen a vezérlés? #define NUMPIXELS 1 //Pixelek száma (1 vagy 8 vagy több?) //Az objektumosztály példányosítása Adafruit_NeoPixel pixels=adafruit_neopixel(numpixels, PIN, NEO_GRB + NEO_KHZ800); int delayval = 50; //várakozás színváltások közben float RGB1[3]; float RGB2[3]; float INC[3]; float SUM; uint8_t red, green, blue; void setup() { //--- Kiindulási színek generálása, véletlenszerűen for (int x=0; x<3; x++) { RGB1[x] = random(256); RGB2[x] = random(256); pixels.begin(); // inicializálja a NeoPixel objektumot Folytatás a következő oldalon... 11

Neopixel_random.ino (folytatás) void loop() { //--- Az 1. színből a 2. színbe történő átmenet lépéseinek meghatározása for (int x=0; x<3; x++) { INC[x] = (RGB1[x] - RGB2[x]) / 50; //Az átmenetet 50 lépésre bontjuk for (int s=0; s<256; s+=5) { red = int(rgb1[0]); green = int(rgb1[1]); blue = int(rgb1[2]); //--- A közelítő szín kijelzése pixels.setpixelcolor(0, pixels.color(red,green,blue)); pixels.show(); // A beállított szín tényleges kiküldése for (int x=0; x<3; x++) { RGB1[x] -= INC[x]; //Közelítünk a másik színhez delay(delayval); //--- Új színt konstruálunk, véletlen számok generálásával for (int x=0; x<3; x++) { RGB2[x] = random(256); 12

simple.ino Az alábbi program 8 db LED-et gyújt ki zöld fénnyel. A program mindenben megegyezik a korábbi Neopixel_simple.ino programmal, csak a pixelek számát írtuk át. Megjegyzés: A program igényli az Adafruit_NeoPixel könyvtárat! #include <Adafruit_NeoPixel.h> //Fejléc becsatolás #define PIN 8 //Melyik lábról menjen a vezérlés? #define NUMPIXELS 8 //Pixelek száma (1 vagy 8 vagy több?) //Az objektumosztály példányosítása Adafruit_NeoPixel pixels=adafruit_neopixel(numpixels, PIN, NEO_GRB + NEO_KHZ800); void setup() { pixels.begin(); //inicializálás pixels.show(); //kiküldi a beállításokat a LED-eknek void loop() { for(int i=0;i<numpixels;i++){ //Egyenként állítjuk be a LED-eket pixels.setpixelcolor(i,0,150,0); //RGB adat: közepes fényerejű zöld pixels.show(); //kiküldi a beállításokat a LED-eknek delay(500); //Késleltetés (500 millisec) 13

strandtest.ino Az alábbi program különféle fényeffektusokat mutat be LED szalagok vagy lécek kipróbálásához. Mi 8 db LED-et használunk, az eredeti mintaprogram néhány idegesítő effektusát kihagytuk. Megjegyzés: A program igényli az Adafruit_NeoPixel könyvtárat! #include <Adafruit_NeoPixel.h> //Fejléc becsatolás #define PIN 8 //Melyik lábról menjen a vezérlés? #define NUMPIXELS 8 //Pixelek száma (1 vagy 8 vagy több?) //Az objektumosztály példányosítása Adafruit_NeoPixel strip=adafruit_neopixel(numpixels, PIN, NEO_GRB + NEO_KHZ800); void setup() { strip.begin(); //inicializálás strip.setbrightness(127); //Visszafogjuk a maximális fényerőt strip.show(); //kiküldi a beállításokat a LED-eknek void loop() { colorwipe(strip.color(255, 0, 0), 250); // Red és 250 ms késleltetés colorwipe(strip.color(0, 255, 0), 250); // Green és 250 ms késleltetés colorwipe(strip.color(0, 0, 255), 250); // Blue és 250 ms késleltetés rainbow(20); rainbowcycle(20); 14

strandtest.ino (folytatás) colorwipe() a simple program loop ciklusához hasonlóan egyenként gyújtja ki a LED-eket rainbow() szivárvány szerűen különféle színeket állít be Wheel() színkerék függvény void rainbow(uint8_t wait) { uint16_t i, j; for(j=0; j<256; j++) { for(i=0; i<strip.numpixels(); i++) { strip.setpixelcolor(i, Wheel((i+j) & 255)); strip.show(); delay(wait); uint32_t Wheel(byte WheelPos) { WheelPos = 255 - WheelPos; if(wheelpos < 85) { return strip.color(255 - WheelPos * 3, 0, WheelPos * 3); if(wheelpos < 170) { WheelPos -= 85; return strip.color(0, WheelPos * 3, 255 - WheelPos * 3); WheelPos -= 170; return strip.color(wheelpos * 3, 255 - WheelPos * 3, 0); 15

strandtest.ino (folytatás) // Slightly different, this makes the rainbow equally distributed throughout void rainbowcycle(uint8_t wait) { uint16_t i, j; for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel for(i=0; i< strip.numpixels(); i++) { strip.setpixelcolor(i, Wheel(((i * 256 / strip.numpixels()) + j) & 255)); strip.show(); delay(wait); 16

buttoncycler.ino Ez a program lényegében ugyanazt csinálja, mint az előző strandtest program, ezért itt nem részletezzük. A fő különbség az, hogy a D2 bemenet és a föld közé egy nyomógombot tettünk, s csak ennek lenyomásakor indítjuk a következő effektust. Megjegyzések: Az első fényeffektus aktiválásához is le kell nyomni egyszer a nyomógombot! A D2 bemenetet belső felhúzással inicializáljuk, így külső felhúzó ellenállásra nincs szükség. 17

SimpleNeopixelDemo.ino Leírás: bigjosh blog: NeoPixels Revealed Program forrása: bigjosh/simpleneopixeldemo (GitHub) Ez a mintaprogram egy leegyszerűsített kezelést végző programkönyvtárat tartalmaz, amely azon alapszik, hogy az az adatlapban megadott időzítések közül nem mindegyik betartása fontos a hibátlan küldéshez. Ezzel a küldő program nagy mértékben egyszerűsíthető, könnyebben áttekinthető. Természetesen az időkritikus részeket itt is assemblyben kell megírni, s a megszakításokat le kell tiltani. A fenti címről letölthető programban el kellett végezni néhány apró változtatást és javítást (pl. cli() helyett disableinterrupts(), sei() helyett interrupts() kell, stb.) Fentieken túlmenően egyszerűsítettük/rövidítettük is a demót 18

SimpleNeopixelDemo.ino Megjegyzés: A program eleji deklarációknál csak a piros értékeket kell változtatnunk (a pixelek száma és a kimenethez tartozó port/bit megadása). Az alábbiakban csak a kritikus részt mutatjuk be: #define PIXELS 8 // Number of pixels in the string // DueMilinove/UNO/Arduino Nano: Digital Pin 8 #define PIXEL_PORT PORTB // Port of the pin the pixels are connected to #define PIXEL_DDR DDRB // Port of the pin the pixels are connected to #define PIXEL_BIT 0 // Bit of the pin the pixels are connected to #define T1H 900 #define T1L 600 #define T0H 400 #define T0L 900 #define RES 6000 // Width of a 1 bit in ns // Width of a 1 bit in ns // Width of a 0 bit in ns // Width of a 0 bit in ns // Width of the low gap to cause a data frame to latch #define NS_PER_SEC (1000000000L) // Note that this has to be SIGNED #define CYCLES_PER_SEC (F_CPU) #define NS_PER_CYCLE ( NS_PER_SEC / CYCLES_PER_SEC ) #define NS_TO_CYCLES(n) ( (n) / NS_PER_CYCLE ) Folytatás a következő oldalon 19

inline void sendbit( bool bitval ) { if ( bitval ) { // 0 bit asm volatile ( "sbi %[port], %[bit] \n\t" // Set the output bit ".rept %[oncycles] \n\t" // Execute NOPs to delay "nop \n\t" ".endr \n\t" "cbi %[port], %[bit] \n\t" // Clear the output bit ".rept %[offcycles] \n\t" // Execute NOPs to delay "nop \n\t" ".endr \n\t" :: [port] "I" (_SFR_IO_ADDR(PIXEL_PORT)), [bit] "I" (PIXEL_BIT), [oncycles] "I" (NS_TO_CYCLES(T1H) - 2), [offcycles] "I" (NS_TO_CYCLES(T1L) - 2) ); else { // 1 bit asm volatile ( "sbi %[port], %[bit] \n\t" ".rept %[oncycles] \n\t" "nop \n\t" ".endr \n\t "cbi %[port], %[bit] \n\t ".rept %[offcycles] \n\t" "nop \n\t" ".endr \n\t" :: [port] "I" (_SFR_IO_ADDR(PIXEL_PORT)), [bit] "I" (PIXEL_BIT), [oncycles] "I" (NS_TO_CYCLES(T0H) - 2), [offcycles] "I" (NS_TO_CYCLES(T0L) - 2) ); Egy bit kiküldése (Assembly program) Ha egy bitet ki tudunk küldeni, akkor már egy bájtot sem lehet nehéz! inline void sendbyte(uint8_t byte ) { for(uint8_t bit = 0; bit < 8; bit++) { sendbit(bitread( byte, 7)); byte <<= 1; 20

21

Emlékeztető: Arduino nano v3.0 22