In de Raspberry Pi en Arduino wereld is het aansturen van leds zeer populair. De leds worden vaak als NeoPixel verkocht. Een NeoPixel bestaat uit een aantal adresseerbare WS2812 5050 RGB leds die worden verkocht als strip, ring of matrix. Iedere led kan individueel worden aangestuurd en van een RGB kleur worden voorzien.
De aansturing van de leds in de WS281x serie kan op een Raspberry Pi met behulp van pyhton en speciale hiervoor geschreven Adafruit library.
Componenten voor dit project
• NeoPixel Ring 12x led ws2812 (link)
• Dupont verbindingkabels male/female (link)
Raspberry Pi Zero, Raspberry Pi 2, Raspberry Pi 3
Raspbian Jessie (2016-11-25 kernel 4.4)
NeoPixel aansluitschema
NeoPixel | RPI functie | RPI pin |
---|---|---|
PWR | VCC 3.3V | 1 |
GND | GND | 6 |
IN | GPIO #18 | 12 |
Hoewel er op de NeoPixel wordt 5V wordt aangegeven volstaat 3.3v voor een 12 led versie.
Python library installeren
Om te kunnen communiceren met de NeoPixel hebben we een speciale Python library van Adafruit nodig, deze kun je installeren met behulp van de onderstaande stappen:
sudo apt-get install build-essential python-dev git scons swig
Hierna installeren we ws281x ondersteuning:
git clone https://github.com/jgarff/rpi_ws281x.git
cd rpi_ws281x
Compileer de library:
scons
De library toevoegen aan Python:
cd python && sudo python setup.py install
In de library is een test script aanwezig om de werking van de leds te testen, die vind je terug in de rpi_ws281x map en kun je starten met behulp van het commando:
cd ~/rpi_ws281x && sudo ./test
De leds gaan nu in een willekeurige kleur onafhankelijk van elkaar knipperen, zie foto bovenaan deze pagina.
Python Script
Vanuit Python is het nu mogelijk om de leds individueel aan te sturen. Het onderstaande script genereert een lopende led, beginnend bij de eerste tot de laatste led, waarna de richt wordt omgekeerd. Na vijf maal wordt het script automatisch beëindigd.
# Demoscript NeoPixel Ring (12 led) | |
# https://raspberrytips.nl | |
import time | |
from neopixel import * | |
from random import randint | |
LEDS = 12 # Aantel LEDS | |
PIN = 18 # GPIO 18 / PIN 12 | |
BRIGHTNESS = 55 # min 0 / max 255 | |
KLEUR_R = randint(0,255) | |
KLEUR_G = randint(0,255) | |
KLEUR_B = randint(0,255) | |
def loopLed(ring, color, wait_ms): | |
for i in range(ring.numPixels()): | |
ring.setPixelColor(i,color) | |
ring.show() | |
time.sleep(wait_ms/1000.0) | |
ring.setPixelColor(i,0) | |
ring.setPixelColor(i-1,0) | |
for i in range(ring.numPixels()-1,-1,-1): | |
ring.setPixelColor(i,color) | |
ring.show() | |
time.sleep(wait_ms/1000.0) | |
ring.setPixelColor(i,0) | |
ring.setPixelColor(i+1,0) | |
def resetLeds(ring, color, wait_ms=10): | |
for i in range(ring.numPixels()): | |
ring.setPixelColor(i, color) | |
ring.show() | |
if __name__ == '__main__': | |
ring = Adafruit_NeoPixel(LEDS, PIN, 800000, 5, False, BRIGHTNESS) | |
ring.begin() | |
for t in range (0, 5, 1): | |
loopLed (ring,Color(KLEUR_G, KLEUR_R, KLEUR_B),100) | |
resetLeds (ring,Color(0,0,0)) |
Plaats het bovenstaande script op je Raspberry Pi met behulp van een editor, of download deze naar je Raspberry Pi met het commando:
wget https://raspberrytips.nl/neopixelring.py
Start het Python script met:
sudo python neopixelring.py
Na het starten van het script zal de laser in een oneindige loop 1 seconde aan/uit gaan.
Aanpassingen script
• LEDS
pas deze parameter aan met het aantal leds dat je gaat gebruiken.
• KLEUR_R, G ,B
automatisch wordt een willekeurige gekozen, je kunt deze ook zelf selecteren door de juiste worden op te geven. Bijvoorbeeld voor rood:
KLEUR_R 255, KLEUR_G 0, KLEUR_B 0
.
Hallo, allereerst bedankt voor het artikel, in ieder geval al zeer nuttig voor mij. Kan ik ook deze LEDs gebruiken voor eenzelfde effect: https://www.kiwi-electronics.nl/ws2812b-5050-rgb-led-met-geintegreerde-driver-chip-10-pack?search=rgb
Wonder full !
It’s also work on 24led strip (without any power supply).
Can you please advise how to edit the original test script, there is no extension to the file?
Update: nu kun je de library installeren met “pip install rpi-ws281x”. Er wordt geadviseerd om dit in een “virtual environment” te doen. De regel “from neopixel import *” moet “from rpi_ws281x import *” worden.