Interaktiva omgivande ljus (4 / 8 steg)
Steg 4: kontroll?
Jag ville göra en kontroll algoritmen generiska nog för att hantera mönster/sekvenser och också kontrollera ljusstyrka och färg för varje LED.
Att styra lamporna jag har att skicka till MCP23016 en bildruta för 4bytes (1 byte = 8 bitar). En byte med adressen till IC korrespondent till färg, 1 byte med kommandot "skriva" och 2 byte med värdet av 16bits (LEDs). IC är ansluten till lysdioderna som "diskbänk", vilket innebär en logik värdet 0 på pin tänds lysdioden.
Och nu den utmanande delen, hur man gör PWM kontroll för 48 lysdioder?
Låt oss studera PWM för en LED! PWM förklarade @ Wikipedia.
Om jag vill ha lampan i 50% ljusstyrka, är min PWM-värde 50%. Detta innebär LED, i en period av tid, bör på samma mängd tid som off.
Låt oss ta en period av 1 sekund. PWM 50% betyder att denna 1 sekund, på tiden är 0,5 sekunder och off tiden är 0,5 sekunder. PWM 80%? 0,2 sekunder off, 0.8 sekunder på!
Enkelt, rätt?
I digital värld: med period 10 klockcykler, 50% betyder att för 5 cykler LED är på, och för en annan 5 cykler LED är avstängd. 20%? 2 cyklar på, 8 cykler av. 45%? Tja, vi inte kan riktigt komma 45%... Eftersom perioden är i cykler och vi har bara 10 cykler, kan vi bara dela upp PWM i steg bort 10%.
Detta innebär utvecklingen av PIN-koden bör vara 50%: 1,1,1,1,1,0,0,0,0,0; Eller ens 1,0,1,0,1,0,1,0,1,0;
Programmering kan vi göra denna sekvens av slå på och av en matris. För varje cykel vi utgång till stift värdet av indexet var cykeln är.
Gjorde jag känsla hittills?
Om vi vill göra LED0 50% och LED1 20%, kan vi lägga båda matriser.
För att köra LED0 PIN-koden: 1,1,1,1,1,0,0,0,0,0;
För att köra LED1 PIN-koden: 2,2,0,0,0,0,0,0,0,0;
Vilket resulterar i LED0 + LED0: 3,3,1,1,1,0,0,0,0,0;
Produktionen denna sekvens av nummer i port expander IC, vi skulle få LED0 med 50% ljusstyrka och LED1 med 20%!
Enkelt för 2 lysdioder, höger? Nu har vi att göra detta för 16 lysdioder, för varje färg!
För var och en av dessa matriser har vi en kombination av ljusstyrka för varje färg (16 LED)
Varje gång vi vill ha en annan kombination av färger, måste vi ändra denna matris.