Stap 5: Software
De LED-Strip van Radio Shack wordt geleverd met een link naar het testen van de code voor de Arduino. Dit vormde de basis van het bijgevoegde programma, maar de Radio Shack versie gebruikt een hard gecodeerde set patronen en wijzigen van deze patronen is een heleboel werk voor weinig resultaten.
Ik heb een nieuwe methode om te rijden van de strip waarmee twee componenten:
- kleuren - Array van RBG (rood blauw groen) kleuren
- Illum - Array van magnitude/intensiteiten (0.0 = 0% = OFF, 1.0 = 100% = volledige ON)
U kunt voor het genereren van een meer dynamisch bereik van patronen snel zonder te geven zo veel informatie elke sequentie. Gewoon vermenigvuldigen van elke component van de RBG hex waarde door de omvang en rijden die de strip (gedaan in de light_strip()-functie).
Korte afleiding in de werking van het lage niveau van LED-code
De code eigenlijk rijdt de bits naar de LED-strip in de send_strip()-functie hoeft niet te worden gewijzigd, maar als u bent nieuwsgierig naar wat er gaande is met de code om te rijden de LED, Lees verder...
Hier is de Link naar Radioshack ondersteuningsbestanden voor TriColor Strip waarin de data sheet voor de LED-Strip. Deze strip werkt op het TM1803-protocol dat is 24 bits om een kleur (8 bits rood, 8 bits blauw, 8 bits Green) te definiëren. Een segment van de strip ontvangt 24 bits, de volgende gegevens voorbij het segment en verplaatsen naar het volgende segment. Op deze manier zijn de eerste 24 bits station segment 1, de volgende 24 bits voor segment 2, enz...
Als u wilt eigenlijk verzenden die stukjes, ziet u dat een 0 moet u de gegevens pin ingesteld op hoog (logische 1) rijden voor 0.78 microseconden en vervolgens de gegevens pin ingesteld op laag (logische 0) voor 1.55 microseconden. Om een 1-bit behoefte u aan de tegenovergestelde timing, hoog 1.55 microseconden en laag voor 0.78 microseconden.
Dus bijvoorbeeld dat als je verzenden via een waarde van 0110 in binaire wilde, u werkelijk zou moeten verzenden
HOOG voor 0.78us, laag 1.55us, hoog voor 1.55us, laag voor 0.78us, hoog voor 1.55us, laag 0.78us, hoog voor 0.78us, lage voor 1.55us
Dus hoe is dit bereikt in de code, in de send_strip() functie?
De code wordt over alle 24 bits, en gebaseerd op als elke bit 1 of 0 is het daarmee een andere bewerking uitvoert. Laten we bijvoorbeeld eens 1, de code uitvoert eerst DATA_1 die de uitgang-pins ingesteld op hoog, dan voert 28 Nee-bewerking (nop) montage-instructies. De Arduino Uno heeft een kloksnelheid van 16 MHz, wat betekent dat elke instructie is de voltooiing van een geschatte 62,5 nanosecond tijde. Dus de gecodeerde 28 Nee-ops vindt 28 keer 62,5 nanoseconden te voltooien, die is 1750 nanoseconden = 1,75 microseconden. Dit is een beetje over de 1.55us tijd zijn wij op zoek naar, maar is oke als gevolg van het feit dat de werking van de DATA_1 niet voltooid onmiddellijk tegen de tijd dat de eerste nop wordt geraakt, dus in principe de eerste paar nop tellen niet mee in de tijd een het signaal hoog is. Code zoals dit te ontwikkelen zou idealiter kunt u een oscilliscope toevoegen/verwijderen, nop verklaringen en het meten van de resulterende tijd op de oscilliscope, totdat je dat 1.55us sweet spot in de data sheet.
Gelukkig hebben de meeste LED strips Arduino bibliotheken die al heeft postuur zulks uiterlijk voor de gebruiker, maar het is nog steeds goed om te weten hoe de code bereikt de timing in de data sheet.
Definitieve gedachten
Ik heb het commentaar van de code goed genoeg dat ik zal niet ingaan op de meer de details op hoe het werkt, maar zoals ik al eerder zei, ik denk alleen het idee dat van het creëren van meer interessante lichte patronen zou een geweldige manier om te leren een aantal eenvoudige codage en debuggen vaardigheden.
De algehele stroom van het programma is:
- Boot van de Arduino
- Wachten op Motion
- Tekenen van een regenboog
- 20 meer patronen tekenen
- Start het programma opnieuw
Veel succes en geniet van! Als je genoten hebt van de Instructable, zou ik graag uw stemming voor de wedstrijd maken gecodeerd.