Moodlamp

powerleds

powerledsMoodlamp

Degenen die recentelijk de afdelingsbijeenkomst van de RAZ bezocht hebben, hebben 'm waarschijnlijk al gezien: de Moodlamp. Iedereen kent de Philips moodlamp wel, zo’n bol met een aantal LED’s waarvan je de kleur en intensiteit met een afstandbediening kunt regelen.

 

Een van mijn zonen had voor mij een 10 Watt!!! RGB LED geregeld. Een leuk speeltje met in werkelijkheid 3×3 LED’s. Hier moest iets leuks mee gebeuren! Het betreft een OVTL09LG3M van Optek. Alleen bij het bestuderen van de specificaties bleek dat de LED’s nogal vreemd worden geschakeld.  De LED’s staan per kleur parallel, maar de drie kleuren staan in serie. ledschema  Omdat ik de LED (natuurlijk) met een PIC wil besturen was er iets slims nodig om de verschillende segmenten aan en  uit te kunnen zetten. Na uitgebreid overleg met Frank PA3CNO en Hugo PA2HW ontstond het idee om de verschillende segmenten met behulp van een stevige FET kort te sluiten. Dit kan prima, omdat een LED nu eenmaal middels een stroombron moet worden aangestuurd en een stroombron per definitie kortsluitvast is. Om voldoende stroom door de LED’s heen te laten lopen, rekening houdend met de spanningsval over de verschillende kleuren LED’s, is een voedingsspanning van 12 volt noodzakelijk. En omdat de drie FET’s welke de verschillende segmenten kortsluiten eigenlijk in serie staan en dus de spanning op de source van de verschillende FET’s ongedefinieerd is en de beschikbare schakelspanning uit een PIC nu eenmaal 5 volt is, zijn er per FET een PNP en een NPN transistor en een paar weerstanden noodzakelijk om de FET’s met een 5 volt spanning uit de PIC te kunnen schakelen.

driver  Nu hoor je een constante stroombron netjes te bouwen, en ik ben dat zeker ook nog wel van plan, maar het kan ook gewoon met een dikke weerstand. De stroom is dan niet echt constant en de lichtopbrengst per kleur is in theorie afhankelijk van de andere kleuren LED’s maar in de praktijk blijkt dit mee te vallen. Alleen wordt de weerstand erg heet als alle kleuren uit zijn. Dit natuurlijk omdat de verschillende segmenten dan zijn kortgesloten en er dus een minimale spanningsval over de FET’s ontstaat en er dus een maximale stroom door de weerstand loopt. Omdat ik de besturing toch met een PIC heb gebouwd, en dus ‘ weet’  wanneer alle segmenten uit zijn, heb ik de schakeling uitgebreid met een vierde identiek schakelsegment, waarmee ik de stroom door de array kan uitschakelen.

De intensiteit van LED’s zou je kunnen regelen door de stroom door de LED’s te regelen, maar dat is in dit geval, omdat de LED’s in serie staan geen optie. Daarbij is het regelen van de stroom met behulp van een PIC lastig, de uitgangen zijn nu eenmaal standaard digitaal. Een veel mooiere methode is middel pulsbreedte modulatie (PWM, puls width modulation). Hierbij wordt gedurende een cyclus de LED een deel van de cyclus aan en daarna uitgezet. Als  een cyclus lang duurt, dan knippert de lamp, maar als je het heel snel doet dan lijkt de LED meer of minder intens te branden.

Ik heb een programma voor de PIC geschreven waarbij de pulsbreedte modulatie wordt opgewekt in de ‘main loop’. Dit is de hoofdlus van het programma waarbinnen alle programmaonderdelen worden aangeroepen. Deze lus loopt dus continu rond. Een complete cyclus van de PWM bestaat uit 255 rondjes van de main loop. Gaat dit dan snel genoeg? Ja hoor, de PIC draait op de interne clock op 4 MHz en de main loop bestaat uit een gering aantal instructies, dus een complete cyclus duurt hooguit een paar miliseconden. 

De gewenste lichtintensiteit voor R, G en B worden uitgedrukt in een waarde tussen 0 en 255. Als de ‘loopteller’, de teller welke bepaald voor de hoeveelste keer de main loop rond draait, kleiner is dan de waarde van R wordt de rode led aangezet. Ditzelfde wordt bepaald voor groen en blauw. 

