Met behulp van een Raspberry Pi en een WS2801 RGB ledstrip kun je op eenvoudige wijze een goedkoop alternatief voor Philips HUE verlichting in elkaar knutselen. Vandaag gaan we een ledstrip met 32 adresseerbare WS2801 RGB leds aansturen, je kunt deze strips per meter kopen in electronica winkels of op de populaire Chinese webshops. De ledstrip bestaat uit een reeks krachtige SMD5050 leds die zeer helder zijn en een mooie kleur intensiteit hebben.
Gebruikte componenten
• WS2801 Ledstrip 1mtr
• 8x Dupont verbindingskabel (female/female)
Raspberry Pi Zero, Raspberry Pi 2, Raspberry Pi 3
Raspbian Jessie (2016-11-25 kernel 4.4)
Aansluitschema WS2801 ledstrip
Wanneer je een 1 meter ledstrip op je Raspberry Pi gaat aansluiten zorg er dan voor dat je een netvoeding van minimaal 2A gebruikt! Eventueel kun je natuurlijk ook de ledstrip zelf voorzien van een externe voeding, iets wat zeker noodzakelijk is bij langere ledstrips.
Raspberry Pi | WS2801 Ledstrip |
---|---|
5V (PIN #2) | VCC |
SCKL (PIN #23) | CK/CI |
MOSI (PIN #19) | SI/DI |
GND (PIN #6) | GND |
SPI interface activeren
We gaan de SPI interface gebruiken om te communiceren met leds in de ledstrip, hiervoor moet de SPI interface op de Raspberry Pi geactiveerd worden. Met behulp van het onderstaande commando kun je controleren of SPI is geactiveerd:
ls /dev/spi*
Als SPI is geactiveerd verschijnt /dev/spidev0.0 /dev/spidev0.1
verschijnt dit niet activeer dan SPI als volgt:
sudo raspi-config
Selecteer de menu optie ‘Advanced Options’ ▸ SPI ▸ YES en druk op Enter. Er zal nu een melding verschijnen dat de SPI interface is geactiveerd.
Benodigde Python libraries installeren
Om te kunnen communiceren met de WS2801 ledstrip maken we gebruik van een speciale library geschreven door Adafruit.
sudo apt-get install python-pip -y sudo pip install adafruit-ws2801
Werking testen
Nadat alles is aangesloten kunnen we gaan testen of de LED strip werkt. Dit kun je doen met het onderstaande testscript:
# https://raspberrytips.nl/ws2801-ledstrip/ | |
# Simple demo script for a WS2801/SPI-like addressable RGB LED lightstrip. | |
import time | |
import RPi.GPIO as GPIO | |
import Adafruit_WS2801 | |
import Adafruit_GPIO.SPI as SPI | |
# Configure the count of pixels: | |
PIXEL_COUNT = 32 | |
# Alternatively specify a hardware SPI connection on /dev/spidev0.0: | |
SPI_PORT = 0 | |
SPI_DEVICE = 0 | |
pixels = Adafruit_WS2801.WS2801Pixels(PIXEL_COUNT, spi=SPI.SpiDev(SPI_PORT, SPI_DEVICE), gpio=GPIO) | |
# Define the wheel function to interpolate between different hues. | |
def wheel(pos): | |
if pos < 85: | |
return Adafruit_WS2801.RGB_to_color(pos * 3, 255 - pos * 3, 0) | |
elif pos < 170: | |
pos -= 85 | |
return Adafruit_WS2801.RGB_to_color(255 - pos * 3, 0, pos * 3) | |
else: | |
pos -= 170 | |
return Adafruit_WS2801.RGB_to_color(0, pos * 3, 255 - pos * 3) | |
def rainbow_cycle(pixels, wait=0.005): | |
for j in range(256): # one cycle of all 256 colors in the wheel | |
for i in range(pixels.count()): | |
pixels.set_pixel(i, wheel(((i * 256 // pixels.count()) + j) % 256) ) | |
pixels.show() | |
if wait > 0: | |
time.sleep(wait) | |
def brightness_decrease(pixels, wait=0.01, step=1): | |
for j in range(int(256 // step)): | |
for i in range(pixels.count()): | |
r, g, b = pixels.get_pixel_rgb(i) | |
r = int(max(0, r - step)) | |
g = int(max(0, g - step)) | |
b = int(max(0, b - step)) | |
pixels.set_pixel(i, Adafruit_WS2801.RGB_to_color( r, g, b )) | |
pixels.show() | |
if wait > 0: | |
time.sleep(wait) | |
if __name__ == "__main__": | |
# Clear all the pixels to turn them off. | |
pixels.clear() | |
pixels.show() # Make sure to call show() after changing any pixels! | |
rainbow_cycle(pixels, wait=0.02) | |
brightness_decrease(pixels) |
Je kunt dit script downloaden met behulp van:
wget https://raspberrytips.nl/ws2801ledstrip.py
Voer hierna het script uit:
python ws2801ledstrip.py
Na het activeren van het script zal de ledstrip oplichten in een regenboog modus, wanneer de cycle is voltooid worden alle leds naar helderheid 0 gezet en uitgeschakeld.
Maak je gebruik van meer of minder leds pas de waarde PIXEL_COUNT
in het pythonscript aan.
Wat zou de oorzaak kunnen zijn van af en toe een flickerende strip?
Hoeveel leds gebruik je? Waarschijnlijk is de voeding niet sterk genoeg.