Stap 9: Aansluiten van de master lamp
Het enige ding verschillend van de master lamp naar de slave-lampen is dat er een verschillende microcontroller is in (of u kunt ook arduinos in alle slave lampen en de code (aangepast) slaaf uploaden naar de slave-lampen). Het is ook de enige lamp die beschikt over een USB-aansluiting en een IR-ontvanger.
Ik de originele mini-USB-aansluiting van het bord verwijderd en gebruikt wire wrap kabels (alle andere kleine kabels zal wel goed) om opnieuw aan met 5cm lange kabel ertussen. Ik gebruikte de dremel gereedschap om een gaatje te maken in de lamp aan de USB-aansluiting, zodat ik de master software bijwerken kunt zonder het openen van de lamp. Aan de andere kant maakte ik een gat groot genoeg voor de IR ontvanger maar klein genoeg zodat van buitenaf het net ziet als een kleine zwarte knop eruit. Het is een goed idee om het plaatsen van de IR ontvanger over in het midden tussen de naad van de twee helften en de onderkant van de lamp.
De IR ontvanger verbinden met 5V, GND en de output signaal naar pin op de arduino digitale pin 8 (die is verbonden met de timer1 input capture-interrupt).
Haak de transistor NFET aan de Arduino: de poort verbinden met digitale pin 13 en de bron naar GND. De afvoer verbindt met de negatieve ingang van de ventilator. De positieve inbreng van de ventilator aansluiten van de Arduino 5V pin. Ja, het is 'n fan van 12V maar op 5V creëert voldoende luchtstroom te houden van de LED gekoeld en het maakt bijna geen geluid. Als uw ventilator niet op 5V werkt, aansluiten op de 12V-lijn (die ook geldt voor alle lampen van de slaaf door de manier).
Gebruik twee 1,5 k Ohm weerstanden en sluit ze als pullups: ene SDA (analoge pin 4) naar 5V en ene SCL (analoge pin 5) naar 5V. Dit zijn de pullups voor de I2C communicatie bus. Als u ze vergeten, werkt de seriële communicatie niet. Gebruik geen van de Arduino interne pullups, ze zijn te zwak (negeren van deze zin, als je niet over de interne pullups van de Arduino weet, ze worden geactiveerd door de software en het maakt niet uit als ze worden geactiveerd of niet als u externe pullups soldeer).
Het PWM-signalen worden gegenereerd met behulp van timer1 (rood en groen) en timer2 (blauw). De pinnen gecontroleerd zijn digitale pin 9 (rood), digitale pin 10 (groen) en digitale pin 11 (blauw).
Timer1 is een 16-bits timer, waardoor u 65'536 kleur stappen, dat meer dan genoeg is (boven 12 bit u ziet geen "kleur springt" wanneer dimmen) maar timer1 is slechts een 8 bits timer. In het begin had ik zowel uitgevoerd in 8 bits modus maar die keek een beetje crappy omdat onze ogen logaritmische zijn en de LED lineair is, wat betekent dat u een overgang van 2 naar 4 waarnemen als een grotere verandering in helderheid dan een verandering van 200 tot en met 255. In werkelijkheid de 256 helderheid stappen, wanneer in een logaritmische manier gedaan alleen geven u over 12-13 kleurwaarden (in theorie, in werkelijkheid is het een paar meer) per kanaal, resulterend in een totaal van 13 ^ 3 = 2197 te onderscheiden kleuren. Klinkt als een hoop, maar het is niet.
Ik ga een beetje in detail treden over de code nu, als u niet bekend bent met hardware timing en timer spullen, overslaan.
Ik heb het web gezocht voor een paar uur proberen te vinden van een software-methode om te verhogen van de 8 bits timer, maar alle van hen voeren jitter fouten ten gevolge van de vertraging van de software, die leidt tot te frequent knipperen van een led dat niet aanvaardbaar is. Toen ik ging zitten en schreef mijn eigen code om te krijgen een hogere resolutie. Ik vond dat voor de lagere waarden, software vertragingen zijn te traag, ook interrupts niet snel genoeg (we hebben enkele cpu klok precisie hier). Het zou misschien zijn gedaan in assembler, maar ik wilde niet te gaan op die weg, nee meneer.
In plaats daarvan gebruikte ik een truc (die ik bij toeval ontdekt, en nu ben erg trots op) die de timers niet onmiddellijk bijwerken de vergelijk overeenkomen met registreren maar hebben een buffer, actualisering ervan alleen op de volgende timer overflow. Met dit in gedachten, ik gebruik de overflow timer2 timers te synchroniseren en een up naar 16-bits timer uit elke 8 bits timer kan maken, maar kan ook hebben lijkt het 12bits of 13bits. Dit voegt een heleboel CPU-belasting, maar de meester lamp alleen moet luisteren naar de IR, het verzenden van opdrachten uit en het genereren van PWM, die alle meestal in hardware wordt gedaan, dus er is genoeg tijd doen kleur berekeningen en spullen in de tussentijd. Met een arduino CPU klok van 16Mhz en een timer prescaler van 8 (met een prescaler van 1 de processorbelasting elke 256 timer teken te hoog als gevolg van interrupts krijgt) is de frequentie PWM 2MHz/(2^13) = 244 Hz (voor de slave-lampen er slechts 122 Hz sinds ze draaien op 8 Mhz) die is prima (100 Hz is het minimum om de flikkering gratis lichten).
Goed, dus we een software-hardware combinatie PWM-uitgang met een 13-bits resolutie hebben, geven ons 8191 lineaire kleur stappen voor elk licht, dit geeft ons 254 logaritmische stappen (de resolutie is eigenlijk te hoog en de lagere waarden gebruiken hetzelfde aantal timer teken) resulteerde in 16'387 ' 064 verschillende kleuren! Dit geeft mooi en glad kleurwijzigingen.
OK, genoeg over de code en kleur theorie. Haak de 12V-voeding aan de arduino. Neem de machtskabel en zet het via een van de twee kleinere gaten in de bodem van de lamp. Sluit deze aan op de AC-ingang van de voedingsspanning van 12V, zorg ervoor dat u warmte krimpen slangen op de gesoldeerd gewrichten van de kabel. Alle elektronica mooi rangschikken in de twee houten schalen en repareren met lijm, zoals beschreven voor de slave-lampen. Dubbel te controleren dat de 230V-lijnen zijn beveiligd en goed geïsoleerd. Nu u het kunt aansluiten (ik gebruik een verlengsnoer met een schakelaar, ook van IKEA). Wees nu extra voorzichtig heeft de lamp nog sommige plaatsen (op de voeding) met blootgestelde 230V delen.
Het werkt niet zoals verwacht? Gotcha. U wilt commentaar uit alle updatelamp(x); opdrachten in de code van de arduino (ook van alle functies!), met x wordt van 1 tot en met 5 (alleen update lamp 0, de kapitein). De opdrachten van de updatelamp wacht tot het juiste antwoord van de slaaf en probeer te verzenden van opdrachten als het mislukt, zodat het programma in een oneindige lus valt. Kun je in een time-out in de opdracht updatelamp indien gewenst, ik wilde niet te doen dus geen lamp alle kleuren slaat.
Oh en terwijl je bezig bent de meester lamp, in drie pulldown (met GND) weerstanden van laat zeggen ongeveer 2k ohm op elk van de PWM signaal pinnen. Ik vergat om dat te doen en tijdens het opstarten van de arduino de master lamp knippert in helder wit licht voor ongeveer een halve seconde, waarin zij would't als ik niet die pulldowns vergeten had...
Als alles werkt, is het nu tijd om de aansluiting van de slaven. Ik hoop dat u hebt gemarkeerd die u geprogrammeerd met het adres van de slaaf nummer één.
Opmerking: Ik weet dat er zijn nog enkele bugs in de code als u vinden, gelieve te aan me rapporteren (en als je hoe het weet te repareren, vertel me). Ook mijn programmering vaardigheden zijn matig op zijn best, en de code is een puinhoop, maar ik geprobeerd toe te voegen in commentaren op de meeste van de lijnen (mogelijk in het Duits in sommige delen, sorry voor dat). Het is nog steeds een work in progress (welke code is niet?) en niet volledig opgeschoond.
Aanvullingen of suggesties aan de code zijn welkom.