forever loop
 LoopTeller = LoopTeller +1

if R>LoopTeller then
    asm bcf PWM_Red_pin
  else
   asm bsf PWM_Red_pin
  end if

  if G>LoopTeller then
    asm bcf PWM_Green_pin
  else
    asm bsf PWM_Green_pin
  end if

  if B>LoopTeller then
    asm bcf PWM_Blue_pin
  else
    asm bsf PWM_Blue_pin
  end if

  if R<LoopTeller & G<LoopTeller & B<LoopTeller then
      asm bcf PWM_on_pin
  else
      asm bsf PWM_on_pin
  end if

end loop

 

Onderaan de main loop wordt vervolgens gecontroleerd of alle LED’s uit staan, zo ja dan wordt de stroom door de array onderbroken, zodat de weerstand niet onnodig heet wordt gestookt.

Omdat de FET’s, als ze worden ‘aangezet’ de betreffende kleur kortsluiten en deze dus uitzetten werkt de techniek ‘op zijn’ kop’. BCF (bit clear flag, uitgang laag) zet de LED aan, BSF (bit set flag, uitgang hoog) zet de LED uit. De stroomonderbreker werkt wel normaal, BSF zet de stroom aan, BCF zet de stroom uit.

Het programma is geschreven in JAL (just another language). Dit is een zg. high level ontwikkeltaal voor PIC’s. Zie ook http://www.voti.nl/jal/index.html. Het voordeel van JAL is dat het wat eenvoudiger ontwikkelt dan assembler, je maakt eenvoudiger loops en conditionele stappen. Het nadeel is dat timing slecht in de hand kan worden gehouden. Daarom gebruik ik hier en daar in de code stukken assembler.

De techniek werkt, de LED’s kunnen op elk gewenst niveau worden ingesteld, dus vrijwel elke kleur kan worden gemaakt. (255x255x255 = 16.581.375 kleuren). Met behulp van een paar knopjes aan de PIC kan een en ander worden geregeld. Maar ik vond het niet genoeg, een afstandsbediening zou het compleet maken.

Voor een energie verbruiksmeter heb ik ervaring opgedaan met een Conrad 433MHz zend- en ontvangprintje.  (artikel 130428-89) De prijs van dit setje is Eur. 16,-

In plaats van de PIC uit te rusten met een handje knoppen, heb ik er een ontvangerprintje aan geknoopt.  Vervolgens heb ik met een tweede PIC, een handje drukknoppen en een zenderprintje een afstandbediening gemaakt. De codering en decodering, alsmede checksumcontrole van het ontvangen signaal heb ik ‘geleend’ van mijn energiemeter. Het protocol heb ik heel eenvoudig gehouden, de 6 knoppen zenden een cijfer 1 t/m 6. Wordt door de ontvanger een 1 ontvangen dan wordt de waarde van rood verhoogd met 16, 2 doet dit voor groen en 3 doet dit voor blauw.

Natuurlijk komen we zo niet aan het maximaal aantal kleuren, maar 16x16x16=4096 kleuren is ook een heleboel.

Als een 4 wordt ontvangen gaat de lamp random kleuren knipperen met een interval van ongeveer 5 seconden. Een 5 schakelt de lamp helemaal uit (de vierde FET wordt permanent uit gezet). Er loopt dan nog een te verwaarlozen stroom van 40mA. (0,05 watt).

Schema

 

Remote

 

 

De lamp in actie

 

remote

 

De lamp in zijn behuizing, een matwitte bijzettafel van 60cm hoog

 

Mocht je het leuk vinden de lamp ook te bouwen, ik kan voor rond de Eur. 24,- aan de LED’s komen. De 433 MHz zender en ontvanger zijn bij Conrad te koop en de rest van de onderdelen gewoon bij Stuut en Bruin. De HEX en ASM code voor de lamp en de afstandsbediening vind je hier.

Als je niet in staat bent om de 16F628 te branden, wil ik dat graag voor je doen. Kom langs, natuurlijk wel met een paar 16F628 PIC’s  (bel wel eerst even), dan brand ik de code er voor je in.

Voor degenen die met de code in de weer willen, deze vind je hier. Het is wel noodzakelijk om de JAL compiler te installeren…