LoRa gebaseerde LED-lichtregelaar: Direct zicht niet nodig
op

In een tijd waarin energie-efficiëntie en een individuele woonomgeving steeds belangrijker worden, vertoont het traditionele verlichtingsbeheer via infraroodsystemen aanzienlijke beperkingen, waaronder de noodzaak voor direct zicht en storingsgevoeligheid. Dit artikel pakt deze uitdagingen aan met een innovatieve LoRa gebaseerde LED-lichtregelaar.
LED’s zijn efficiënter dan conventionele lampen. Daarom hebben we een systeem ontwikkeld om de lichtintensiteit van LED’s te variëren binnen de specificaties van de fabrikant en zonder hun efficiëntie te reduceren. De bediening zouden we met een potentiometer kunnen realiseren, maar we vonden een afstandsbediening praktischer. Een mogelijkheid was om een IR-afstandsbediening te gebruiken, maar – zoals vermeld in de teaser – deze werkt alleen bij direct zicht. Daarom kozen we voor de LoRa (Long Range) technologie voor zowel zenden als ontvangen, waarmee deze beperking wordt ondervangen. LoRa werkt onder alle omstandigheden, dichtbij, veraf en met bouwkundige barrières.
Het is een point-to-point draadloze communicatietechnologie die in Europa gebruik maakt van de vrije band op 868 MHz. Er zijn een aantal 868 MHz LoRa transceivermodules op de markt die we voor ons doel zouden kunnen gebruiken. Vanwege de prijs, het bedieningsgemak en het kleine formaat hebben we gekozen voor het break-out-board RFM95W. Om de lichtintensiteit te variëren zonder de specificaties van de LED’s te overtreden gebruiken we pulsbreedtemodulatie (PWM).
RTX-blokschema
Figuur 1 toont het blokschema van zowel het TX- als RX-gedeelte van het project. Omdat de zender een afstandsbediening is moet deze noodzakelijkerwijs worden gevoed uit een batterij (BT1). Hiervoor gebruikten we een oplaadbare Lithiumcel (ICR14500). De spanning van een lithiumaccu kan variëren van 3 V (leeg) tot 4,2 V (volledig opgeladen). De voedingsspanning van de LoRa-module (U3) ligt tussen 1,8 V en 3,7 V. Een 3,3 V spanningsregelaar (U2) zorgt voor de juiste spanning, ook tijdens het opladen van de accu. De LoRa-module wordt aangestuurd door een ATmega328 microcontroller (U1). Een OLED-display toont het percentage van de LED-lichtintensiteit. De intensiteit wordt verhoogd of verlaagd door op een van de twee minitoetsen S1 en S2 te drukken.
De voedingsspanning van de ontvanger op ingang J2 moet tussen 9...12 V bedragen. De spanningsregelaars U3 (5 V) en U4 (3,3 V) leveren de spanningen respectievelijk voor de PWM-module en de LoRa-module (U2). De 3,3 V stabilisator voedt ook de ATmega328 microcontroller. Deze stuurt de LoRa-module aan en levert het PWM-signaal.

De data die we van de zender ontvangen – deze bepalen de lichtintensiteit van de LED's – worden in een EEPROM-geheugen (IC1) opgeslagen. Zo is de intensiteit bij het inschakelen hetzelfde als bij het uitschakelen. Omdat de stroom door de LED's ongeveer bij 80 mA ligt, kan de microcontroller de LED’s niet direct aansturen. Interface PWM en IC2 vormen een driverschakeling.
Zender
De zender – waarvan het prototype is afgebeeld in Figuur 2 – wordt gevoed door een 3,6 V, 800 mAh accu (BT1). Deze kan worden opgeladen via micro-USB poort J1 die kan worden aangesloten op een gangbare USB-lader – zie het schema in Figuur 3. LED LD1, in combinatie met het oplichten van LD3, geeft aan dat de zender van stroom wordt voorzien en dat de accu wordt opgeladen. Als de accu opgeladen is gaat LD3 uit.

De laadstroom, bepaald door de waarde van R2, wordt geregeld door U2. Met de formule in de datasheet (IREG = 1000V/RPROG) kunnen we met de waarde van R2 de laadstroom bepalen, die normaal ongeveer een tiende is van de accucapaciteit. Spanningsstabilisator IC1 levert 3,3 V voor de microcontroller (U1), het OLED-display en de RFM95W-module.

