Maak je eigen wifi-ledstrip

Door: Redactie Computer!Totaal Redactie Computer!Totaal | 10 november 2018 07:11

How To

Philips Hue bestaat alweer zes jaar en het bedienen van een lamp met je smartphone is inmiddels doodnormaal. Dat maakt het interessant om er zelf mee aan de slag te gaan. Met een ledstrip, een adapter, een ontwikkelmodule en een handvol onderdelen maak je zelf verlichting die je via wifi op elke gewenste kleur en helderheid kunt instellen.

Boodschappenlijstje

Bijvoorbeeld bij Conrad.nl:

1 NodeMCU-module (€ 9,95)
4 mosfets N-kanaal (IRL 540 of compatibel; € 4,-)
1 elco 2200 uF (€ 0,20)
2 trekontlastingen M10 (€ 2,-)
1 experimenteerprintplaatje 80 x 50 mm (€ 2,50)
1 behuizing 85 x 56 x 39 mm (€ 3,-)
1 schroefterminal / klemschroefblok 8-polig (€ 4,50)
2 meter draad 0,20 mm² (€ 0,60)

Bijvoorbeeld bij Ledstrip-specialist.nl:
1 netadapter 12V, 3A (€ 9,95)
1 snoer voor ledstrip 2 m (€ 3,-)
1 rgbw-ledstrip 12V 2,5 m (€ 34,95)
1 aluminiumprofiel 2,5 m (optioneel) (€ 19,95)

Gereedschap: soldeerbout en soldeertin, zijkniptang, schroevendraaier, boormachine.

Totale kosten: ca. € 75,-
(€ 95,- met aluminiumprofiel)

Heb je liever een alles-in-één-pakket om zelf met slimme verlichting aan de gang te gaan? Dan kun je ook het Arduino-project bekijken.

De NodeMCU-ontwikkelmodule is krachtig genoeg om zowel het aansturen van de verlichting als de interface voor de bediening te verzorgen. Op de module draait een simpele webserver en om met de browser verbinding te kunnen maken, vul je simpelweg het bijbehorende ip-adres in. Heb je je draadloze netwerk zo geconfigureerd dat clients elkaar niet kunnen zien, dan heb je een extra server(tje) in je netwerk nodig. Dat kan een Raspberry Pi zijn, een oude laptop, een nas, een (mini-)pc of een gehoste webserver. Deze optie is vooral interessant als je al een van deze apparaten of een website (over) hebt, anders wordt het al snel begrotelijk. In een dergelijke configuratie fungeert de module als client en heb je andere code nodig. Zie het kader ‘Externe server’ voor de hoofdlijnen. In deze masterclass beperken we ons tot het gebruik van de NodeMCU-ontwikkelmodule als server.

Externe server

Ga je voor de variant met extra server, dan configureer je de NodeMCU-module als webclient die met zo kort mogelijke intervallen de gewenste waarden ophaalt van de server. Dat kan uit een tekstbestandje zijn of uit een database. Voor het schrijven van de waarden van de schuifjes naar het tekstbestand of de database gebruik je een serverscript, bijvoorbeeld in php.

Hoe korter de interval voor het ophalen van de waarden door de client, hoe sneller de respons op een aanpassing. Het hangt van de netwerkconfiguratie af hoe kort die intervallen kunnen zijn, maar langer dan een paar seconden is in de praktijk al snel onwerkbaar traag. Het is een kwestie van gedurende langere tijd goed testen. Hoewel het slechts om kleine hoeveelheden data gaat, zou je hostingaanbieder na verloop van tijd weleens kunnen gaan zeuren over de (eindeloze) hoeveelheid verzoeken vanaf hetzelfde ip-adres. Dat kan een reden zijn om een lokale server in te zetten, waarbij het verkeer binnen je eigen netwerk blijft.

Hardware

