LightStudio (ett styrkort för att driva RGB LED:ar)
Postat: 3 augusti 2014, 19:56:41
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: 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: Under tiden sker utvecklingen på ett labbkort: 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):
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:
Vill man ha en avvikande färg kan man ange ge kanalen istället för all:
Alla lysdioderna sätts till vita förutom kanal 0 som visar rött ljus. Set är ganska flexibelt i hur man anger kanaler:
är precis samma sak och sätter alla lysdioder till röda.
En blinkade ljus kan fås så här:
Varannan lysdiod kommer vara röd och grön och blinka ca 200 ms.
Absolut enklaste formen av blinkande ljus:
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.
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:
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.
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!
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: 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: Under tiden sker utvecklingen på ett labbkort: 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>
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
Kod: Markera allt
set all white
set 0 red
update
Kod: Markera allt
set 0,1,2,3 red
set 0-3 red
set 0,1-2,3 red
set all red
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
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
Kod: Markera allt
do
set all green
update 200 ms
set all red
update 200 ms
loop
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
- 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
Jag som bara skulle uppdatera min adventsljusstake. Varför blir det alltid så här!
