LightStudio (ett styrkort för att driva RGB LED:ar)

Berätta om dina pågående projekt.
Användarvisningsbild
JonasJ
Inlägg: 653
Blev medlem: 11 september 2007, 16:02:26
Ort: Kinna
Kontakt:

LightStudio (ett styrkort för att driva RGB LED:ar)

Inlägg av JonasJ »

Hej!

För två år sedan gjorde jag en Internet-ansluten adventsljusstake. I korthet består den av 7 RGB LED:ar, en AVR samt Lantronix Xport för TCP/IP. Som LED drivare använder jag TLC5940. Jag skrev också ihop ett program på Windows för att skapa ljussekvenser och som sedan laddades ner till ljusstaken. Den fungerar men jag är inte riktigt nöjd med den. Dels blev jag aldrig vän med TLC5940 drivarna och dels så blir det lite krångligt att ha den Internet-ansluten för att kunna ändra ljussekvenserna. För ett par veckor sedan såg jag att Pololu har tagit in 8 mm RGB LED med integrerade LED driver (WS2811) och då föddes idén till att uppdatera min adventsljusstake.
Eftersom de nya LED:arna har integrerad drivare kan jag helt skippa TLC5940. Jag byter även Xport mot en Bluetooth anslutning så man kan ändra ljussekvenser med telefonen och en USB port för dels spänningsmatning med en USB laddare och dels uppdatera ljussekvenser.

Som processor valde jag en ATMega32U4. På kortet finns det ett externt EEPROM för lagring av ljussekvenserna.

Schemat blev relativt enkelt:
schematic.png
Spänningsmatning är valbar mellan antingen direktmatning från USB porten eller använda en extern 5 V källa (vilket är lämpligt om man har många LED:ar då USB porten inte tillåter något högre strömuttag). För att skydda USB hosten mot ett för stort strömuttag har jag lagt dit en polyfuse.

Sedan designade jag ett PCB som jag i dagarna kommer att beställa:
pcb.png
pcb2.png
Under tiden sker utvecklingen på ett labbkort:
_DSC0677.jpg
För den tidigare ljusstaken skapade jag sekvenser genom att steg för steg ange vilken färg lysdioderna skulle ha. Trots vissa funktioner i gränssnittet blev det extremt jobbigt att skapa större program så istället funderade jag ut ett litet skriptspråk. Skriptet kompileras med en kompilator jag utvecklat i C# till bytekod för att spara plats. Det kompilerade skriptet kan sedan laddas ner till ATMega32U4 för att lagras i EEPROM:et.

Så här kan ett enkelt program se ut (kallas sketch):

Kod: Markera allt

<?xml version="1.0" encoding="utf-8" ?>
<sketch>
  <channels>4</channels>
  <startup-script>constant</startup-script>
  <driver>ws2811</driver>
  <scripts>
    <script name="constant">
       set all green
       update
    </script>    
   </scripts>  
</sketch>
Man behöver ange hur många LED:ar (eller kanaler) som är anslutna till modulen samt vilken drivare som ska användas (just nu finns bara stöd för WS2811). Man måste också ange vilket skript som ska startas default. Det går alltså att ha flera skript och sedan växla mellan dessa genom ett kommando över antingen USB porten och en terminal (modulen emulerar en serieport) eller via Bluetooth.

Det finns idagsläget ett antal kommandon som man kan använda sig av i skriptet (det kommer fler men minnet i den 16U4 jag använder räcker inte till. Använder ca 90 % redan):

set - Sätter färgen på lysdioden.
update - Matar ut färgen till lysdioderna
do-loop - Skapar en loop och repeterar det som finns inuti kontinuerligt
roll - Roterar färgerna på lysdioderna
shift - Skifter ut färgerna på lysdioderna och skifter in en ny färg
wait - väntar en viss tid

