NeoPixel (WS2812) LED-strip

Een van de mooiste toepassingen van de led is de RGB LED-strip. Ook de toepassing ervan is groot. Je ziet auto's met een fraai knipperlicht tot kerstversiering met regenboogkleuren. Je koopt de LED-strip al voor een paar euro en dan heb je er ook een afstandsbediening bij. Laten we eens kijken wat je ermee kunt als je de strip op de Raspberry Pi aansluit. 

Als je een RGB LED-strip zoekt, kom je waarschijnlijk de types WS2812 of de WS2801 tegen. Deze twee LED-strips zijn weliswaar verschillend, maar beide kunnen gebruik maken van deze tutorial. De WS2801 heeft wat voordelen. Hier kom ik later op terug. Deze tutorial gaat met name over de WS2812B LED-strip en de aansturing ervoor.

De IP-beoordeling (vochtbestendigheid)
Als de LED-strip in projecten wordt toegepast die binnenshuis opgesteld worden, dan voldoet de IP30 (zonder siliconen laag) uitvoering. Wordt de strip in een dampende omgeving opgesteld, dan zal je de IP65 uitvoering moeten nemen. Is de kans groot dat de strip nat wordt (druppels), dan moet je de waterbestendige versie IP67 (siliconen coating) nemen.

De voeding
Als de LED-strip zo’n 20-30 LED’s heeft, is er geen externe voeding vereist. Als de strip meer LED’s heeft, is het vermogen van de Raspberry Pi niet voldoende en heb je een externe voeding nodig.
Voor de wat ervaren hobbyist adviseer ik voor LED verlichting altijd een ‘stevige’ geschakelde voeding te nemen van 5V. Afhankelijk van het aantal LED’s zal de voeding een minimaal vermogen moeten leveren. Dit is voor een striplengte van 50 cm anders als voor 5 meter. Hieronder leg ik dit uit.

Bepalen van het benodigde vermogen van de voeding
Het benodigde vermogen van de voeding is afhankelijk van het aantal gebruikte LED’s. Volgens het gegevensblad van de LED-strip heeft één LED onder volledige belasting (= maximale helderheid) ongeveer 60 mA (R=20mA, G=20mA, B=20mA) nodig.

Bij 30 LED’s/meter is dit: 30 x 60mA (0,06 A) = 1,8 A/meter.

Deze waarde is natuurlijk hetzelfde bij 50cm en 30 LED’s. Het gaat dus niet om de lengte van de strip, maar om het aantal LED’s dat je wilt besturen. Om de LED’s allemaal te kunnen aansturing zal je in de meeste Python scripts het aantal LED’s moeten aangeven.

De LED-strip is in verschillende versies te krijgen. Het verschil zit o.a. in de LED-dichtheid. Te weten 30, 60, 70, 96, 100 of 144 LED’s per meter.

Prijzenindicatie led-strips per 29-9-2019

Theorie vs. praktijk
Bovenstaande is de theorie. In praktijk blijkt dat de maximale stroomwaarde echter een stuk lager ligt. Als voorbeeld hebben we een LED-strip met 10 LEDs – type B die bij maximale oplichting 526 mA consumeren. Dit is zo’n 52,6 mA per LED. LED – type A blijkt bij meting slechts 33,5 mA te verbruiken, bijna de helft van de theoretische waarde. Het heeft dus zin om te kijken naar LED’s die minder verbruiken en het verbruik ervan te meten.

Verbruik wanneer LED “Uit” is
In rust gebruiken typen A en B zo’n 1 mA. Deze wordt door de controllerchip gebruikt als de LED “uit” is.

Verschil NeoPixel WS2812B / WS2811 vs. WS2801
De WS2801 is uitgerust met twee datalijnen. Met slechts één datalijn moet de frequentie hoger zijn om dezelfde hoeveelheid data te dragen.

WS2801
WS2812
WS2811

Het voordeel van de WS2801 t.o.v. de WS2812B en WS2811
• Twee datalijnen vereist minder berekeningen van de Raspberry.
• Hierdoor kan een hogere frequentie worden bereikt.
• De helderheid van de WS2801 is hoger.
• Het is ook mogelijk om de WS2801 te besturen EN muziek af te spelen, wat niet mogelijk is met de WS2812 (meer hierover hieronder).

