Arduino & NeoPixel Optokoppelaars: Efficiënte besturing van meerdere relais
Onderdelen en benodigdheden
| Onderdeel | Aantal |
|---|---|
| NeoPixel LED-strip (WS2812B, 5V, individueel adresmeerbaar) - 10 LED's stuk | 1 |
| Weerstand 27kΩ (voor LDR-serie) | 4 |
| LDR (Light Dependent Resistor / Fotoweerstand) | 4 |
| Relaismodule 5V (4-kanaals of losse relais) | 4 |
| LED-lamp 230V (voor demo) | 1 |
| Arduino UNO (of NodeMCU ESP32, of elk ander Arduino-model) | 1 |
Benodigde tools en machines
- Solfierbout
- Algemeen handgereedschap
Apps en online diensten
- Video-demonstratie
Over dit project
Dit project gaat over het besturen van meerdere relais of andere actuatoren vanaf een enkele Arduino-uitgangspin.
Deze oplossing kan gebruikt worden in typische situaties waar het aantal beschikbare Arduino-uitgangspinnen onvoldoende is en meer actuatoren (zoals relais) parallel vanaf één uitgangspin bestuurd moeten worden.
Het werkingsprinciple is gebaseerd op het gebruik van een LED-strip met NeoPixels (SMD5050 LED's met WS2812B controller chips). Elke pixel wordt samen met een LDR (lichtgevoelige weerstand) geplaatst, wat een DIY-optokoppelaar creëert (zoveel je wilt, beperkt alleen door de lengte van de LED-strip, bv. 300 pixels, en de beschikbare 5V voeding). Op deze manier ontstaat een serieel-naar-parallel conversie (van 1 naar veel).
Elke individuele LED wordt aangestuurd vanaf één en dezelfde Arduino-uitgangspin. Elke LDR (in serie met een 27kΩ weerstand) is aangesloten op een 5V-relais. Op deze manier kunnen veel NeoPixel/LDR-combinaties bestuurd worden vanaf 1 Arduino-uitgangspin met behulp van de Adafruit NeoPixel-bibliotheek. In plaats van relais kunnen ook andere actuatoren aangesloten worden, waarbij de LDR's als invoer voor welk circuit dan ook dienen.
Voor dit project, dat deel uitmaakt van een groter plan, wordt een ESP32 (NodeMCU) gebruikt; een normale Arduino Uno (of bijna elk ander model) doet het echter ook.
Stap 1: De NeoPixel-optokoppelaars maken
De DIY-optokoppelaar wordt gemaakt met:
- Een stuk LED-strip van 10 WS2812 LED's (afgeknipt van een langere strip), er worden er 4 gebruikt
- Een stuk donkergrijze schuim
- Een stripje breadboard
- Zwart ducktaped


Let op: de afstand tussen de stippen komt overeen met de afstand tussen de LED's.
Het is belangrijk om het licht van elke individuele LED van de LDR's van de anderen te scheiden om "licht crosstalk" te voorkomen. In de praktijk bleek dit bijna onmogelijk, daarom is de lichtintensiteit van elke LED in de "aan"-toestand in de software laag ingesteld.

De gebruikte LED-strip is 10 LED's lang, maar er worden alleen 4 pixels in combinatie met 4 LDR's gebruikt (voor de eenvoud).
Stap 2: De elektronische opstelling
In de breadboard-opstelling gebruikte ik een ESP32s (NodeMCU), maar elke Arduino kan het doen.
Het schakelschema (gemaakt met Fritzing):

In de praktijk ziet dit er zo uit:

Zoals je ziet wordt slechts 1 uitgangspin gebruikt om 4 relais parallel te besturen. Dit aantal kan oplopen tot 300! (zoveel LED's als er in een 5m lange strip zitten).
Het ESP32-apparaat werkt op 3,3V-niveaus (on-board 3,3V-spanningsregelaar), terwijl de LED-strip met 5050 LED's op 5V draait. De ESP32 wordt gevoed met 5V (via USB-poort van een 5V-adapter of powerbank). De NeoPixel LED's krijgen de 5V-voeding direct van de 5V-pin van de ESP32 en de gebruikte relais zijn ook 5V-typen.
In dit voorbeeld worden 4 optokoppelaar-circuits gebruikt die 4 relais besturen, elk aangesloten op een 230V-lamp.
De gebruikte uitgangspin is GPIO PIN 21 en de relais worden bestuurd via pixelnummers 1, 2, 3, 4.
Stap 3: De software maken
De loop-functie in de Arduino-sketch is simpel en bestaat uit een aantal "for"-lusjes om verschillende schakelpatronen van de lampen te tonen door elk van de relais aan te sturen.
Om een specifiek relais te besturen wordt de volgende functie aangeroepen vanuit de loop-code:
void ControlRelais(int RelaisNo, bool RelaisState) {
strip.setPixelColor(RelaisNo, RelaisState*15, RelaisState*15, RelaisState*15);
strip.show();
Serial.print(" RelaisNo ");
Serial.print(RelaisNo);
Serial.print(" = ");
Serial.println(RelaisState);
}
Deze functie doet niets anders dan een specifieke LED aan of uit zetten. Een LED-adres correspondeert met het respectievelike relaisnummer. De LED's branden op een laag lichtniveau, net genoeg om het relais via de LDR te triggeren, en zo lichtvervuiling (ook wel "licht crosstalk" genoemd) te vermijden.
Het resultaat van al de moeite en de specifieke sketch wordt getoond in de bijbehorende film.
Code
Sketch voor het besturen van meerdere relais via zelfgemaakte NeoPixel-optokoppelaars
/* Deze code voor het besturen van meerdere relais of andere actuatoren vanaf een enkele Arduino-uitgangspin,
is ontwikkeld en geproduceerd door Pierre Pennings (december 2018).
De oplossing kan gebruikt worden wanneer het aantal beschikbare Arduino-uitgangspinnen onvoldoende is.
Het principe is gebaseerd op een strip met Neopixels (SMD5050 LED's met WS2812B controllers).
Elke pixel wordt gecombineerd met een LDR, wat een DIY-optokoppelaar creëert.
Elke LED wordt aangestuurd vanaf dezelfde Arduino-uitgangspin, de LDR (in serie met 27kΩ) stuurt een 5V-relais.
Op deze manier kunnen veel Neopixel/LDR-combinaties bestuurd worden vanaf 1 pin met de Adafruit Neopixel-bibliotheek.
Voor dit project wordt een ESP32 (NodeMCU) gebruikt, maar een Arduino UNO werkt ook (pin-instellingen aanpassen).
De ESP32 werkt op 3,3V, de LED-strip op 5V. De ESP32 wordt gevoed met 5V via USB.
De Neopixels krijgen 5V van de 5V-pin van de ESP32, de relais zijn 5V-typen.
In dit voorbeeld: LED-strip van 10 LED's, 4 optokoppelaars besturen 4 relais met 230V LED-lampen.
Uitgangspin: GPIO 21, relais via pixel 1,2,3,4.
Licentie: GPL3+ */
#include <Adafruit_NeoPixel.h>
#define NUM_LEDS 10
const int RelaisPin = 21;
int RelaisNo = 0;
bool RelaisState = false;
int r = 0;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, RelaisPin, NEO_RGB + NEO_KHZ800);
void setup() {
Serial.begin(115200);
pinMode(RelaisPin, OUTPUT);
strip.begin();
for (int t = 0; t < 10; t++) {
strip.setPixelColor(t, 15, 15, 15);
strip.show();
delay(500);
strip.setPixelColor(t, 0, 0, 0);
}
}
void loop() {
for (int r = 1; r < 5; r++) {
delay(500);
ControlRelais(r, true);
delay(500);
ControlRelais(r, false);
}
for (int k = 4; k > 0; k--) {
delay(500);
ControlRelais(k, true);
delay(500);
ControlRelais(k, false);
}
for (int r = 1; r < 5; r++) {
for (int k = 4; k > 0; k--) {
delay(500);
ControlRelais(r, true);
ControlRelais(k, true);
delay(500);
ControlRelais(r, false);
ControlRelais(k, false);
}
}
}
void ControlRelais(int RelaisNo, bool RelaisState) {
strip.setPixelColor(RelaisNo, RelaisState*15, RelaisState*15, RelaisState*15);
strip.show();
Serial.print(" RelaisNo ");
Serial.print(RelaisNo);
Serial.print(" = ");
Serial.println(RelaisState);
}
Schema's
Fritzing-bestand (.fzz) voor de opstelling beschikbaar in de projectdocumentatie.
Productieproces
- Sensor-gestuurde Audio-effecten Bouwen met de Satellite CCRMA Kit
- Arduino Nano Flight Simulator 2020 Bedieningspaneel – LCD & CDI Display
- Arduino-gebaseerd schakelaar- & LED-paneel voor Microsoft Flight Simulator 2020
- Interactieve gyroscoop LED-display met NeoPixel-ring en Arduino
- Slimme Jaloezieën: Geautomatiseerd Lichtbeheer met Arduino & Zonne-energie
- Een LED bedienen via Bluetooth met Arduino – Eenvoudige DIY Handleiding
- Een eenvoudige obstakelsensor bouwen met Arduino – IR LED & Fotodiodo Tutorial
- Bestuur Je Roomba Create 2 Met Arduino En Android: Stapsgewijze Handleiding
- Bouw een Slimme Arduino Vierpotige Robot: Stap-voor-Stap Handleiding
- Arduino & MPU6050: Precieze Servomotor Besturing met SG90 & MG996R
- Naadloze LED-dimmer met Bolt IoT en Arduino UNO