Färgerna kan anges antingen som text (t.ex. red), som RGB (t.ex. #ff0000 eller #f00) eller som HSV ($ff0000). Internt räknar modulen med HSV för att få bättre färgövergångar men räknar om till RGB innan datat skickas till LED:arna (ws2811 använder sig av RGB).

Ett enkelt skript för att tända alla lysdioder:

Kod: Markera allt

set all white
update
Vill man ha en avvikande färg kan man ange ge kanalen istället för all:

Kod: Markera allt

set all white
set 0 red
update
Alla lysdioderna sätts till vita förutom kanal 0 som visar rött ljus. Set är ganska flexibelt i hur man anger kanaler:

Kod: Markera allt

set 0,1,2,3 red
set 0-3 red
set 0,1-2,3 red
set all red
är precis samma sak och sätter alla lysdioder till röda.

En blinkade ljus kan fås så här:

Kod: Markera allt

do
set odd red
set even green
update
wait 200 ms
set all off
update
wait 200 ms
loop
_DSC0675.jpg
Varannan lysdiod kommer vara röd och grön och blinka ca 200 ms.

Absolut enklaste formen av blinkande ljus:

Kod: Markera allt

do
set all off
update
wait 200 ms
set all red
update
wait 200 ms
loop
Vill man ha några snygga färgövergångar anger man helt enkelt hur länge uppdateringen ska ske. Skriptmotorn räknar själv ut hela färgövergångens förlopp.

Kod: Markera allt

do
set all green
update 200 ms
set all red
update 200 ms
loop
Skripet kommer att fadas mellan grönt och rött sken. Fading sker i HSV-formatet för att få snyggare övergångar.

Här är ett skript som skapar en regnbåge och sedan låter färgerna rulla genom att lysdioderna:

Kod: Markera allt

set 0 red
set 1 green
set 2 blue
set 3 yellow
update
do
roll 1
update 100 ms
loop
_DSC0671.jpg
Jag har massor med fler idéer och kommandon som jag vill göra men har ju inget minnet kvar i prototypkortet!
- Något form av "repeat 5 times" kommando
- Kunna starta andra skript inifrån ett skript (typ run 1)
- Den uppmärksamma såg att det fanns en stiftlist med ext IO på PCB:et. Tanken är att kunna styra dessa I/O från ett skript.

Kod: Markera allt

 wait input 1 high - Väntar på att ext I/O 1 ska gå hög
 output 2 high - Sätter ext I/O 2 till hög
Då kan man t.ex koppla in en knapp som aktiverar en viss ljussekvens eller få en modul att trigga andra moduler.

Jag som bara skulle uppdatera min adventsljusstake. Varför blir det alltid så här! :doh:
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
ElectricNooB
Inlägg: 600
Blev medlem: 26 juli 2011, 20:58:06

Re: LightStudio (ett styrkort för att driva RGB LED:ar)

Inlägg av ElectricNooB »

Mycket imponerande! :bravo: Skall du skapa några större installationer (med tanke på skriptspråket )?
Användarvisningsbild
JonasJ
Inlägg: 653
Blev medlem: 11 september 2007, 16:02:26
Ort: Kinna
Kontakt:

Re: LightStudio (ett styrkort för att driva RGB LED:ar)

Inlägg av JonasJ »

Tack! Nej, inga större installationer planerade. Mest är det kul att labba och se vad det blir av det.

Köpte hem några NeoPixel från Electrokit för att testa:



Skriptet är följande:

Kod: Markera allt

set 1 purple
update
do
  roll 1
  update 40 ms
loop
Användarvisningsbild
JonasJ
Inlägg: 653
Blev medlem: 11 september 2007, 16:02:26
Ort: Kinna
Kontakt:

Re: LightStudio (ett styrkort för att driva RGB LED:ar)

Inlägg av JonasJ »

Jag kunde inte låta bli att leka lite med ett gradient-kommando också

Skript:

Kod: Markera allt

gradient from 0 $00ff00 to 23 $00ffff
update
Resultat:
2014-08-06 00.14.43.jpg
************

Skript:

Kod: Markera allt

gradient from 0 red to 23 green
update
Resultat:
2014-08-06 00.17.10.jpg
************

Skript:

Kod: Markera allt

gradient from 0 red to 12 green
gradient from 13 green to 23 red
update
Resultat:
2014-08-06 00.29.44.jpg
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Virror
Inlägg: 1025
Blev medlem: 28 april 2004, 11:03:14
Ort: Göteborg
Kontakt:

Re: LightStudio (ett styrkort för att driva RGB LED:ar)

Inlägg av Virror »

Riktigt snyggt! : )
Användarvisningsbild
matsadona
Inlägg: 755
Blev medlem: 28 februari 2010, 23:05:17

