WS2812B LED-besturing met Arduino onder de knie – Stapsgewijze handleiding
In deze tutorial leren we hoe we individueel adresseerbare RGB LED's of een WS2812B LED-strip besturen met Arduino. Je kunt de volgende video bekijken of de geschreven tutorial hieronder lezen voor meer details.
Overzicht
Eerst zullen we het werkingsprincipe uitleggen door middel van enkele basisvoorbeelden en daarna kijken we naar een echt cool Arduino-project met deze LED's: een DIY interactieve LED koffietafel. De koffietafel heeft WS2812B LED's, infrarood nabijheidssensoren voor het detecteren van objecten en een HC-05 Bluetooth-module voor het besturen van de kleuren via een zelfgebouwde Android-app. Dit project is eigenlijk een samenwerking tussen mij en Marija van het Creativity Hero YouTube-kanaal.
Hoe WS2812B LED's werken
Laten we beginnen met een nader bekijken van de LED-strip. Deze bestaat uit type 5050 RGB LED's waarin de zeer compacte WS2812B LED-driver IC geïntegreerd is.
Afhankelijk van de intensiteit van de drie individuele rode, groene en blauwe LED's kunnen we elke gewenste kleur simuleren.
Wat geweldig is aan deze LED's is dat we zelfs de hele LED-strip met slechts één pin van ons Arduino-board kunnen besturen. Elke LED heeft drie connectoren aan elke kant, twee voor de voeding en één voor de data. De pijl geeft de data-stroomrichting aan. De data-uitgang van de vorige LED is verbonden met de data-ingang van de volgende LED. We kunnen de strip op elke gewenste lengte knippen, alsook de LED's met enkele draden van elkaar afstanden.
Wat de voeding betreft: ze werken op 5V en elke rode, groene en blauwe LED trekt ongeveer 20mA, dus in totaal 60mA per LED bij volle helderheid. Let op: wanneer de Arduino via USB gevoed wordt, kan de 5V-pin slechts ongeveer 400 mA aan, en bij voeding via de barrel-connector kan de 5V-pin ongeveer 900 mA aan.
Als je meer LED's gebruikt en de stroom die ze trekken de bovengrens overschrijdt, moet je een aparte 5V-voeding gebruiken. In dat geval moet je ook de twee grondlijnen met elkaar verbinden. Daarnaast wordt aanbevolen om een weerstand van ongeveer 330 Ohm tussen de Arduino en de data-pin van de LED-strip te plaatsen om de ruis op die lijn te verminderen, alsook een condensator van ongeveer 100µF over de 5V en Ground om de voeding te gladden.
Arduino en WS2812B LED's Voorbeelden
Voorbeeld 1
Als voorbeeld gebruik ik een strip van 20 LED's, aangesloten op de Arduino via een 330 Ohm weerstand en gevoed met een aparte 5V-voeding, net zoals hierboven uitgelegd. Voor het programmeren van de Arduino gebruiken we de FastLED-bibliotheek. Dit is een uitstekende en goed gedocumenteerde bibliotheek die eenvoudige controle van de WS2812B LED's mogelijk maakt.
Je kunt de benodigde componenten voor dit voorbeeld via de onderstaande links verkrijgen:
- WS2812B LED-strip
- Arduino-board
- 5V 6A DC-voeding
Hier is de Arduino-broncode voor het eerste voorbeeld:
#include <FastLED.h>
#define LED_PIN 7
#define NUM_LEDS 20
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}
void loop() {
leds[0] = CRGB(255, 0, 0);
FastLED.show();
delay(500);
leds[1] = CRGB(0, 255, 0);
FastLED.show();
delay(500);
leds[2] = CRGB(0, 0, 255);
FastLED.show();
delay(500);
leds[5] = CRGB(150, 0, 255);
FastLED.show();
delay(500);
leds[9] = CRGB(255, 200, 20);
FastLED.show();
delay(500);
leds[14] = CRGB(85, 60, 180);
FastLED.show();
delay(500);
leds[19] = CRGB(50, 255, 20);
FastLED.show();
delay(500);
}
Beschrijving: Eerst moeten we de FastLED-bibliotheek includeren, de pin definiëren waaraan de data van de LED-strip is aangesloten, het aantal LED's definiëren, alsook een array van type CRGB definiëren. Dit type bevat de LED's, met drie eentjes-byte dataleden voor elk van de drie rode, groene en blauwe kleurkanalen.
In de setup-sectie hoeven we alleen de FastLED te initialiseren met de parameters die we hierboven gedefinieerd hebben. Nu in de hoofdlus kunnen we onze LED's op elke gewenste manier besturen. Met de CRGB-functie kunnen we elke LED elke kleur geven met drie parameters voor rood, groen en blauw. Om de wijziging op de LED's zichtbaar te maken, moeten we de functie FastLED.show() aanroepen.
Voorbeeld 2
Met enkele "for"-lussen kunnen we eenvoudig animaties maken.
Hier is de Arduino-broncode voor het tweede voorbeeld:
#include <FastLED.h>
#define LED_PIN 7
#define NUM_LEDS 20
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
}
void loop() {
for (int i = 0; i <= 19; i++) {
leds[i] = CRGB(0, 0, 255);
FastLED.show();
delay(40);
}
for (int i = 19; i >= 0; i--) {
leds[i] = CRGB(255, 0, 0);
FastLED.show();
delay(40);
}
}
De eerste "for"-lus laat alle 20 LED's in het blauw oplichten, van de eerste tot de laatste LED met 40 milliseconden vertraging. De volgende "for"-lus laat weer alle 20 LED's oplichten, maar nu in rood en in omgekeerde volgorde, van de laatste naar de eerste LED.
De FastLED-bibliotheek bevat nog veel meer functies die gebruikt kunnen worden voor het maken van echt interessante animaties en lightshows, dus het is alleen aan je verbeelding om je volgende LED-project te laten schitteren.
Interactieve LED-koffietafel met de WS2812B LED's
Nu laten we eens kijken naar het DIY interactieve LED-koffietafel-project dat ik aan het begin noemde. Dit was een samenwerkingsproject tussen mij en Marija van Creativity Hero.
Je kunt haar website-artikel bekijken waar ze het hele proces van het maken van de tafel uitlegt, beginnend met het zagen en monteren van de houten constructie, tot het solderen en verbinden van alle elektronische onderdelen. Hier zal ik uitleggen hoe de elektronica werkt, hoe je de custom Android-applicatie bouwt en de Arduino programmeert.
Hier is het complete schakelschema van dit project.
De tafel bestaat uit 40 adresseerbare LED's, 45 infrarood nabijheidssensoren en een HC-05 Bluetooth-module, allemaal aangesloten op een Arduino Mega-board. Het circuit wordt gevoed met een 5V 6A voeding.
Je kunt de benodigde componenten voor dit voorbeeld via de onderstaande links verkrijgen:
- WS2812B LED-strip
- IR Nabijheidssensor
- HC-05 Bluetooth-module
- Arduino-board
- 5V 6A DC-voeding
Gerelateerd: Hoe een RGB LED met Arduino te gebruiken | Tutorial
Broncodes
Hier is de Arduino-code voor dit project en als we de Bluetooth-kleurenbesturing weglaten, merken we dat de code eigenlijk heel simpel is.
#include "FastLED.h"
#define NUM_LEDS 45
#define LED_PIN 2
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<WS2812, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(brightness);
// Stel de 45 nabijheidssensor-pinnen in als inputs, van digitale pin 3 tot pin 48
for (int pinNo = 0 + 3; pinNo <= 45 + 3; pinNo++) {
pinMode(pinNo, INPUT);
}
}
void loop() {
for (int pinNo = 0; pinNo <= NUM_LEDS-1; pinNo++) {
leds[pinNo] = CRGB(0, 255, 0); // Zet alle 45 LED's op groen
// Als een object gedetecteerd wordt boven de specifieke sensor, zet de specifieke LED aan
if (digitalRead(pinNo + 3) == LOW) {
leds[pinNo] = CRGB(0, 0, 255); // Zet de reactieve LED op blauw
}
}
FastLED.show(); // Update de LED's
delay(20);
}
Beschrijving: Eerst definiëren we de basisparameters zoals eerder uitgelegd en stellen we de 45 nabijheidssensor-pinnen in als inputs.
In de hoofdlus gebruiken we een enkele "for"-lus om alle LED's een bepaalde kleur te geven, en controleren we of de nabijheidssensor een object heeft gedetecteerd. Als dat zo is, of een LOW logische toestand in dit geval, wordt de specifieke reactieve kleur ingesteld voor de specifieke LED. Aan het einde updaten we de LED-kleuren met de FastLED.show()-functie.
Om de Bluetooth-kleurenbesturing te includeren, moeten we nog wat regels code toevoegen alsook de Android-app maken. Ik heb al losse tutorials over hoe de HC-05 Bluetooth-module met Arduino te gebruiken en hoe je je eigen Android-applicatie maakt met de MIT App Inventor online applicatie, dus je kunt die altijd raadplegen voor meer details.
Hier is hoe de Android-app werkt. Het bestaat uit een kleurenpalet-afbeelding waaruit we kleuren kunnen kiezen, twee vinkjesknoppen waaruit we kunnen selecteren of de gekozen kleur toegepast wordt op de reactieve of de achtergrond-LED's en een schuifregelaar voor het aanpassen van de helderheid.
Als we kijken naar de blokken van de app, zien we wat er gebeurt wanneer we het canvas aanraken waar de kleurenpalet-afbeelding staat. Met de .GetPixelColor-blokken halen we de rode, groene en blauwe waarden op voor de gekozen kleur en sturen we deze informatie via de Bluetooth SendText-blok naar de Arduino in tekstvorm.
Afhankelijk van de geselecteerde checkbox sturen we een ander eerste teken of marker, wat helpt bij het ontvangen van de tekst op de Arduino. Hetzelfde gebeurt wanneer we de positie van de schuifregelaar veranderen, een waarde van 10 tot 100 wordt naar de Arduino gestuurd in tekstvorm, met de marker "3" ervoor.
Je kunt de Android-app hieronder downloaden, alsook het MIT App Inventor-projectbestand:
DIY_Reactive_LED_Table_Control (APK-bestand)
DIY_Reactive_LED_Table_Control MIT App Inventor Projectbestand
Hier is de Arduino-code:
#include <SoftwareSerial.h>
#include "FastLED.h"
#define NUM_LEDS 45
#define LED_PIN 2
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];
SoftwareSerial Bluetooth(53, 52); // Arduino(RX, TX) - Bluetooth (TX, RX)
// Initiële achtergrondkleur
int backR = 100;
int backG = 50;
int backB = 10;
// Initiële reactieve kleur
int reactiveR = 10;
int reactiveG = 50;
int reactiveB = 100;
int brightness = 50; // Initiële helderheid
String dataIn = "";
void setup() {
FastLED.addLeds<WS2812, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
FastLED.setBrightness(brightness);
Serial.begin(38400);
Bluetooth.begin(38400); // Standaard baudrate van de Bluetooth-module
for (int pinNo = 0 + 3; pinNo <= 45 + 3; pinNo++) {
pinMode(pinNo, INPUT);
}
}
void loop() {
if (Bluetooth.available() > 0) {
dataIn = Bluetooth.readString();
delay(20);
if (dataIn.startsWith("1")) {
delay(10);
String stringR = dataIn.substring(dataIn.indexOf("R") + 1, dataIn.indexOf("G"));
reactiveR = stringR.toInt();
String stringG = dataIn.substring(dataIn.indexOf("G") + 1, dataIn.indexOf("B"));
reactiveG = stringG.toInt();
String stringB = dataIn.substring(dataIn.indexOf("B") + 1, dataIn.indexOf("E"));
reactiveB = stringB.toInt();
} else if (dataIn.startsWith("2")) {
String stringR = dataIn.substring(dataIn.indexOf("R") + 1, dataIn.indexOf("G"));
backR = stringR.toInt();
String stringG = dataIn.substring(dataIn.indexOf("G") + 1, dataIn.indexOf("B"));
backG = stringG.toInt();
String stringB = dataIn.substring(dataIn.indexOf("B") + 1, dataIn.indexOf("E"));
backB = stringB.toInt();
} else if (dataIn.startsWith("3")) {
String stringBrightness = dataIn.substring(dataIn.indexOf("3") + 1, dataIn.length());
brightness = stringBrightness.toInt();
FastLED.setBrightness(brightness);
}
}
for (int pinNo = 0; pinNo <= NUM_LEDS-1; pinNo++) {
leds[pinNo] = CRGB(backR, backG, backB);
if (digitalRead(pinNo + 3) == LOW) {
leds[pinNo] = CRGB(reactiveR, reactiveG, reactiveB);
}
}
FastLED.show();
delay(20);
}
Beschrijving: Eerst moeten we de seriële communicatie tussen de Arduino en de HC-05 Bluetooth-module definiëren, oftewel de pinnen waaraan de module is aangesloten. In de setup-sectie moeten we de baudrate instellen waarop deze module werkt. Vervolgens in de hoofdlus controleren we met de Bluetooth.available()-functie of er binnenkomende data is van de smartphone. Als dat zo is, ontvangen we de data als string met de Bluetooth.readString()-functie. Vervolgens controleren we met de .startsWith()-functie het eerste teken of de marker en weten we zo of we de reactieve kleur, de achtergrond of de helderheid willen wijzigen.
Met de .substring()-functie halen we de rode, groene en blauwe waarden uit de ontvangen tekst en converteren ze naar integers. Deze waarden worden vervolgens gebruikt in de "for"-lus hieronder die de kleur instelt en de LED's laat oplichten zoals eerder uitgelegd. Op dezelfde passen we de helderheid van de LED's aan.
Dat is alles voor deze tutorial. Voel je vrij om vragen te stellen in de reacties hieronder.
Productieproces
- Bouw een Universele IR-remote met Arduino: Stap-voor-stap Handleiding
- Universele Android-afstandsbediening bouwen met Arduino, 1Sheeld en IR-besturing
- Arduino Power Control Center: N-FET, P-FET, Relais & RTC Kit
- Externe IoT-besturing van een zelfgebouwde robotarm
- Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
- Bestuur een Arduino-rover naadloos met Firmata en een Xbox One-controller
- De massa van de aarde meten met Arduino: een stapsgewijze DIY-gids
- Bouw een Slimme Arduino Vierpotige Robot: Stap-voor-Stap Handleiding
- Naadloze LED-dimmer met Bolt IoT en Arduino UNO
- Je TV bedienen met Alexa via Arduino IoT Cloud – stapsgewijze handleiding
- Bouw een Real-time Digitale Kompas met Arduino & Processing