De hoeveelheid hardware valt mee, vooral doordat de bediening volledig softwarematig gaat en fysieke knoppen dus achterwege kunnen blijven. Als lichtbron dient een ledstrip, vanwege de lage prijs en zijn (letterlijke) flexibiliteit. Je kunt ‘m overal ophangen en de montage is simpel (zie de laatste paragraaf, ‘Afwerking’). Hoewel met de primaire kleuren rood, groen en blauw in theorie alle zichtbare kleuren te maken zijn, is het aan te bevelen om warm-wit toe te voegen. De kleuren van een rgbww-strip (waarbij de tweede w voor warm-wit staat) ogen over het algemeen natuurlijker dan die van rgb-strips en het licht lijkt op wat we gewend zijn van gloeilampen.

Het hart van de controller is een NodeMCU- ofwel ESP-module, die vier zogenoemde mosfets aanstuurt. Dat zijn transistors met eigenschappen die ze zeer geschikt maken voor gebruik als dimmer. De schakeling bestaat feitelijk uit vier dimmers: één voor rood, groen, blauw en warm-wit. Het grote voordeel van mosfets boven andere soorten transistors is dat er geen extra componenten nodig zijn, zoals weerstanden.

De elco (elektrolytische condensator) dient om storing in de voedingsspanning op te vangen die de schakeling zelf veroorzaakt. Met de schroefterminals sluit je de ledstrip en de netadapter aan op de controller.

Een groot voordeel van mosfets is dat er geen extra componenten nodig zijn.

Werking

Het principe is eenvoudig: je vraagt een webpagina op met als parameters de gewenste waarden voor rood, groen, blauw, wit en helderheid, in de vorm:

http://192.168.1.22/?r=200&g=300&b=100&w=200&h=1023

Die waarden hoef je uiteraard niet in te vullen, dat gaat netjes via een schuifknop binnen een html-formuliertje. De webserver is voortdurend stand-by om verzoeken af te handelen. Zodra je een schuifje verplaatst, worden er nieuwe waarden voor r, g, b, w en h opgevraagd en zet de module die om naar waarden op de digitale uitgangen waarmee via de mosfets de leds worden aangestuurd. Tegelijkertijd worden de formulierwaarden verwerkt op de webpagina, zodat de stand van de schuifjes ook nog klopt na het verversen van de pagina en wanneer de pagina op een andere client wordt opgevraagd.

Ontwikkelomgeving

De ESP-module is het gemakkelijkst te programmeren met de Arduino-ontwikkelomgeving (IDE). Omdat deze IDE niet primair voor deze module is bedoeld, zul je nog wat extra benodigde onderdelen moeten installeren. Klik daarvoor op Bestand / Voorkeuren en voer op het tabblad Instellingen bij Additionele Board Beheer URLs de url http://arduino.esp8266.com/stable/package_esp8266com_index.json in.

Voeg de module daarna toe via Hulpmiddelen / Board / NodeMCU 1.0 (ESP-12E Module). Sluit de module aan via een usb-kabel en selecteer in Arduino IDE de juiste poort (Hulpmiddelen / Poort, kies de com-poort met het hoogste nummer). Als alles goed is gegaan, is je opstelling nu klaar om met programmeren te beginnen. Mocht de module onverhoopt niet door je pc of Mac worden herkend, kijk dan even in deze documenten.

Installeer de module bij Additionele Board Beheer URLs.

Uitleg bij de code

Om met het goede nieuws te beginnen: je hoeft zelf geen code te kloppen, want je kunt het onderstaande programma gewoon downloaden. De code is te lang om hier af te drukken, dus download deze vooral ook als je slechts in de code geïnteresseerd bent. Het enige wat je moet aanpassen is het SSID en WACHTWOORD. Het is zeker aan te raden om ook een vast ip-adres in te stellen, zie het kader ‘Vast ip-adres’. Toch kan het geen kwaad om even te kijken naar de opbouw van het programma.

Dat begint het opnemen van twee bibliotheken, ESP8266WiFi.h en ESP8266WebServer.h, waarvan de naam al aangeeft waarvoor ze dienen. Je hoeft je daardoor niet druk te maken over wifi- en serverprotocollen en kunt je direct bezighouden met functionele zaken.

Bovenaan declareren we variabelen van het type int voor r, g, b, w en h. Hiermee wordt uiteindelijk bepaald hoe fel de leds branden, de waarden liggen tussen 0 en 1023. Direct eronder staan enkele constanten: onveranderlijke waarden waardoor we in het programma bijvoorbeeld de rode led kunnen aanroepen met ‘rood’ in plaats van het weinigzeggende ‘2’.