Re: LightStudio (ett styrkort för att driva RGB LED:ar)

Inlägg av matsadona »

Eller så väljer man den enkla vägen och laddar ner Glediator... fast det är ju mindre utmanande än att bygga och skriva allt från scratch ;)
Pajn
Inlägg: 1160
Blev medlem: 6 juni 2008, 19:14:29
Ort: Nyköping
Kontakt:

Re: LightStudio (ett styrkort för att driva RGB LED:ar)

Inlägg av Pajn »

Mycket intressant!

Individuellt adresserbara led lister är ett bök för smidig styrning, men jag tror du har löst det.
Kommer du släppa koden för din kompilator?

På sikt skulle jag nämligen vilja skapa ett plugin för detta till RAXA (mitt projekt) just för att
det är en så snygg lösning. Sketcher skulle man kunna ha i en "store" så att användare kan
dela och ladda hem.
Användarvisningsbild
JonasJ
Inlägg: 653
Blev medlem: 11 september 2007, 16:02:26
Ort: Kinna
Kontakt:

Re: LightStudio (ett styrkort för att driva RGB LED:ar)

Inlägg av JonasJ »

matsadona: Det skulle inte ha blivit mycket av ett projekt isåfall!

Pajn: Jag har inte bestämt mig vilken licens det blir men vi kan säkert komma överens om något. Hur som helst behöver jag skriva om och förbättra kompilator innan jag vågar skicka iväg koden någonstans.

************

Jag har jobbat vidare med både mjukvaran och hårdvaran. Jag börjar med hårdvaran:
pcb_top.png
pcb_bottom.png
Istället för en 3-pins plint blir det en 4 plint. Det finns en del LED drivare som kör SPI så för att kunna använda dessa med LightStudio drog jag ut både MOSI och SCK till plinten. Det ger ju förstås fördelen att kunna använda hårdvaru SPIn i AVR för att mata ut data till LED:arna och spara lite CPU-belastning. I någon framtida version vore det kul att använda en ARM processor och utnyttja DMA-möjligheterna som t.ex. OctoWS2811 gör. Jag insåg av en slump att jag lyckats få med en A/D kanal till den externa I/O plinten vilket öppnar möjligheter för att t.ex trigga på ett visst avläst värde (t.ex. tända upp en ljussekvens vid ett visst avläst värde från en solsensor, trappbelysning, automatiskt tända ljusstaken vid skymning). Kortet är beställda från iTeadStudio. Skönt blir det med en 32U4 som har mer minne. Programmet ligger nu och utnyttjar 99.1 % av minnet i en 16U4.

När det gäller skriptspråket har det hänt en del. Det har blivit en hel del nya kommandon har jag lyckats knô in:

tail: Skapar en kedja av fallande ljusintensitet.
2014-08-07 22.05.16.jpg

Kod: Markera allt

tail 0 purple 24
update
brightness: Sätter den generella ljusintensitet för alla LED:ar.

Kod: Markera allt

brightness 200  @Sätter ljusintensitet till 200
brightness 80 %  @Sätter ljusintensitet till 80 %, detta är denna upplevda intensiteten och följer inte en linjär kurva
foreach channel - loop: Loopar igenom lika många gånger som det finns LED:ar

Kod: Markera allt

set all off
set 0 green
update
foreach channel
  roll 1
  update
  wait 20 ms
loop
repeat X times - loop: Repeterar det mellan X antal gånger. Exempel nedan blinkar alla LED:arna i rött 3 gånger:

Kod: Markera allt

repeat 3 times
        set all red
        update
        wait 200 ms
        set all off
        update
        wait 200 ms
loop
repeat for X ms - loop: Repeterar det mellan för X antal ms. Tiden kollas efter varje kommando i loopen

Kod: Markera allt

repeat for 1000 ms
        set odd off
        set even red
        update
        wait 50 ms
        set odd green
        set even off
        update
        wait 50 ms
loop
Några videos på olika effekter:




För tillfället behöver jag skriva om och förbättra kompilator. Den ger inga tydliga felmeddelanden och själva parsingen av olika kommandon är något för hårdkodade för min smak. Det finns ett par färdiga bibliotek som kan sköta om parsingen (tex. ANTLR) men det verkar inte helt trivialt. Inga nya roliga skriptkommandon än på ett tag tyvärr...
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Skriv svar