A vezérelhető, címezhető neopixel ledekkel látványos fényhatások érhetők el, Karácsony közeledtével pedig csábító, hogy felhasználásukkal különböző lakás vagy akár karácsonyfa dekorációt, világítást készítsünk. A neopixel ledeket, ledsorokat akár mikrokontrollerrel, akár a Raspberry Pi-vel vezérelhetjük. Ebben az ismertetőben ez utóbbit fogom bemutatni.
A neopixel ledek a helyes működésükhöz nagyon precíz időzítést igényelnek. Tekintettel arra, hogy a Raspberry-n többszálas linux operációs rendszer fut, így az eszköz nem képes valós real-time vezérlést megvalósítani a GPIO tüskéken, így alapból problémás a neopixel ledek vezérlő jelének precíz előállítása.
Ezt a problémát oldja meg az Adafruit CircuitPython NeoPixel library, ami kihasználja a Raspberry PWM és DMA hardveres lehetőségeit. A PWM (pulse width modulation – impulzus szélesség moduláció) modul precíz időzítésű vezérlő jelet képes előállítani, amit a DMA (direct memory access – közvetlen memória elérés) modul vezérel közvetlen eléréssel, a CPU használata nélkül. Így a vezérlőkódok működését nem befolyásolják a Pi oprációs rendszerének egyéb műveletei.
Kábelezés
A neopixel ledek, illetve led-sorok bekötése egyszerű feladat. Az egyetlen dolog, ami esetleg nehézséget okozhat, az a logikai szintillesztés, ami azért lehet szükséges, mert a Pi GPIO kimenet 3,3V-os, a Neopixel ledek vezérléséhez pedig 5V-os jelszint szükséges. Ezt a problémát a legegyszerűbben egy 1N4001-es diódával, vagy egy 74AHCT125-ös szintillesztő csippel oldhatjuk meg.
A javasolt megoldás a szintillesztő áramkör, illetve a Neopixel ledek külső áramforrásról való táplálása.Teszteléshez, kis számú led működtetéséhez használható a Pi saját 5V-os kimenet is.
Javasolt elrendezés
A ledsor meghajtását a GPIO10, 12, 18 illetve 21-es lábakról oldhatjuk meg, az alapértelmezett a GPIO18-as láb (pin 12).
Bekötés szintillesztő dióda alkalmazása esetén
Teszteléshez használható elrendezés
A Neopixel ledek használata
A programozáshoz először telepítenünk kell az Adafruit Blinka library-t ami a Python környezetben biztosítja Circuit Python támogatást, valamint a Neopixel vezérlő könyvtárat:
sudo pip3 install adafruit-blinka
sudo pip3 install rpi_ws281x adafruit-circuitpython-neopixel
(Python 2.x verzió alatta Circuit Python nem támogatott!!)
A Neopixel vezérlő programjainkat célszerű az alábbi sorokkal kezdeni:
import board import neopixel pixels = neopixel.NeoPixel(board.D18, n)
az első két sor importálja a szükséges program könyvtárakat, a harmadik sorban állíthatjuk be a vezérlő kimenet (pin) sorszámát, illetve, hogy hány db. ledből áll a ledsor.
A következő sor kapcsolja be ténylegesen az adott sorszámú ledet adott színnel, illetve fényerővel:
pixels[0] = (255, 0, 0)
A példában az első led világít vörös színnel, maximális fényerővel. A következő parancs:
pixels.fill((0, 255, 0))
a ledsor összes elemét maximális fényerővel működteti, zöld színnel.
A következő egyszerű példa egy 6 elemű Neopixel ledsor elemeit sorra R-G-B-R-G-B színre (vörös-zöld-kék-vörös-zöld-kék) állítja:
import board import neopixel pixels = neopixel.NeoPixel(board.D18, 6) pixels[0] = (10, 0, 0) pixels[1] = (0, 10, 0) pixels[2] = (0, 0, 10) pixels[3] = (10, 0, 0) pixels[4] = (0, 10, 0) pixels[5] = (0, 0, 10)
amennyiben minden rendben volt, a Neopixel ledek 10-es fényerővel világítanak:
A Neopixel vezérlő programok futtatásához un. root jogosultság szükséges! Javasolt megoldás, indítsuk pl. az IDLE programot a terminál ablakból sudo idle paranccsal, majd a felugró ablakban a File > Open parancsokkal nyissuk meg a futtatandó python programot!
Végezetül egy látványos demo-program:
import board import neopixel pixels = neopixel.NeoPixel(board.D18, 6) while True: for i in range (10,50): print (i) pixels[0] = (i,0,0) for i in range (50,10,-1): print (i) pixels[0] = (i,0,0) for i in range (10,50): print (i) pixels[1] = (i,0,0) for i in range (50,10,-1): print (i) pixels[1] = (i,0,0) for i in range (10,50): print (i) pixels[2] = (i,0,0) for i in range (50,10,-1): print (i) pixels[2] = (i,0,0) for i in range (10,50): print (i) pixels[3] = (i,0,0) for i in range (50,10,-1): print (i) pixels[3] = (i,0,0) for i in range (10,50): print (i) pixels[4] = (i,0,0) for i in range (50,10,-1): print (i) pixels[4] = (i,0,0) for i in range (10,50): print (i) pixels[5] = (i,0,0) for i in range (50,10,-1): print (i) pixels[5] = (i,0,0)
A forráskód letölthető:
A cikkben használt Neopixel LED megvásárolható a MálnaPC Webshopjában!