In het Setup-gedeelte zetten we de seriële monitor aan, wat handig is om later te kunnen zien wat er precies gebeurt in het programma. In de code gebeurt dat met enige regelmaat met Serial.print of Serial.println. We definiëren de led-aansluitingen als uitgangen en geven ze de waarde LOW. In de schakeling staat dat gelijk aan een uitgeschakelde led, op de in de module ingebouwde led na, die juist áán is bij een waarde LOW.

Hierna wordt de wifi-verbinding opgezet en als die tot stand gekomen is, gaat de ingebouwde led uit. Die led dient dus louter als indicatie van een werkende wifi-verbinding (led is dan uit). De server wordt gestart en de functie handleArgs wordt aangeroepen, waarbinnen alle interactie tussen server en client(s) plaatsvindt. Ook worden binnen deze functie de leds aangestuurd.

De code is met slechts enkele aanpassingen te gebruiken.
We raden aan een vast ip-adres in te stellen voor je webserver.

Webpagina

De interface is een webpagina, waarvan de html in de code wordt gezien als String met de willekeurig gekozen naam message. Puur voor de leesbaarheid knippen we hem op in een aantal losse regels, waarbij we statische gegevens zoals metadata en het stylesheet groeperen en veranderlijke gegevens juist uit elkaar trekken. Met het stylesheet kun je de pagina naar smaak veranderen, bijvoorbeeld als je een andere achtergrondkleur wilt. Let bij het aanpassen van de html erop dat je de code intact laat.

De functie handleArgs bestaat uit twee delen, een deel voor als er geen parameters worden opgegeven en een deel voor als die er wel zijn. De eerste keer dat de pagina wordt opgevraagd, zullen er geen parameters zijn en wordt dus het bovenste deel van de functie uitgevoerd. Er wordt een webpagina getoond met vijf schuifknoppen in een formulier. De waarden voor de schuifknoppen liggen tussen de 0 en 1023 en zijn eerder als variabele aangemaakt in de code. De schuif voor rood, groen, blauw en wit staan op 0 en die van helderheid staat op 1023.

Zodra je een van de schuifjes beweegt, wordt de javascript-functie verstuur() uitgevoerd die het formulier myForm verzendt. Let wel, we zitten nu dus niet meer in de module, maar in de webbrowser. Een tweede javascript-functie herlaadt de pagina bij een verandering in de zichtbaarheid, zoals bij het openen ervan in een tabblad. Dat voorkomt dat een browser oude waarden toont, wanneer die inmiddels met een andere browser (zoals op een ander toestel) zijn gewijzigd.

De minimale webinterface in een browser.

Rekenen met paramaters

De waarden die worden verstuurd zijn de parameters r, g, b, w en h. Als de webserver die ziet, wordt het tweede deel van de functie handleArgs uitgevoerd. De waarden van de parameters worden uitgelezen met server.arg. Als eerste worden deze waarden gebruikt om de posities van de schuifjes in te stellen, dat gebeurt met value=. Iets verderop worden de waarden toegekend aan de variabelen binnen het programma. Om er in het programma mee te kunnen rekenen, stellen we met toInt() het type in op gehele getallen. Nu kan het programma ermee werken.

We declareren de variabele helderheid, waarvoor we de waarde van h met toFloat() als breuk instellen, die wordt gedeeld door 1023. Op die manier heeft helderheid een waarde tussen 0 en 1, wat wordt aangegeven met float aan het begin van de regel.

Vervolgens maken we de variabelen roodwaarde, groenwaarde, blauwwaarde en witwaarde aan. Door de waarden van r, g, b en w te vermenigvuldigen met helderheid, maken we van h een soort ‘master’-schuif, zoals op een mengpaneel. Is bijvoorbeeld r ingesteld op 512 en h op 128, dan is roodwaarde 512 x 128 : 1023 = 64. Zet je h op 0, dan is roodwaarde 0 en zet je h op 1023, dan is roodwaarde 512 enzovoort.

Pulsbreedtemodulatie

