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!
