projects:aansturing_rgbledstrip_helm

Aansturing RGB-LEDstrip helm

Tijdens HackerHotel 2019 hebben enkele deelnemers vanuit TDvenlo deelgenomen aan de workshop “What the Helmet”, waar steampunk helmen gemaakt zijn. Twee van de geknutselde helmen zijn opgeleukt met een door een andere bezoeker aangedragen RGB-LEDstrip, welke niet aan de verwachtingen van deze bezoeker voldeed.

Het plan is om de helmen te dragen op toekomstige hacker(hotel) events en tijdens de vastelaovend in Venlo en Blerick. Bij voorkeur werken de LEDstrips dan en zorgen zij voor een passend lichteffect.

Aangezien het knutselen van de helmen heeft plaatsgevonden tijdens HackerHotel 2019, gaan we hier niet verder op dat project in. De helmen, met erop geplakte LEDstrips, beschouwen we als een vast gegeven. Dit project behelst een onderzoek naar de werking van de op de helmen geplakte LEDstrips en een ontwerp van additionele hard- en software om de LEDstrip te laten functioneren zoals gewenst.

De LEDstrip is niet voorzien van enige identificatie naar een producent of typenummer. Wel zijn er een viertal aansluitingen gemarkeerd als “12V”, “R”, “G” en “B”. Hieruit concluderen we dat we te maken hebben met een Common Anode LEDstrip met een werkspanning van 12 volt. Oftewel, indien er een spanning van +12V aangesloten wordt op de met “12V” gemarkeerde aansluiting, en één van de andere aansluitingen wordt verbonden met 0V, dan zal de gehele strip oplichten in de aangegeven kleur (rood, groen, of blauw).

Door een combinatie van aansluitingen aan 0V te verbinden, kunnen kleuren gemengd worden. Ook is er de mogelijkheid om PWM toe te passen, om op deze manier intensiteit per kleur te veranderen. Hiermee zijn alle kleuren in het spectrum te maken.

Naast de LEDstrip is er een ontwerp nodig dat voorziet in aansturing en voeding van het geheel als wearable.

Centraal zal een microcontroller komen te staan. We kiezen hier voor een ESP8266, omdat deze reeds voorhanden is, gunstig geprijsd is en makkelijk geprogrammeerd kan worden m.b.v. de Arduino-ontwikkelomgeving. We kiezen niet voor de standaard NodeMCU, maar voor een WeMOS D1 mini, vanwege de compactheid van het bordje. Dit bordje vereist een 5V voedingsspanning, die we met een DCDC buck converter afleiden van de batterij.

Vanwege het draagbare karakter is een voeding vanuit batterij(en) of een accu vereist. Initieel wordt vanwege compactheid en voldoende hoog initieel spanningsniveau gekozen voor een 9V-batterij. Een toekomstige upgrade naar een LiPo accu wordt overwogen, daarvoor zal t.z.t. een additioneel laadcircuit vereist zijn.

De 9 volt uitgangsspanning van de batterij wordt met een DC-DC boost converter naar het gewenste niveau van 12 volt voor de LEDstrip gebracht. Gekozen wordt een kant-en-klaar oplossing: MT3608 . Voor de 5 volt voeding van demicrocontroller kiezen we een DC-DC buck converter.

Om met de 3,3 Volt spanning die de microcontroller als uitgangswaarde heeft de 12 Volt LEDstrip aan te sturen wordt voor elk van de drie kleuren een schakeling rond een IRL530 MOSFET opgebouwd. Zie afbeelding.

Testopstelling: https://www.youtube.com/watch?v=F0zGyNejfHw

De ESP8266 microcontroller moet zichzelf als WiFi-accesspoint presenteren, een webpagina met de controls voor de helm serveren en meerdere lichtpatronen aansturen naar de LEDstrip. Deze functies dienen in één single-threaded programma verenigd te worden.

Patronen

Met het oog op gebruik tijdens vastelaovend zijn er een aantal verschillende patronen gewenst. Deze hebben de volgende namen en gedragingen:

  • VENLO - Regelmatig knipperen met afwisselend Blauw en Rood, de kleuren van Jocus
  • BLERICK - Regelmatig knipperen met afwisselend Oranje en Groen, de kleuren van Wortelepin
  • ALAAF - Regelmatig knipperen met afwisselend Rood, Geel en Groen, de kleuren van vastelaovend
  • HYSTERIA - Telkens in een andere kleur knipperen, met wisselende frequentie en wisselend aantal herhalingen.