Het 0,91" OLED-display met een resolutie van 128 × 32 pixels, toont de verzonden instelling. Het display is in twee regels verdeeld: op de bovenste regel wordt een lichtbalk weergegeven waarvan de lengte evenredig is met lichtintensiteit. De tweede regel toont het percentage met daarnaast Power. 0% komt overeen met de minimale en 100% met de maximale lichtintensiteit (Figuur 4).

De programmering voor de LoRa-communicatie en de besturing van het 0,91” OLED-display voor de ATmega328-microcontroller werd gedaan in de Arduino-ontwikkelomgeving (IDE) met behulp van de benodigde bibliotheken. Voor het compileren en programmeren gaven we echter de voorkeur aan de Microchip Studio IDE. Microchips PICkit4-programmer gebruikten we om de firmware te laden. De SPI-poort wordt gebruikt voor zowel het programmeren met de PICKit4 als ook om de LoRa-module aan te sturen. Met dipschakelaar SW2 tussen de microcontroller en de Lora-module onderbreken we de SPI-bus verbinding naar de LoRa module tijdens het programmeren. Zo vermijden we eventuele storingen
Knoppen S1 en S2 worden gebruikt om de PWM-modulatie, die we voor het gemak Power zullen noemen, te verhogen (S1) of te verlagen (S2). Dit resulteert in het verzenden van de data waarmee de ontvanger de lichtintensiteit van de LED's kan veranderen. De antenne AE1 kan heel eenvoudig zijn, als men binnenshuis werkt. Deze moet worden afgestemd op 868 MHz. Een stukje koperdraad met een lengte van ongeveer 8,6 cm– of ¼ van de golflengte, 34,56 cm/4 – is voldoende.
LD2 geeft aan wanneer de accu bijna leeg is (3,35 V). We meten de spanningswaarde via de weerstanden R4 en R5 die zijn aangesloten op de PC2-ingang van de microcontroller. Om de accu zo weinig mogelijk te belasten, laten we het display slechts gedurende een korte tijd oplichten na elke verandering van de lichtintensiteit. 26 seconden bleek een goede tijdsduur om de informatie aan de gebruiker mee te delen. Wanneer deze tijd is verstreken, wordt de stroom naar het display onderbroken met Q2. De LoRa module biedt de functie sleep. Met deze functie kunnen we het stroomverbruik van de module minimaliseren. Met de twee genoemde functies daalt het totale stroomverbruik van ongeveer 15 mA tot ca. 3 mA.
Met S1 kan men niet alleen de lichtintensiteit verhogen, maar ook het OLED-display en de LoRa-module activeren vanuit de slaaptoestand. Kort indrukken is voldoende.
Ontvanger
Het programmeren van de ATmega328 microcontroller (U1), evenals de functie van de dipswitches SW1 (zie het schema in Figuur 5), is hetzelfde als bij de zender. Aangezien PWM-modulatie de beste methode voor regeling van de LED-lichtintensiteit is, werden deze ontworpen met de volgende waarden:
- PWM-frequentie 120 Hz
- Maximale LED-stroom 1,3 A
- Ingangsspanning 9…12 V

Zoals het schema laat zien, bestaat de voeding uit drie delen: eerst wordt via J2 de ingangsstroom geleverd. De 9 V spanning is nodig voor de LED's die zijn aangesloten op J3. De maximale stroom die we kunnen leveren is 1,3 A. Hiermee kunnen we, afhankelijk van de stroom voor de gebruikte LED's (80 mA), maximaal zestien LED’s in parallel aansluiten. Het tweede deel levert met spanningsstabilisator U3 5 V voor de PWM-driver, bestaande uit Q2, Q3, Q4 enz. Tot slot levert stabilisator U4 3,3 V aan U1, U2 en IC1. De EEPROM (IC1) slaat de laatst ontvangen intensiteitswaarde op. Wanneer de ontvanger wordt ingeschakeld, wordt de opgeslagen waarde uitgelezen en geladen, zodat dezelfde lichtintensiteit kan worden ingesteld als bij het uitschakelen.
Het PWM-signaal wordt gegenereerd door de ATmega328 microcontroller (U1), met behulp van zijn interne TIMER 0. Aan de uitgang van pin PD5 vindt men een blokspanning met een frequentie van 120 Hz bij 3,3 V. Zoals we hierboven hebben gezien, kunnen we de LED's niet rechtstreeks aansturen via de PD5-uitgang van de microcontroller, maar hebben een driver nodig die de hoge stroom naar de LED's kan regelen en de frequentie van de PWM-modulatie stabiel kan houden. Figuur 6 toont het prototype van de ontvanger.

