Arduino LED Strip spjälsäng/säng natten ljus (5 / 5 steg)
Steg 5: programvara
LED Strip från Radio Shack kommer med en länk till Provningsmetod för Arduino. Detta utgjorde grunden för den bifogade programmet, men den Radio Shack versionen använder en hårdkodad uppsättning mönster och ändra dessa mönster är en hel del arbete för lite resultat.
Jag skapade en ny metod för att köra remsan som tar två komponenter:
- färger - Array av RBG (röd blå grön) färger
- Illum - matris med magnituder/intensitet (0,0 = 0% = OFF, 1,0 = 100% = FULL ON)
Detta kan du skapa ett mer dynamiskt omfång av mönster snabbt utan att behöva ange så mycket information varje sekvens. Bara multiplicera varje komponent av RBG hex värdet av omfattningen och köra som remsan (göras i funktionen light_strip()).
Kort avledning i hur låga LED koden fungerar
Koden för att faktiskt köra bitar till LED strip i send_strip() funktion behöver inte ändras, men om du är nyfiken på vad som händer med kod att köra LED, Läs vidare...
Här är länk till Radioshack supportfiler för TriColor band som innehåller databladet för LED Strip. Denna remsa fungerar på TM1803 protokollet vilket är 24 bitar att definiera en färg (8 bitar röd, 8 bitar blå, 8 bitar grön). Ett segment av remsan mottar 24 bitar, nästa kommer att passera över segmentet och flytta till nästa segment. På detta sätt segmentet enhet första 24 bitar 1, de nästa 24 bitarna är för segment 2, osv...
För att faktiskt överföra dessa bitar, kommer du se att köra 0 måste du ange PIN-koden data till hög (logiska 1) för 0,78 mikrosekunder och ange sedan data stift till låg (logisk 0) för 1,55 mikrosekunder. För att köra lite 1 behöver du motsatt tidpunkten, högt för 1,55 mikrosekunder och låg för 0,78 mikrosekunder.
Så till exempel om du ville skicka över ett värde av 0110 i binärt, du skulle faktiskt behöva överföra
HÖG för 0.78us, låg för 1.55us, hög för 1.55us låg för 0.78us, hög för 1.55us, låg för 0.78us, hög för 0.78us, låg för 1.55us
Så hur uppnås detta i koden i funktionen send_strip()?
Koden loopar över alla 24 bitar, och baserat på om varje bit är 1 eller 0 det utför en annan. Låt oss ta 1 exempel, koden körs först DATA_1 som anger utgångsstiftet till hög, sedan utför 28 nr-åtgärd (nop) monteringsanvisningar. Arduino Uno har en klockfrekvens på 16 MHz, vilket innebär att varje instruktion är att fylla på en ungefärlig 62,5 nanosekund tid. De kodade 28 nr-ops träder alltså 28 gånger 62,5 nanosekunder att slutföra, vilket är 1750 nanosekunder = 1,75 mikrosekunder. Detta är lite över 1.55us tiden vi letar efter, men är okej på grund av DATA_1 operationen inte slutföras omedelbart av den tid den första nop är drabbade, så i princip det första par nop inte tillgodoräknas tiden en signalen är hög. För att utveckla kod såhär idealiskt använder du en oscilliscope att lägga till/ta bort nop uttalanden, och mäta den resulterande tiden på oscilliscope, tills du träffar det 1.55us sweet spot i databladet.
Lyckligtvis har de flesta LED strips Arduino bibliotek som har redan räknat ut för användaren, men det är bra att veta hur koden uppnår tidpunkten i databladet.
Avslutande tankar
Jag har kommenterat koden tillräckligt bra för att jag inte gå in mer detaljerna om hur det fungerar, men som jag nämnde tidigare, jag tror bara idén att skapa mer intressanta ljusmönster skulle vara ett bra sätt att lära sig några enkla kodning och felsökning färdigheter.
Det totala flödet av programmet är:
- Boot Arduino
- Vänta på Motion
- Rita en regnbåge
- Dra 20 fler mönster
- Starta om programmet
Lycka till och njut! Om du gillade Instructable, skulle jag älska din röst för kodade skapa tävlingen.