Programmeren in de Arduino-IDE

De software wordt geprogrammeerd in de Arduino IDE. Deze ontwikkelomgeving biedt naast de standaard Arduino bordjes ook ondersteuning voor NodeMCU, WeMOS D1, ESP32 en nog veel meer bordjes. Hiervoor moet wel de juiste library toegevoegd worden. Zie daarvoor onze pagina over ontwikkelbordjes.

Globale variabelen

In het programma worden enkele globale variabelen gebruikt. Er is één globale variabele als patroon-indicator (opmode). Deze integer heeft een numerieke waarde van 0 tot en met 4. In de loop wordt aan de hand van de waarde van deze variabele beslist welk patroon de LEDstrip weergeeft. Een klik op een knop op de geserveerde website verandert de waarde van deze variabele.

De overige globale variabelen worden gebruikt in het meest gerandomiseerde patroon “HYSTERIA”. Dit zijn de volgende integers:

randomized_delay_time - de random delay tijd in milliseconden, voor de knipperfrequentie
blink_amount - het aantal keren knipperen, voordat kleur en frequentie weer veranderen
colorselector - een integer om een kleur te selecteren
prevValue - wordt in de eigen random functie met ontdubbeling gebruikt

Dertien (eigenlijk 14) functies om diverse kleuren te maken

Verschillende lichtpatronen zullen vaker gebruik maken van dezelfde kleuren. Daarom is het een goed idee om voor deze kleuren aparte functies te schrijven. Aan de hand van een kleurenwiel, definiëren we 12 kleuren. Bovendien voegen we wit toe (alle LEDs op volle sterkte) en een functie om alle LEDs uit te schakelen (geen licht).

De functie voor een kleur ziet er als volgt uit:

void color() {
  analogWrite(ledPinR, 0);
  analogWrite(ledPinG, 0);
  analogWrite(ledPinB, 0);
}

Voor elke kleur wordt “color” aangepast naar de naam van de kleur, en de 0-en achter elke ledPin worden vervangen door de waarde van de intensiteit (getal tussen 0 en 1023; 0 is uit en 1023 is maximale intensiteit).

In HelmWare v1.5 zijn de volgende kleuren gedefinieerd: white, red, orange, yellow, greenyellow, green, greencyan, cyan, bluecyan, blue, bluemagenta, magenta en redmagenta. De 14e functie is “off”, om alle LEDs op intensiteit 0 (uit) te zetten.

De intensiteiten voor R, G en B zijn per kleur/functie als volgt ingevuld:

Kleur/functie Intensiteit R Intensiteit G Intensiteit B
off 0 0 0
white 1023 1023 1023
red 1023 0 0
orange 1023 511 0
yellow 1023 1023 0
greenyellow 511 1023 0
green 0 1023 0
greencyan 0 1023 511
cyan 0 1023 1023
bluecyan 0 511 1023
blue 0 0 1023
bluemagenta 511 0 1023
magenta 1023 0 1023
redmagenta 1023 0 511

Eigen random functie met ontdubbeling

Er is een eigen random functie geïmplementeerd t.b.v. het meest random patroon “HYSTERIA”, dat drie random componenten bevat: kleur, knipperfrequentie en aantal keer knipperen voordat de kleur en frequentie weer veranderen. Omdat er geen twee runs achter elkaar dezelfde kleur mag zijn, en er slechts 14 kleuren beschikbaar zijn, is de standaard random functie geen optie om de kleur te selecteren. Deze geeft een te grote kans op herhaling van dezelfde kleur. Een simpel if-statement waarin de gekozen random kleur uit de standaard random vergeleken wordt met de vorige waarde zou een deadlock kunnen veroorzaken ('vastlopen' vanwege oneindig vaak dezelfde kleur en dus een nieuwe trekking). Er is dus een eigen random functie nodig die zorgt voor een unieke trekking uit 14 integer waarden: int getRandomNoDuplicate(int lower, int upper).