Met behulp van componenten Q1, Q2, Q3 en Q4 sturen we de LED's aan met een stabiele frequentie zonder ongewenste pieken (zie Figuur 7) die de MOSFET (Q4) en de stroombegrenzer, bestaande uit IC2, eventueel produceren. De maximale LED-stroom wordt bepaald door de twee weerstanden R3 en R4. We schakelen twee weerstanden in parallel omdat sommige lage waarden van SMD-weerstanden, met vermogens boven de 2 W, moeilijk verkrijgbaar zijn. Speciale aandacht verdient stroombegrenzer IC2 (een LM338 van Texas Instruments), die van een koellichaam is voorzien om de dissipatie boven zijn maximumwaarde (1 W) af te voeren. Aangezien het ingangsspanningsbereik 9...12 V kan zijn, hebben we in het slechtste geval een dissipatie van 8,6 W, dus het gebruik van een koellichaam is onvermijdelijk. Om de maximale bedrijfstemperatuur van de junctie van IC2 (Tj) onder 125 °C te houden, is het noodzakelijk om een koellichaam met een waarde van minstens 6 °C/W of minder (hoe lager de waarde, hoe beter de warmtedisspatie) te gebruiken.

Microchip Studio IDE
Zoals eerder vermeld zijn de programma's voor de LoRaSender en LoRaReceiver ontwikkeld met de Arduino IDE, maar voor het programmeren gebruikten we de Microchip Studio IDE. Werken met Microchip Studio is alsof we ons in de Arduino-ontwikkelomgeving bevinden. Om microcontrollers van de zender en ontvanger te programmeren zouden we het Arduino UNO board kunnen gebruiken, volgens de tutorial, maar voor ons onpraktisch wegens de TQFP-behuizingen van de op het board aanwezige microcontrollers.

Veel praktischer is het om een programmer te gebruiken zoals:
- ATMEL-ICE(AVR) – functioneel, maar nogal duur. Deze kan direct in de Arduino IDE worden gebruikt, maar alleen met AVR-microcontrollers.
- PICkit4-programmer van Microchip. Deze is veel goedkoper en, belangrijker nog, veelzijdiger.
Met behulp van de PICkit4-programmer kunnen we met Microchip Studio een groot aantal microcontrollers programmeren uit de Microchip familie en met AVR en SAM-architectuur.
Eerst installeren we nu de Microchip Studio Software, die te vinden is op de Microchip website. Open het om de software te laden die men met de Arduino IDE heeft gemaakt. Bij het opstarten komt men op de startpagina (Figuur 8), klik op New project en het venster verschijnt zoals in Figuur 9. Klik op Create project from Arduino sketch en er verschijnen een paar velden die men moet invullen:
- Name: voer de titel in van het bestand dat moet worden aangemaakt (LoRaSender of LoRaReceiver). Automatisch wordt het veld solution name ingevuld met dezelfde titel.
- Location: is het adres waar het bestand wordt opgeslagen
- Solution: laat dit veld ongewijzigd, omdat het een nieuw bestand is.

Klik op OK om verder te gaan. Het volgende venster dat verschijnt, is te zien in Figuur 10. Vul de velden opnieuw als volgt in:
- Sketch-File: klik op het pictogram met de drie puntjes om de map te openen waarin het Sketch-bestand is opgeslagen dat we met de Arduino IDE hebben gemaakt. Het geselecteerde bestand wordt gebruikt om ons programma te maken in de Microchip Studio IDE.
- Arduino IDE-Path: dit is de locatie waar de Arduino-software zich bevindt.
- Board: hoewel het niet relevant is, kiezen we voor het Arduino UNO board.
- Device: uiteraard selecteren we hier de ATmega328.

Als men op OK klikt, wordt het Arduino-sketchbestand geïmporteerd in de Microchip Studio IDE. Zoals eerder vermeld, heeft de Microchip Studio omgeving dezelfde functies als de Arduino IDE, maar met meer bijzonderheden, die uitnodigen om verder verkend te worden wanneer we klaar zijn met het verifiëren van de functionaliteit van het sketchbestand, opgeslagen in de nieuwe ontwikkelomgeving.
Om onze sketch te laten werken, ontbreekt nog een laatste stap: we moeten de benodigde bibliotheken laden. Om dit te doen, klikt men met de rechtermuisknop op het rood gemarkeerde venster (zie Figuur 11); er verschijnt een keuzemenu waarin men de optie Include Arduino-library vindt. Selecteer deze en kies uit de lijst de bibliotheken die nodig zijn voor ons project.