Gelijktijdig geluid en de LED strip aansturen
Helaas is het niet mogelijk om gelijktijdig muziek te spelen via de ingebouwde Raspberry Pi-geluidskaart en de strip te bedienen. Dit komt omdat de Raspberry Pi geen realtime-systeem is zoals de Arduino of ESP8266. Voor de geluidsweergave wordt PWM (= GPIO18) gebruikt, wat ook nodig is om de WS2812 op de Raspberry Pi te besturen. Beide tegelijkertijd gebruiken is niet mogelijk, daarom kan iemand die op de geluidsweergave vertrouwt het beste de WS2801 nemen.

Verschillen tussen LED-chips (SMD’s)
LED-strips kunnen worden vervaardigd met behulp van verschillende soorten LED-chips. Hieronder leg ik de belangrijkste verschillen uit tussen de meest gebruikte chiptypen op de markt door de volgende LED-strips te vergelijken: de 3528 en de 5050.

3528 SMD LED chip
5050 SMD LED chip

LED-chips (ook wel opbouwdiodes of SMD’s genoemd) worden allemaal geïdentificeerd door een viercijferig nummer. Deze code is minder gecompliceerd dan hij lijkt – hij geeft simpelweg de grootte van de LED-chip aan. De afmetingen van de SMD’s op de 5050 LED-strips zijn 5,0 mm x 5,0 mm.

LED’s zoals de 3528, 5050, 2835 en 5630 zijn geen verschillende soorten chips, het zijn slechts verschillende formaten. Elke LED heeft zijn eigen specificaties zoals de verschillende stroomvereisten en helderheid. Bij een project is het dus goed om hiernaar te kijken. Niet alleen de prijs, maar ook de inrichting van je project kan door het gebruik van verschillende LEDs behoorlijk verschillen.

Met afmetingen van 3,5 mm x 2,8 mm heeft de 3528 een kleinere chip dan de 5050 LED-strip. Meestal vind je 3528 chips op 12 volt led-strips die 4,8 watt vragen (ook wel 4,8W p/m of 5W p/m led-tape genoemd) bij 60 SMD LEDs per meter.

Als striplampen produceren ze ongeveer 330-360 lumen per meter, afhankelijk van de kleur (equivalent aan een halogeenlamp van 40 W).

Double-power 3528 SMD uitgelegd
3528 LEDs met dubbel vermogen hebben dezelfde afmetingen als de standaard LEDs. Ze zijn verkrijgbaar in dezelfde kleuren, maar verbruiken twee keer zoveel stroom en hebben twee keer zoveel output.

LED-striplampen die zijn vervaardigd met behulp van dubbele SMD LEDs hebben 120 LED’s per meter en trekken 19,2 watt per meter (19,2W p/m). Double-power 3528 LED-strips zijn ontworpen om de warmte goed af te voeren en zijn alleen verkrijgbaar voor 24 volt systemen, waardoor er minder stroom (A) nodig is. De lichtopbrengst is ongeveer 1320-1440 lumen per meter (afhankelijk van de kleur). Vanwege de hoge helderheid wordt deze led-strip aangeraden als algemene verlichting, of ter vervanging van TL-buizen en halogeenlampen.

Per 2m een voeding aanbieden
Omdat de LED’s via de strip serieel gevoed worden zal, indien de voeding alleen aan het begin aangesloten wordt, aan het begin van de strip de grootste stroom door de stripbedrading stromen. Naarmate je aan het eind van de strip bent, is de stroomverbruik in de strip lager. De geprinte koperbanen kunnen een maximale stroom doorgeven voordat ze te heet worden en verbranden. Daarom adviseert de leverancier per 2 meter de voedingsspanning aan te bieden.

Omdat de strip eenvoudig door te knippen is, kun je op het snijvlak de voeding eenvoudig de voeding monteren door deze op de contacten te solderen. Je kunt meerdere voedingen nemen, maar ook een grote hoofdvoeding die je naar de snijpunten brengt. De datalijn wordt eenvoudig doorgelust.

