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

Alap beköté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

Bekötés szintillesztő diódával

Teszteléshez használható elrendezés

Bekötés teszteléshez

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:

Neopixel LEDek 10-es fényerőn

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!