Voor de LoRaSender zijn de te selecteren bibliotheken:
- Wire.h
- SPI.h
- Adafruit_GFX.h
- Adafruit_Sensor.h
- Adafruit_SSD1306.h
- LoRa.h
En voor de LoRaReceiver:
- Wire.h>
- SPI.h>
- LoRa.h>
Opmerking: Om de bibliotheken in de bovenstaande lijst te zien, moeten ze geïnstalleerd zijn via de bibliotheeklaadfunctie in de Arduino IDE. Op dit punt hebben we alles gedaan om de sketch in onze ATmega328 microcontroller te laden. Om de firmware te laden, gebruiken we de PICkit4-programmer.
Firmware laden
Op de twee prints zit een 6-pins connector (J2 voor de zender en J1 voor de ontvanger) die we gebruiken met de PICkit4-programmer om de firmware in de microcontroller te laden door deze aan te sluiten zoals getoond in Figuur 12.

Dipschakelaar SW2 op de zenderprint en dipschakelaar SW1 op de ontvangerprint moeten uitgezet worden. Zodra we de PICkit4 hebben aangesloten op de print, selecteren we het type microcontroller door te klikken op het pictogram in de werkbalk, dat wordt weergegeven door het rood omcirkelde type microcontroller (Figuur 13). Er wordt een pagina geopend waarop we het type microcontroller kiezen dat we gebruiken.
Als dit nog niet is geselecteerd, klikt men op het pictogram Change Device dat in het groen is omcirkeld. Nu wordt er een keuzemenu geopend met een aantal microcontrollers die door Microchip Studio worden ondersteund; kies ATmega328 en klik op OK. Op dezelfde pagina staat een lijst met ondersteunde programmers (zie de paars omcirkelde lijst) met de naam Supported Tools. Klik op de programmer die men heeft en men wordt doorgestuurd naar de betreffende webpagina, waar meer details en documentatie over de programmer is te vinden.
Sluit de programmer aan via de USB-poort en selecteer hem, als hij goed herkend wordt, door op het geel omcirkelde pictogram te klikken (eerder geopend via het hamersymbool). Op dit punt hebben we de tools geselecteerd die we nodig hebben om onze firmware te laden. Klik nu op het pictogram met de groene pijl (blauw omcirkeld). Als alles correct is, begint het downloaden van de firmware naar de microcontroller. Na het downloaden, zou in het uitvoervenster onderaan moeten staan Build succeeded. Dit betekent dat het downloaden is geslaagd.

LoRaSender Sketch
Voordat we de sketch analyseren, die kan worden gedownload op de Elektor Labs pagina voor dit artikel, moeten we een kleine verduidelijking maken: in de sketch verschijnt een variabele met de naam power, wat niets meer is dan de waarde die wordt verzonden om de pulsbreedtemodulatie (PWM) in te stellen die de LED-lichtintensiteit bepaalt.
Het set-up-gedeelte van de LoRaSender-sketch wordt niet besproken omdat er een korte uitleg naast de functies staat; bovendien maken sommige functies deel uit van de verwante bibliotheek zoals bijvoorbeeld de programmering van het OLED SSD1306 display (Adafruit_GFX.h, Adafruit_Sensor.h en Adafruit_SSD1306.h) en het verzenden van LoRa-pakketten (LoRa.h).
Zoals vermeld hebben we een tijdsduur van 26 sec waarin het display aan blijft. Om deze tijd te bereiken, gebruiken we de 16-bit TIMER 1 in de Atmega328 microcontroller. Wanneer de overloopwaarde van de TIMER wordt bereikt, wordt de ISR-routine TIMER1_OVF_Vector aangeroepen. Binnen de routine wordt het display niet uitgeschakeld en wordt de LoRa-module niet in de slaapmodus gezet voor een aantal van 50 counts (gedefinieerd door de count-variabele) is bereikt.
De wake_up-procedure wordt aangeroepen op het moment dat S1 wordt ingedrukt en losgelaten wat het display weer zal inschakelen en de LoRa-module wekken (Listing 1).