De aansluiting van de LED-strip
De connectoren die aan beide zijden van een LED-strip verbonden is kent de volgende aansluitingen:
Wit = Ground
Groen = Data – GPIO 18 (pin 12)
Rood = 5V

In- of extern voeden
Hieronder zie je hoe de LED-strip met de Raspberry Pi verbonden wordt bij meer en minder dan 30 LED’s. Wil je helemaal geen risico lopen dat de Raspberry Pi beschadigd raakt, kun je een externe voeding voor de LED-strip gebruiken zoals hieronder aangegeven is.

LED-strip gevoed door Raspberry Pi (max 30 LEDs)
LED-strip gevoed door externe voeding (meer dan 30 LEDs per stripdeel)

Voorbereiding en installatie
Voordat we de Raspberry Pi-bibliotheek voor de WS2812-LED’s installeren, moeten enkele voorbereidingen worden getroffen:

  1. De Raspberry Pi bijwerken:
    sudo apt-get update
  2. We installeren de vereiste pakketten:
    sudo apt-get install gcc make build-essential python-dev git scons swig
  3. De audio-uitgang moet worden gedeactiveerd. Hiervoor bewerken we het bestand:
    sudo nano /etc/modprobe.d/snd-blacklist.conf
    Hier voegen we de volgende regel toe:
    blacklist snd_bcm2835
    Vervolgens wordt het bestand opgeslagen door op CTRL + O te drukken en CTRL + X sluit de editor.
  4. We moeten ook het configuratiebestand bewerken:
    sudo nano /boot/config.txt
    Hierin staat de volgende inhoud (met Ctrl + W kun je zoeken):
    #Enable audio (loads snd_bcm2835)
    dtparam=audio=on

    Markeer de onderste regel met een hashtag # aan het begin van de regel: #dtparam=audio=on
  5. We herstarten het systeem
    sudo reboot

Bibliotheek downloaden en installeren.
Jeremy Garff heeft de handige bibliotheek “rpi_ws281x” geschreven. Hier maken we gebruik van. Geef de volgende downloadopdracht:

git clone https://github.com/jgarff/rpi_ws281x

In deze map zijn enkele C-bestanden opgenomen, die eenvoudig kunnen worden gecompileerd. De voorbeeldcode hiervoor is makkelijk te begrijpen. Om ze in Python te gebruiken, moeten we ze compileren:
cd rpi_ws281x
sudo scons

In dit project zijn we vooral geïnteresseerd in de Python-variant en schakelen we daarom over naar de Python-map:
cd python
Hier voeren we de installatie uit:
sudo python setup.py build
sudo python setup.py install

Hiermee kunnen we in de volgende stap een eerste test uitvoeren.

Test de Raspberry Pi WS2812 RGB LED-strip
In de voorbeeldmap staan enkele voorbeeldbestanden waarmee de LED-strips kunnen worden getest. Bovendien kunnen zelfs twee WS2801 LED-strips onafhankelijk worden bestuurd door Raspberry Pi (multistrandtest.py).

We zijn in eerste instantie geïnteresseerd in de eenvoudige versie. Hiervoor moeten we enkele details invullen vóór de test en daarom bewerken we het voorbeeldbestand.

sudo nano examples/strandtest.py

De meeste scripts vragen om te vermelden wat de LED_COUNT (aantal te adresseren LED’s) en de LED_PIN (18 us) is. Zodra deze waarden goed staan kan het bestand worden uitgevoerd (het is belangrijk om het pad naar de gecompileerde bestanden door te geven):

sudo python3 strandtest.py

Als dat niet werkt, gebruik dan: sudo python strandtest.py

De LED’s van de WS2812-strip moeten oplichten. In de bovenste code zijn slechts enkele effecten (regenboog, enz.) gedefinieerd, maar het is ook mogelijk om op analoge wijze verdere effecten te creëren.

Gebruik het “-c” argument om de LED’s te schonen bij exit. Het commando wordt dan:

sudo python strandtest.py -c

Gebruik vervolgens Ctrl-c om het programma te stoppen.
In de map Examples staan meer voorbeelden.

Veel succes!