static int offset = 0;
int randNumber = random(lower, upper);
if (prevValue == randNumber)
{
  offset++;
  if (offset >= upper - lower) offset = 1;
  randNumber += offset;
  if (randNumber >= upper) randNumber = lower + randNumber - upper;
}
prevValue = randNumber;
return randNumber;

WiFi Accesspoint

De ESP8266 moet zichzelf als WiFi accesspoint presenteren.

Default IP: 192.168.4.1

SSID en wachtwoord worden gedeclareerd als globale variabelen. Bovenaan in de sketch dus. beiden zijn van het type const char*

const char* ssid = "MPHelm";
const char* password = "********";

Webserver

Webserver.

Main Loop en uitvoering van de patronen

In de hoofdfunctie, oftewel de loop() functie, wordt de aansturing van de LEDstip gerealiseerd. Aan de hand van de waarde van globale variabele 'opmode' wordt het gewenste patroon uitgevoerd. Omdat m.u.v. HYSTERIA alle patronen nogal eencoudig zijn, zijn voor de patronen geen aparte functies geschreven, maar worden ze rechtstreeks in de code van loop() opgenomen. De code voor zo'n patroon ziet er als volgt uit:

if(opmode == 1) {
  Serial.println("Mode of operation = 1");  //opmode 1 = patroon VENLO
  //external output blink RED and BLUE
  red(); //RED
  delay(1000);
  off(); //RED OFF
  blue(); //Full BLUE
  delay(1000);
  off(); //BLUE OFF
}

Op de seriële terminal wordt een regeltje weergegeven welk patroon geselecteerd is. Daarna wordt de LEDstrip aangestuurd met rood, 1000 ms = 1 seconde blijft de rode kleur branden, daarna gaat de LEDstrip uit en meteen wordt de blauwe kleur aangezet. Deze blijft ook weer 1 seconde aan, waarna de kleur weer uitgezet wordt. Aansluitend springt de code in de loop() naar de code benodigd voor de webinterface.

Voor patroon BLERICK worden in bovenstaande code red() en blue() vervangen door orange() en green(). Patroon ALAAF bevat de drie regels voor een kleur aan en uit te zetten 3x, namelijk voor red(), yellow() en green().

Voor opmode 4 (HYSTERIA) is de code aanmerkelijk langer. Desalniettemin staat ook deze code geheel in loop(), om consequent te blijven.

Voorbeeldcode

Als laatste bevat loop() nog de code die benodigd is om de webserver een website te laten serveren en daar een eventuele bedieningsactie af te vangen. Dit stukje code wordt na elke sequentie van een patroon uitgevoerd, zodat de respons op de website vlot genoeg aanvoelt.

Voorbeeldcode

Ervaringen en toekomstige verbeteringen

Op woensdag 12-2-2020 heeft de laatste systeemintegratie plaatsgevonden, volgens het ontwerp dat hierboven is beschreven. Alle gewenste functionaliteit werkt naar behoren; de helmen bieden een eigen WiFi-netwerk aan, er wordt een basale website geserveerd die 4 keuzemogelijkheden biedt en betreffende programma's vertonen de gewenste patronen op de LEDs.

Tijdens HackerHotel 2020 en de vastelaovend zijn de helmen in de praktijk gedurende langere tijd gedragen en in bedrijf geweest. Belangrijkste conclusie: een 9V-blokbatterij is verre van ideaal voor de voeding. De batterij wordt erg heet en na een uur bedrijf kan er onvoldoende stroom geleverd worden. Na afkoelen kan een batterij nogmaals gebruikt worden voor ca 45 minuten, daarna is de batterij te ver leeg om nog voldoende stroom te leveren. Daarnaast is gebleken dat de WiFi / website combinatie voor de bediening niet altijd evebn vlekkeloos functioneert. Oorzaak is vooralsnog onbekend, mogelijk gerelateerd aan de te zwakke voeding.

De belangrijkste verbetering voor de toekomst zal de voeding betreffen. Voorkeur heeft een oplossing die bestaat uit een oplaadbare (LiPo?) accu met bijbehorende elektronica voor veilig op- en ontladen. E.e.a. moet wel in de de helm passen en niet te zwaar zijn.

  • projects/aansturing_rgbledstrip_helm.txt
  • Last modified: 2020/09/09 21:11
  • by marc