LoRa.beginPacket();
LoRa.print("A");
LoRa.print(power);
LoRa.endPacket();
zenden de power-data om deze in de ontvanger naar lichtintensiteit te vertalen. De letter A die aan de power-data voorafgaat, dient als teken voor de ontvanger dat een bericht begint, zodat eventuele storingen kunnen worden geïgnoreerd.
De berekening van de toename of afname van de balk, die het percentage van de vermogensvariabele aangeeft, is als volgt:
power--;
pct = power / 1.28;
v_pct = pct;
Om de balk en de bijbehorende procentuele waarde te vergroten, moeten we de variabele power aftrekken in plaats van optellen. Dit is een gevolg van de functie die de lengte en hoogte van de balk regelt, genaamd: display.fillRect(0, 0, display.width()-counter, display.height()/8, INVERSE). De displaymatrix heeft 128 x 32 pixels. De lengte van de balk wordt dus bepaald door display.width()-counter en de hoogte door display.height()/8. De lengte wordt dus bepaald door de waarde 128 af te trekken, terwijl de hoogte van de balk wordt bepaald door de waarde 32 gedeeld door 8, dus 4 pixels. Het laatste betreft de waarde van de power variabele uitgedrukt als percentage: om de 128 pixels, inherent aan de breedte van het display, te laten overeenkomen met de waarde van 100% moeten we deze delen door 1,28. Dit is de reden waarom we eerst een floatwaarde (pct, procent) krijgen en deze afronden naar een gehele waarde (v_pct, procentwaarde). Het gedeelte over het verlagen van de waarde van de balk is hetzelfde als de functie die we zojuist hebben gezien, behalve dat we in plaats van de variabele power af te trekken (power--), dezelfde variabele zullen verhogen (power++).
LoRaReceiver Sketch
De ontvangercode is eenvoudig en kort, maar om de betekenis ervan beter te begrijpen, hebben we hem opgedeeld in vier macrogebieden. Na het aanzetten lezen we de laatst ontvangen PWM-data die zijn opgeslagen in het EEPROM IC, zodat de LED's met dezelfde intensiteit oplichten als bij het uitschakelen. Ook hier heet de variabele die de PWM-modulatiegegevens bepaalt power. Cruciaal is het deel:
TCCR0A = 0b000000;
TCCR0B = 0b000000;
TCCR0A = 0b10000011;
TCCR0B = 0b00000100;
OCR0A = 0;
omdat het bepaalt hoe TIMER 0 moet werken voor PWM-modulatiesturing. De PWM-data worden opgeslagen in de variabele OCR0A die de duur bepaalt hoe lang het PWM-signaal hoog en laag is. Om oncontroleerbare pieken in de LED-lichtintensiteit te voorkomen, hebben we een kleine routine geïntroduceerd die alleen wordt uitgevoerd wanneer de ontvanger wordt ingeschakeld:
if (cnt == 0){
Wire.beginTransmission(0x50);
Wire.write(0x00);
Wire.write(OCR0A = power);
Wire.endTransmission();
cnt++;
}
In Listing 2 vinden we het gedeelte over het ontvangen van het LoRa-pakket dat de waarde van de variabele power bepaalt.

Aangezien de waarde van power varieert van 0 tot 127, hebben we een vermenigvuldigingsfactor van 1,71 ingevoerd (fatt = 1,71 variable) om een grotere waarde van de variabele OCR0A te verkrijgen met een maximum van 255. Hiermee kunnen we PWM-modulatie krijgen met een minimum-, gemiddelde- en maximumgolfvorm zoals in Figuur 14. Aangezien de LoRa-module de power-data voortdurend bijwerkt, hebben we een while-lus geïntroduceerd om het aantal keren dat we de data in EEPROM opslaan te minimaliseren. In dit geval worden de variabele data alleen opgeslagen als ze verschillen van de vorige, waardoor het aantal schrijf-/leescycli in het geheugen tot een minimum wordt beperkt.

Conclusie
Er is een breed sortiment van LED's met een gemiddeld vermogen op de markt. In dit artikel hebben we ons beperkt tot die, die gewoonlijk gebruikt worden voor het verlichten van objecten. We presenteerden een methode voor afstandsbediening, met behulp van een technologie die weinig ontvangstbeperkingen kent. Alle benodigde materialen voor zowel de TX- als de RX-eenheid, inclusief Gerber, PDF-bestanden voor de PCB's en de projectbestanden voor de software kan men hier downloaden.
Opmerkingen van de redactie: Geïnteresseerd in LoRa en wireless-oplossingen? Dit project verscheen oorspronkelijk in Elettronica IN.
Discussie (0 opmerking(en))