De uiteindelijke kleurwaarden moeten we nog omzetten naar de mosfets, die op hun beurt de ledstrip schakelen. Hiervoor zijn eerder in het programma al de pinnummers gedefinieerd voor rood, groen, blauw en wit. Voor het aansturen ervan gebruiken we de functie analogWrite. Anders dan de naam suggereert, komt er op de pinnen geen analoog signaal te staan. We zetten hier pulsbreedtemodulatie (PWM, pulse width modulation) in, een techniek om met digitale middelen analoge resultaten te bereiken.

Normaal kunnen we naar een digitale pin alleen LOW en HIGH schrijven. Als we de spanning op de pin snel tussen deze waarden laten overschakelen, kunnen we waarden daartussen simuleren. Staat de pin de helft van de tijd op HIGH, dan branden de leds op de helft van hun maximale helderheid. De tijd dat de pin HIGH is, is de pulsbreedte. Door in de code de pulsbreedte van 0 tot 1023 te laten variëren, stellen we dus de helderheid van de leds in.

Vast ip-adres

Dynamische toewijzing van ip-adressen is weliswaar prettig voor clients, maar bijzonder onhandig voor servers. Als onverhoopt het ip-adres verandert, zoek je je een ongeluk naar de module en zul je in het ergste geval via de seriële monitor het adres moeten achterhalen. Geen gewenste situatie voor onze toepassing, dat is duidelijk. Het is daarom aan te raden een vast ip-adres in te stellen voor je webserver. Daarvoor zul je een ip-adres moeten kiezen dat buiten het dhcp-bereik ligt. Stel de dhcp-server van je router bijvoorbeeld zo in dat de eerste 100 adressen niet automatisch worden uitgedeeld. Pas vervolgens de in de code klaargezette regels aan en kies een vrij ip-adres binnen die eerste 100.

Heb je geen zin in gesleutel aan de dhcp-instellingen? Dat is meestal geen probleem: je kunt in veel routers het ip-adres van de server vastzetten door het te reserveren voor het specifieke mac-adres. Daar kom je snel achter door de server nog één keer als dhcp-client te verbinden.

Code uploaden en testen

Sluit de ESP-module aan met een usb-stekker en pak het zip-bestand dat je hebt gedownload uit naar een willekeurige map op je harde schijf en open de map Couleur_locale. Dubbelklik op het bestand Couleur_locale.ino en wijzig de gegevens bij SSID en WACHTWOORD. In deze fase kun je het ip-adres beter nog aan de dhcp-server overlaten, dus voor nu ben je klaar. Druk op Ctrl+Shift+M om de seriële monitor te openen, waarmee je straks precies kunt zien wat er gebeurt. Stel de snelheid van de seriële monitor in op 115200 baud. Klik op het pijltje naar rechts, bovenaan in de ontwikkelomgeving. De code wordt nu achtereenvolgens gecontroleerd, gecompileerd en geüpload naar de module.

Na het uploaden brandt de ingebouwde led op de module en is via de seriële monitor te lezen dat verbinding wordt gemaakt met het draadloze netwerk. Als alles goed gaat, staat er na enkele seconden dat de wifi verbonden is, welk ip-adres de module heeft en de mededeling Server listening. De ingebouwde led is nu uit. Als je nu het ip-adres invult op een browser binnen hetzelfde netwerk, krijg je de schuifjes te zien zoals is afgebeeld op de afbeelding #linksboven/rechtsonder/etc# op pagina ## (schuifjes.png). Verander je de positie van een van de schuifjes, dan zie je in de seriële monitor de waarden voor helderheid, rood, groen, blauw en wit. Werkt dat? Dan is het softwaregedeelte zo goed als klaar. Dit is het moment om te bepalen of en hoe je het ip-adres wilt vastzetten (ja, dat wil je!). Test of je de webinterface kunt bereiken op het nieuwe adres en als dat werkt, kun je de usb-stekker loskoppelen.

Stel de juiste snelheid in.

Bouwen

De schakeling is vrij compact en omdat er geen knoppen zijn om in te drukken, maakt de plek niet veel uit. Het enige criterium is dat hij binnen het bereik is van het wifi-netwerk. Boor om te beginnen op gelijke afstand van elkaar twee gaten van 10 mm aan een van de korte zijden van de behuizing. Monteer hierin de twee trekontlastingen, één voor de netvoeding en één voor het snoer naar de ledstrip. Boor ook vier gaatjes aan de randen van de printplaat, waar de schroeven van de behuizing doorheen gaan.

