Kedjad humör-ljus med hjälp av hög effekt RGB lysdioder (9 / 11 steg)
Steg 9: Ansluta master lampan
Det enda som skiljer sig från master lampan till slav lampor är att det finns en annan mikrokontroller i den (eller du kan också använda arduinos i alla slav lampor och ladda upp koden (anpassad) slav till slav lampor). Det är också den enda lampan som har en USB-kontakt och en IR-mottagare.
Jag bort det ursprungliga mini-USB-uttaget från styrelsen och använde wire wrap kablar (några andra små kablar kommer att vara bra) att återknyta kontakten med 5cm kabel i mellan. Jag använde dremel verktyg för att göra ett hål i lampan som passar i USB-uttaget, så jag kan uppdatera master programmet utan att öppna lampan. På motsatt sida gjorde jag ett hål stort nog för IR-mottagaren men tillräckligt små för att utifrån det bara ser ut som en liten svart knopp. Det är en bra idé att placera IR-mottagaren om mitt mellan skarv av de två halvorna och botten av lampan.
Anslut IR-mottagaren till GND, 5V och utgångssignal till stift till arduino digital stift 8 (som är kopplad med timer1 input capture avbrottet).
Koppla in NFET transistorn till Arduino: Anslut grinden till digital stift 13 och källan till GND. Avloppet ansluts till den negativa ingången på fläkten. Anslut den positiva ingången på fläkten till den Arduino 5V stift. Ja, det är en 12V fläkt men på 5V det skapar tillräckligt luftflöde för att hålla lampan kyls och det skapar nästan ingen buller. Om din fan inte fungerar på 5V, ansluta den till 12V linjen (som också är sant för alla slav lampor förresten).
Använd två 1.5 k Ohm motstånd och ansluta dem som pullups: en från SDA (analog pinne 4) till 5V och en från SCL (analog pin 5) till 5V. Detta är pullups I2C kommunikation bussen. Om du glömmer dem, fungerar inte den seriell kommunikationen. Använd inte den Arduino inre pullups, de är för svag (ignorera denna mening om du inte vet om den inre pullups av Arduino, de aktiveras av programvara och det spelar ingen roll om de är aktiverade eller inte om du löda externa pullups).
PWM signaler genereras med hjälp av timer1 (röda och gröna) och timer2 (blå). Stiften kontrolleras är digital stift 9 (röd), digital stift 10 (grön) och digital stift 11 (blå).
Timer1 är en 16-bitars timer, vilket ger dig 65'536 färg steg, vilket är mer än tillräckligt (ovanför 12 bitar du kan inte se någon "färg hopp" när dimming) men timer1 är bara en 8-bitars timer. I början hade jag både köra i 8-bitars läge men som såg lite skit eftersom våra ögon är logaritmisk och lysdioden är linjär, vilket innebär att du uppfattar en förändring från 2 till 4 som en större förändring i ljusstyrka än en förändring från 200 till 255. I verkligheten 256 ljusstyrka steg, när det görs i en logaritmisk sätt bara ge dig om 12-13 färgvärden (i teorin, i verkligheten är det några fler) per kanal, vilket resulterar i totalt 13 ^ 3 = 2197 urskiljbara färger. Låter som ett mycket men det är inte.
Jag går en bit in på Detaljer om koden nu, om du inte är bekant med hårdvara timing och timer grejer, hoppa över den.
Jag har sökt på nätet för ett par timmar att försöka hitta en programvara metod att öka 8 bit timern, men alla av dem introducera jitter fel programvara fördröjning, vilket resulterar i täta flimra av en led som inte är acceptabelt. Jag sedan satte mig och skrev min egen kod för att få en högre upplösning. Fann jag att för de lägre värdena, programvara förseningar är för långsamma, också avbrott är inte tillräckligt snabbt (vi talar enkel cpu klocka precision här). Det kunde kanske ha gjorts i assembler men jag ville inte gå in på denna väg, sir.
Jag använde i stället ett trick (som jag upptäckte av en slump, och nu är ganska stolt över) som timers inte uppdateras omedelbart jämför matcha register men har en buffert på den, uppdatera den bara på nästa timer översvämningen. Med detta i åtanke jag använder timer2 översvämningen att synkronisera och kontrollera timers och kan göra en upp till 16-bitars timer av alla 8 bit timer, men kan också ha vara det 12bits eller 13bits. Detta tillför en hel del CPU belastning, men master lampa bara behöver lyssna till IR, skicka kommandon och generera PWM, som är alla oftast sker i hårdvara så det finns tillräckligt med tid göra färg beräkningar och grejer under tiden. Med en arduino CPU klocka 16 MHz och en timer prescaler 8 (med en prescaler 1 CPU-belastningen blir för högt på grund av avbrott varje 256 timer-signaler) PWM frekvensen är 2MHz/(2^13) = 244 Hz (för slav lampor är det bara 122 Hz eftersom de kör på 8 Mhz) vilket är bra (100 Hz är minimum för att få flimmer fri lampor).
Bra, så vi har en mjukvara-hårdvara kombination PWM-utgång med en 13 bit upplösning, vilket ger oss 8191 linjär färg steg för varje lykta, detta ger oss 254 logaritmisk steg (upplösningen är faktiskt alltför hög och de lägre värdena använder samma antal timer-signaler) resulterande i 16'387 ' 064 olika färger! Detta ger fin och smidig färgändringar.
OK, nog om den koden och färg teorin. Koppla in 12V strömförsörjning till arduino. Ta strömkabeln och uttrycka det genom en av de två mindre hål i botten av lampan. Anslut den till ingången på 12V strömförsörjning AC, se till att använda värme krympslang på lödde lederna av kabeln. Ordna all elektronik fint i två trä skålar och fixa det med lim, som beskrivs för slav lyktorna. Dubbelkolla att 230V raderna är säkrade och välisolerade. Nu kan du ansluta det (jag använder en förlängningssladd med en switch, också från IKEA). Var extra noga nu, lampan har fortfarande vissa ställen (på nätet) med exponerade 230V delar.
Det fungerar inte som förväntat? Gotcha. Du behöva kommentera ut alla updatelamp(x); kommandon från arduino koden (också från alla funktioner!), med x är 1 till 5 (endast uppdatering lampa 0, master). Kommandona updatelamp vänta på det rätta svaret från slav och försök skicka kommandon om det misslyckas, så programmet faller in i en oändlig loop. Du kan sätta i en timeout i kommandot updatelamp om du önskar, jag ville inte göra det så ingen lampa hoppar alla färger.
Oh och medan du arbetar på master lampan, sätta i tre pulldown (till GND) motstånd av kan säga om 2k ohm på varje PWM-signal stiften. Jag glömde att göra det och master lampan blinkar starkt vitt ljus i ca en halv sekund, som det under uppstart av arduino would't om jag inte hade glömt de pulldowns...
Om allt fungerar, är det nu dags att hookup slavar. Jag hoppas du markerat som ett du programmerat med adressen till slav nummer ett.
Obs: Jag vet att det finns fortfarande några buggar i koden, om du hittar en, vänligen rapportera det till mig (och om du vet hur man fixar det, berätta för mig). Också min kunskaper i programmering är måttlig i bästa och koden är en enda röra men jag försökte lägga till i kommentarer på de flesta av linjerna (kan vara på tyska i vissa delar, ledsen för det). Det är fortfarande ett pågående arbete (vilken kod inte?) och inte helt saneras.
Eventuella tillägg eller förslag till koden är välkomna.