De volgende stap is het ‘bestukken’ van de printplaat met de module, de mosfets en de schroefterminal. Omdat het een experimenteerprintplaat is, zul je zelf goed moeten nadenken over de plaatsing van de componenten. Druk van bovenaf telkens een component goed aan, zodat alle pootjes er aan de onderkant uitsteken. Buig dan een aantal pootjes om in tegengestelde richting, zodat het onderdeel aan de printplaat zit vastgeklemd. Knip de pootjes af op een lengte van ongeveer twee millimeter en herhaal deze stappen voor alle componenten.

Tijd om de soldeerbout aan te zetten, zie Computer!Totaal 7-8/2018 voor nuttige tips hierover. Soldeer alle pootjes van de componenten en gebruik stukjes draad waarvan je de uiteinden vertint om de onderlinge verbindingen te maken volgens #onderstaand# schema.

Mosfets

Met de opdruk naar je toe, zijn de linkerpootjes de ‘gate’ van de vier mosfets. Deze worden aangesloten op de module, respectievelijk op D1, D2, D3 en D5. De rechterpootjes zijn de ‘source’, deze worden alle aangesloten op GND, in het schema weergegeven als drie horizontale streepjes. De middelste pootjes zijn de ‘drain’ en daarmee schakelen we de leds. Die worden dan ook verbonden met de schroefterminal, waarin het ledstripsnoer komt. De elco wordt aangesloten tussen VIN en GND, let daarbij goed op de polariteit! Soms staat er een plusje bij een van de pootjes, maar meestal een serie minnen. Voor de volledigheid: plus moet op VIN en min op GND. Verbind ook de schroefterminal met deze pinnen en maak een extra verbinding van de plus-kant van de adapter naar de gemeenschappelijke aansluiting van de ledstrip (die is meestal zwart, of op een andere manier gemarkeerd).

Sluit het ledstripsnoer aan op zowel de controller als de ledstrip. Knip de connector van de netadapter en strip over een lengte van een halve centimeter de twee uiteindes, zodat de koperdraadjes bloot komen te liggen. Vertin deze eventueel en sluit de netadapter op de controller aan, waarbij je ook weer goed op de polariteit moet letten.

Mosfet zoals hij er in het echt uitziet, met aanduidingen voor gate, drain en source.

Het moment van de waarheid

Nadat je alle verbindingen hebt gecontroleerd, steek je de stekker van de adapter in het stopcontact. De ingebouwde led van de module moet meteen gaan branden en na enkele seconden weer uitgaan. De module is nu bereikbaar via z’n ip-adres en bij het veranderen van een van de schuifjes moet de ledstrip gaan branden. Is dit niet het geval, haal dan direct de netadapter uit het stopcontact en zoek de fout.

Je kunt de zelfklevende strip ook ergens achter plakken zodat de leds de muur beschijnen.

Afwerking

De laatste stap is het inbouwen van de printplaat en de ledstrip, al is dat laatste optioneel: je kunt de zelfklevende strip ook ergens achter plakken zodat de leds de muur beschijnen. Haal om te beginnen de draden uit de schroefterminal en voer het ledstripsnoer en het snoer van de netadapter door de trekontlastingen, zodat de uiteinden aan de binnenkant van de behuizing uitkomen. Verbind de draden weer met de schroefterminal en leg de printplaat met de componenten naar beneden in de behuizing. Als de gaten in de printplaat op de goede plek zitten, kun je het deksel op de behuizing schroeven. Met de ledstrips in aluminiumprofielen is je zelfgemaakte Hue helemaal klaar voor gebruik.

Met aluminiumprofielen is de ledstrip in het zicht te plaatsen.

0 Reactie(s) op: Maak je eigen wifi-ledstrip

  • Om te reageren moet je ingelogd zijn. Nog geen account? Registreer je dan en praat mee!
  • Er zijn nog geen reacties op dit artikel.

Wanneer je een reactie plaatst ga je akoord
met onze voorwaarden voor reacties.