Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Excel voor WS2812 RGB LED-array-animaties

Componenten en benodigdheden

Arduino UNO
× 1
ws2812 8x8 RGB LED-matrix
× 1
Mannelijke/Vrouwelijke doorverbindingsdraden
Mijn drie zijn Black-Gnd, Red-5v en Green-Data
× 3
9V-batterij (algemeen)
× 1
9V naar Barrel Jack Connector
× 1
Mannelijke kop 5 positie- 1 rij- lang (0,1" )
Er zijn slechts drie pinnen nodig
× 1

Benodigde gereedschappen en machines

Soldeerbout (algemeen)
Soldeerdraad, loodvrij

Over dit project

Nadat ik had gecontroleerd of er online ondersteuning was, bestelde ik een WS2812 8x8 RGB LED-matrix in de verwachting dat deze zou worden geadresseerd als een XY-coördinaatstructuur, niet als een daisy chain (tape) van 64 LED's verpakt in 8 rijen van 8!

Een zoekopdracht met "WS2812 Led-animatie" leverde weinig op dat ik gemakkelijk en onmiddellijk kon begrijpen. Toen ik een YouTube-video vond, geproduceerd door Kevin Darrah, sprak hij een 16 x 16 matrix (256 LED's in serie geschakeld) aan alsof het een XY-coördinatensysteem was.

Zijn Excel-hulpprogramma stelde tekstcode samen om naar zijn schets te kopiëren en te plakken, waarin alle noodzakelijke functies zaten; er hoefden geen bibliotheken te worden geïmporteerd.

Toen hij cellen selecteerde binnen zijn nut en RGB-waarden werden toegevoegd, waren ze zonder onderscheid van toepassing op die geselecteerde cellen; niet wat ik wenste, dus heb ik het opnieuw ontworpen en opnieuw opgebouwd. Dat betekende ook dat ik zijn schets moest aanpassen voor 8x8-compatibiliteit.

Toen ik meer van mijn WS2812 vroeg, moest ik mijn Excel-toepassing, LED_Utility.xlsm, voortdurend aanpassen.

De Excel-werkmap biedt nu:

  • LED RGB-eigenschappen moeten afzonderlijk worden aangepakt.
  • Het dynamisch wijzigen van die eigenschappen door middel van programmeren.
  • XY-verplaatsing van die eigenschappen om beweging te simuleren.
  • RGB-waarden die moeten worden geadresseerd en ook de XY-locatie wijzigen.
  • Zowel 8x8 als 16x16 LED-adressering.
  • Een kleine verzameling RGB-waarden voor snelle referentie.

Mijn doel is in het bijzonder:

  • Ontwikkel een rood hol vierkant en zet het aan en uit.
  • Bedek een ander vierkant met een laag van verschillende kleuren en wissel ze af.
  • Laat het Rode vierkant groeien en speel ermee.
  • Overweeg gedachten over het gebruik van functies om weergave-elementen vast te houden; Ik bouw een vervagende spiraal.
  • Maak een ontwerp waarin kleuren in- en uitlopen.
  • Breng beweging in het ontwerp.
  • Adres 16x16 arrays.

Ik erken wel dat programmeerkennis problemen zal veroorzaken. Ik heb wat advies gegeven, maar stel voor onderzoek of vraag het aan iemand die je persoonlijk kan adviseren.

NAAR BEGIN

Monteer de hardware

Als uw matrix zonder header-pinnen wordt geleverd, soldeert u de rij header-pinnen aan de achterkant van de Matrix op de onderste locatie (DIN, +5V, GND). Verbind de DIN-pin met pin 8 aan de rechterkant van de Arduino en de andere twee met overeenkomende locaties aan de andere kant van het bord.

Voor dit bord en het hulpprogramma is XY (0, 0) linksboven.

Het Excel-hulpprogramma

Open het bestand LED_Utility.xlsm. U ziet drie bladen, "Acht", "Zestien" en "ColMap".

De laatste is een klein voorbeeld van RGB-codes ter referentie.

Ik heb LED_Utility.xlsm ingesteld op alleen-lezen om zowel overschrijven te voorkomen als om het gebruik van "SaveAs" aan te moedigen om een ​​bestand te bewaren voor mogelijk hergebruik. Er zijn ook enkele andere "foutmeldingen" ingebouwd.

Selecteer het werkblad "Acht".

Merk op dat het rechterraster gevuld is met nullen. Dat is belangrijk omdat de schets geen 'null'-waarden accepteert.

Er zijn vier knoppen zoals hierboven getoond (op "Zestien" zullen ze waarschijnlijk buiten het scherm zijn aan de rechterkant, de een onder de ander, maar zullen functioneren zoals hieronder beschreven).

Om tekstcode te produceren:

"Toon" toont de RGB van waarden in het linkerraster. Het verwerkt alleen waarden van 0-255. Het waarschuwt voor waarden boven 255 of andere variabelen.

"Var Map" accepteert numerieke en variabelen, maar biedt geen weergave.

"Wrap Map" is tweeledig. Het accepteert RGB-waarden die doorgaans worden ingevoerd voor een "Show" -weergave. Het voegt vervolgens een modulusfunctie toe voor schetscodering om overschrijding van de matrix mogelijk te maken. Ten tweede kunnen variabelen worden toegevoegd, maar deze moeten later in de schets worden geprogrammeerd. Daar ga ik hier niet op in.

Elk genereert 'rode' tekst onder de rasters (in beide werkbladen) die compatibel zijn met een schets die is ontworpen om deze te accepteren.

Met "Clear" worden beide rasters duidelijk ongeldig.

Deze worden later allemaal beschreven.

Als je werkt met de Excel-hulpprogramma, ik raad u aan de Bestand/OpslaanAls... te gebruiken nadat u heeft uw code gegenereerd zodat u uw ontwerp op een bepaald moment niet opnieuw hoeft te maken ander punt, en vooral als het ontwerp redelijk complex is. Ook uw originele LED_Utility.xlsm is ingesteld op alleen-lezen om te voorkomen dat het wordt overschreven.

De schets

De code wordt aangeboden hieronder met een waarschuwing om op te slaan met een alleen-lezen eigenschap.

Open Arduino IDE en laad de schets 'LED_Arduino.ino'.

Je zult zien dat:

  • Lijn 3 definieert de gebruikte Arduino-pin. Deze set als Pin 8.
  • Lijn 4 definieert de LED-eenheden op het bord. Dit zijn 64.
  • Regel 5 vermenigvuldigt dat getal echter met 3 om rekening te houden met de RBG-telling, dus 192.
  • Regels 8, 10 en 25 definiëren functies die in gebruik zijn.

Tussen regel 3 en 19 is de originele tekst gewijzigd, maar u kunt deze bewerken om een ​​matrix van 16x16 aan te pakken. Dat gezegd hebbende, ik heb LED_Ardino16.ino in de software geleverd en LED_Utility.xlsm zal het accommoderen.

Vaak zal ik adviseren dat je de 'LED_Arduino.ino' opent en vervolgens "Opslaan als" met een naam. Dat zorgt ervoor dat 'LED_Arduino.ino' ongewijzigd blijft als u de juiste eigenschap niet hebt ingesteld op 'Alleen-lezen'. [Ik ontdekte dat mijn nieuw gemaakte bestand nog steeds de eigenschap Alleen-lezen had; laat dat los om toekomstige bewerking en opslag te garanderen].

Tegelijkertijd moet een nieuw gemaakte schets waarschijnlijk een of zowel de poort als het bord opnieuw definiëren; er verschijnt een foutmelding, maar deze is mogelijk niet meteen duidelijk.

Project 1

Laad de LED_Arduino.ino in de Arduino IDE en sla het op als Red_Square (ino wordt automatisch toegevoegd).

In eerste instantie stel ik voor om een ​​3x3 rood vierkant te bouwen en zet die code in regel 40 van de schets. CellenN8, O8, P8, N11, P11, N14, O14 en P14 hebben de waarde 255.

Wanneer de rode tekst van LED_Utility,

mapLEDXY(2,2,255,0,0);mapLEDXY(2,3,255,0,0);mapLEDXY(2,4,255,0,0);mapLEDXY(3,2,255,0,0); mapLEDXY(3,4,255,0,0);mapLEDXY(4,2,255,0,0);mapLEDXY(4,3,255,0,0);mapLEDXY(4,4,255,0,0); 

wordt gekopieerd naar regel 40, wordt de tekst eronder natuurlijk naar beneden verplaatst.

Wanneer je de schets uploadt naar je Arduino, zal je matrix dat vierkant aan en uit zetten.

Overweeg voordat u verder gaat:

  • Beide rasters wissen.
  • Verander enkele kleuren binnen dat vierkant.
  • Voeg een vierkant met een andere kleur toe rond het origineel.

Project2

Ik stel voor dat je de schets Red_Square.ino opent en opslaat als Colour_Sq ('.ino' wordt automatisch toegevoegd) om te voorkomen dat Red_Square.ino wordt overschreven.

Met Colour_Sq.ino geladen in de IDE, ga naar de Red_Square in de Utility en wijzig de middelste vierkanten. Merk O8, O10, O14 en O16 '255'. N11 en P11 zijn '0' maar N12 en P12 zijn '255'. Druk op "Toon".

Nadat je de nieuwe code hebt toegevoegd op, verwacht ik regel 47 in de IDE, je moet het volgen met dit codeblok:

RGB_update(-1, 0, 0, 0);delay(1000);clearLEDs();RGB_update(-1, 0, 0, 0); vertraging(1000); 

Merk op dat u de vertragingswaarde naar eigen wens kunt wijzigen; 1000 is gelijk aan 1 seconde.

Project3

Laad Red_Square.ino opnieuw en sla het op als Grow.

Maak het rode vierkant opnieuw in het hulpprogramma. Rond dat vierkant voegt u waarden naar keuze toe om een ​​rand te maken, ze kunnen van 0 tot 255 zijn, maar lager dan 32 kan erg vaag zijn. Dit is mijn creatie in 'LED_Utility.xlsm':

Verwijder nu de waarden voor dat binnenste rode vierkant en druk op "Toon". Kopieer de gegenereerde code naar regel 47 in de IDE en kopieer/plak daarna de regels 42 t/m 46. Upload naar de Arduino voor een afwisseling van een rood binnenste vierkant en vervolgens een omgeven door verschillende kleuren.

Probeer desgewenst uit te breiden naar een andere grens.

Project4

Je bent je er misschien van bewust geworden dat als we code toevoegen aan "Loop", de neiging bestaat dat deze lang wordt en mogelijk problemen oplevert om later te bewerken.

Hier ben ik een spiraal aan het bouwen.

De afbeelding komt uit Workbook "spir5.xlsm". Het is het hoogtepunt van 4 eerdere werkboeken.

"spir1.xlsm" was het centrum met heldere (255) blokken, "spir2.xlsm" gebruikte de waarden van het binnenste 4x4 vierkant, waarbij "spir3.xlsm" het 27 vierkante blok was, enz. In elke fase kopieerde ik de code naar mijn schets, maar niet om te "loopen".

In plaats daarvan heb ik 5 void-functies onder "loop" gemaakt en ernaar verwezen in "loop":

Void loop(){Sp1();Sp2();Sp3();Sp4();Sp5();clearLEDs();delay(1000);} 

Mijn eerste functie, void Sp1(), is:

 void Sp1(){mapLEDXY(3,3,255,0,0);mapLEDXY(3,4,255,0,0);mapLEDXY(4,3,255,0,0);mapLEDXY(4,4.255, 0,0);RGB_update(-1, 0, 0, 0);delay(100);clearLEDs();RGB_update(-1, 0, 0, 0);delay(10);} 

Elke volgende functie zal hetzelfde zijn, behalve de twee regels van “mapLEDXY…”.

Het lijkt misschien triviaal uit dit voorbeeld om te suggereren "spir4.xlsm" te openen om de kleuren van de buitenste tips te bewerken om een ​​speciale functie te bewerken in plaats van binnen de "loop".

Grenzend aan het belachelijke, stel dat je de letters van het woord "MISSISSIPPI" achtereenvolgens één voor één wilt weergeven. Er zijn 11 tekens, dus dat betekent 77 regels code voor 'void loop ()' om te verwerken. Als u besluit de "S" te wijzigen, moet u 4 bewerkingen uitvoeren. Het woord bevat slechts 4 karakters. Het is daarom logisch om voor elk van hen een functie te creëren en ze op de juiste manier aan te roepen vanuit "loop".

Project5

Dit project houdt rekening met een andere functie van de LED_Utility, “Var Map”. Hier worden variabelen geïntroduceerd en daarom is enige basiskennis van programmeren vereist.

De syntaxis "For Loop" zal worden gebruikt, evenals de voorwaarde "Als".

De "voor" wordt gebruikt om een ​​RGB-waarde te verhogen of te verlagen, zoals:

for (int r=0; r<=256; r++) {} orfor (int r=255; r>=0; r--) {}  

"Als" zal de procedure indien nodig aanpassen.

Laten we eenvoudig beginnen, en ik bedoel eenvoudig.

Maak een 2x2 rood vierkant in het midden van de LED_utility en "Show", en hier is de code:

mapLEDXY(3,3,255,0,0);mapLEDXY(3,4,255,0,0);mapLEDXY(4,3,255,0,0);mapLEDXY(4,4,255,0,0);  

Verander nu alle 255 waarden in 'r'. Druk op “Toon” …. Oooow! Daar houdt het niet van. Dat is OK, het is een bescherming die ik heb toegevoegd. Druk op "Var Map" en controleer de gegenereerde code:

mapLEDXY(3,3,r,0,0);mapLEDXY(3,4,r,0,0);mapLEDXY(4,3,r,0,0);mapLEDXY(4,4 ,r,0,0); 

de 255's zijn vervangen door 'r'.

Open in de IDE de gearchiveerde LED_Arduino.ino en sla deze op als "wijzigingen".

Voer op regel 40 in:

for (int r=0; r<256;r++){}/// gevolgd door:for (int r=255;r>=0;r--){}  

Merk op dat er een lege regel is na elke 'for'-instructie.

Op regel 41 plak je je Excel-code:

mapLEDXY(3,3,r,0,0);mapLEDXY(3,4,r,0,0);mapLEDXY(4,3,r,0,0);mapLEDXY(4,4 ,r,0,0);volg dat met:RGB_update(-1, 0, 0, 0);delay(50); 

Kopieer en plak nu datzelfde 4-regelige codeblok in dat tweede "voor"-blok.

Na dat "for" -blok, voeg onder de "}" 'delay (200);' toe. Ik vond dat nodig om mijn ogen te laten weten dat het tweede blok was gesloten!

Bij het uploaden neemt het rode blok toe tot de volledige helderheid en neemt het vervolgens af, gaat uit en herhaalt zich vervolgens.

Project6

Laten we nu gebruik maken van de "Als" voorwaarde.

Maak dat vorige rode vierkant opnieuw in de LED_utility, maar omring het met blokken van een 'hemelsblauw' met 255's voor zowel de G- als B-waarden. Gebruik de "Toon".

Laat de Red 255's met rust, maar verander alle G 255's in een 'g' en de B 255's in een 'b',

en druk vervolgens op "Var Map".

Laad "LED_Arduino.ino" opnieuw in de IDE en sla op als "FadeBorder".

Nu gaan we wat problemen krijgen. We hebben twee variabelen, 'g' en 'b', en elk moet een waarde krijgen. Ze moeten ook in het programma worden aangegeven. Ik ben van plan de 'g' in een 'for'-statement te declareren, maar ik moet de 'b' eerder in de schets aangeven. In de sketch op regel 5 staat de declaratie BYTE RGB[192]. Voer daaronder ‘int b=0;’ in.

Als punt van uitleg kan men geen twee "for"-lussen gebruiken, zoals later nodig zal zijn. Hier moet elke 'b'-waarde hetzelfde zijn als de 'g'-waarde die wordt gegenereerd door de "for"-lus.

Mijn "loop" is als volgt gestructureerd, maar zonder mijn kaartcode:

void loop() {delay(50);for (int g=0; g<256;g++){b=g;[Voeg hier kaartcode toe]RGB_update(-1, 0, 0, 0 );delay(50);}for (int g=255;g>=0;g--){b=g; [Voeg hier kaartcode toe]RGB_update(-1, 0, 0, 0);delay(50);}} 

Merk op dat de B-waarde gekoppeld is aan de G-waarde met de uitspraak ‘b=g;’. De R-waarde blijft statisch op 255, terwijl de rand in helderheid op en neer vervaagt.

Project7

Het is nu tijd om gebruik te maken van het “if” statement.

Maak en 'Toon' het volgende met behulp van 255's waar variabelen in het rechterraster verschijnen. Merk op dat er een minuscule 'L' verschijnt in de cellen die grenzen aan rode cellen. Dat stelt het programma in staat om de controle over die cellen over te nemen wanneer dat nodig is.

Deze keer vervagen de LED's als groen en rood totdat de waarde 64 is bereikt en dan zullen die cellen in het midden van de rand geel worden terwijl het bord steeds helderder wordt. Dan wordt het proces omgekeerd.

Nogmaals, ik zal de basisstructuur van mijn 'loop' aanbieden. Ik noemde deze schets 'FadeColourChange.ino'.

void loop() { delay(50);for (int r=0; r<256;r++){g=r;if(g>64){ g=65; l=r;}[Voeg hier kaartcode toe]RGB_update(-1, 0, 0, 0); vertraging(50);}for (int r=255;r>=0;r--){if(r<65){g=r; l=0;}[Voeg hier MapCode toe]RGB_update(-1, 0, 0, 0);delay(50);}} 

Project8

Voor dit laatste project zal ik niet de kleuren veranderen maar beweging introduceren; Ik heb een pijl die over het bord beweegt, maar van links weer verschijnt.

Hier wil ik alleen code genereren met "Show".

Omdat ik wil dat de pijl van zijn huidige positie naar elke volgende positie gaat, moet ik de 'x'-waarde wijzigen.

Dit is code gegenereerd op G29:G33:

mapLEDXY(0,3,0,255,255);mapLEDXY(1,1,255,128,128);mapLEDXY(1,3,0,255,255);mapLEDXY(1,5,255,128,128);mapLEDXY(2,2,255.128,128);mapLEDXY(2,3 ,0,255,255);mapLEDXY(2,4,255.128,128);mapLEDXY(3,3,255,128,128); 

Aangezien '1' mijn minste waarde is voor X-coördinaten, verwijs ik ernaar als 'x' en verlaag ik alle andere waarden met 1.

mapLEDXY(x+0,3,0,255,255);mapLEDXY(x+1,255,128,128);mapLEDXY(x+1,3,0,255,255);mapLEDXY(x+1,5,255,128,128);mapLEDXY(x+2, 2,255,128,128);mapLEDXY(x+2,3,0,255,255);mapLEDXY(x+2,4,255,128,128);mapLEDXY(x+3,3,255.128,128); 

Mijn 'for (int x...loop') doet het goed, behalve dat de pijlpunt overloopt naar de onderste rij voor een paar passages van de lus!

Oplossing! Als een waarde '8' overschrijdt, heb ik de moduluswaarde nodig. Dat dwong me om de knop "Wrap Map" te maken. De code voor één LED ziet er nu als volgt uit:

mapLEDXY((x +1) % 8, (y +1) %8, 255, 128, 128);

Om een ​​XY-lay-out aan te pakken, denk ik dat het het beste is om twee 'for'-lussen te nesten, zelfs als er een niet wordt gebruikt (ja, ik heb een onhandig alternatief gevonden).

for(int x=0;x<8;x++){for(int y=0;y<8;y++){[mapcode]}} 

Als ik 'y<1' in de tweede lus maak, wordt de 'y' genegeerd. Omgekeerd heeft het veranderen van 'y' naar 8 en 'x' naar 0 een ander effect.

Als laatste gedachte accepteert "Wrap Map" RGB-variabelen. Zie hierboven waar ik heb verwezen. Iemand met basisprogrammering zou daar mee om moeten kunnen gaan. Ik heb een INO-schets toegevoegd, ArrowVar.ino, waarbij de voorkant van de pijlpunt in helderheid verandert als een kleine demo.

16x16 Matrix-gebruik.

Alles wat hierboven is vermeld, is van toepassing op de 16x16 WS2812-matrix. De schets 'LED_Arduino16.ino' moet echter worden gebruikt.

De schetsen die worden geleverd zijn ontworpen voor de 8x8 Matrix, behalve één, de 'Spiral16.ino'. Het levert een groter scherm dan de 'Spiral.ino'.

Deze spiraal, 16x16 matrix, had 2 vellen printerpapier als lichtdiffusor. Het scherm is ongeveer 10 seconden gepauzeerd om een ​​redelijk beeld vast te leggen.

Om uw code te ontwikkelen, opent u LED_Utility.xlsm en selecteert u het tabblad "Zestien" onderaan de pagina.

Als, zoals bij mij, je scherm te groot is en je moet scrollen, gebruik dan een uitzoomoptie. Zelfs dan zal wat scrollen nodig zijn om je code te kopiëren.

Extensies?

Is het mogelijk om matrices van andere formaten te adresseren?

Ik vraag me af waarom mijn 'LED_Arduino.ino' en 'LED_Arduino16.ino' zo verschillend zijn in hun openingszinnen. Ik heb bepaalde regels becommentarieerd in mijn eerste; beide schetsen werken zoals ik wil.

Ik ben niet van plan een werkblad te schrijven voor een '8x32', ook al heb ik net een bord gekocht. Ik zal je doorverwijzen naar "The Sketch " boven. Er zijn parameters die moeten worden aangepakt. Wees ook bijzonder over regel 15 en 18.

NB:Ik overweeg ook kleinere opties dan een UNO-type bord.

Code

  • LED_Arduino
LED_ArduinoC/C++
Deze schets vormt de basis van het project. Bij het opslaan moet het worden ingesteld op Alleen-lezen en verder moet het worden gebruikt als 'Opslaan als' voor archivering om overschrijven te voorkomen en gemakkelijk opnieuw te kunnen invoeren. // alleen digitale pin 8 werkt nu #define numberOfLEDs 64// totaal aantal RGB-LED's [256]byte RGB[192];//neem uw aantal LED's en vermenigvuldig dit met 3 [768]// FUNCTIONS HEREvoid RGB_update(int LED, byte ROOD, byte GROEN, byte BLAUW);//functie om LEDsvoid mapLEDXY aan te sturen (int x, int y, byte ROOD, byte GROEN, byte BLAUW) {int RGBlocation =0; // if (y % 2 ==0) { // even column [Uncomment] RGBlocation =x + y * 8; //[16] // } else { //oneven kolom [Uncomment] //RGBlocation =7 - x + y * 8; //[15] en [16] // } [Uncomment] RGB [RGBlocatie * 3] =BLAUW; RGB[RGBlocatie * 3 + 1] =ROOD; RGB [RGBlocatie * 3 + 2] =GROEN;}void clearLEDs() { memset(RGB, 0, sizeof(RGB));}void setup() {pinMode(WS2812_pin, OUTPUT); clearLED's(); RGB_update(-1, 0, 0, 0);}//setup0void loop() {//Plak mapLEDXY regel(s) direct boven de RGB_update hieronder.RGB_update(-1, 0, 0, 0); vertraging (1000); clearLED's(); RGB_update(-1, 0, 0, 0); delay (1000);}//loop//WS2812 Driver Functionvoid RGB_update (int LED, byte RED, byte GREEN, byte BLUE) {// LED is het LED-nummer dat begint met 0 // ROOD, GROEN, BLAUW is de helderheid 0 ..255 instelpunt voor die LED-byte ExistingPort, WS2812pinHIGH;//lokale variabelen hier om pinWrites te versnellen als (LED>=0) {// wijs de REG GROEN BLAUWE waarden toe aan de RGB [] array RGB [LED * 3] =GROENTE; RGB [LED * 3 + 1] =ROOD; RGB [LED * 3 + 2] =BLAUW; } noInterrupts();//doden de interrupts terwijl we de bitstroom naar buiten sturen... ExistingPort =PORTB; // sla de status van de hele PORT B ​​op - laten we naar de hele poort schrijven zonder de andere pinnen op die poort te verknoeien WS2812pinHIGH =PORTB | 1; //dit geeft ons een byte die we kunnen gebruiken om de hele PORTB in te stellen met de WS2812 pin HIGH int bitStream =numberOfLEDs * 3;//total bytes in the LED string //This for loop loopt door alle bits (8 bij een tijd) om de WS2812-pin AAN/UIT-tijden in te stellen voor (int i =bitStream - 1; i>=0; i--) { PORTB =WS2812pinHIGH;//bit 7 zet eerst de pin HOOG - hij wordt altijd hoog, ongeacht van een 0/1 // dit is het lastige gedeelte, controleer of het bit in de byte hoog/laag is, dan klopt de status van de pin // (RGB[i] &B10000000) zal de andere bits in RGB[i verwijderen] ], dus hier blijven we over met B10000000 of B00000000 // dan is het gemakkelijk om te controleren of het bit hoog of laag is door EN'ing dat met het bitmasker ""&&B10000000)"" dit geeft 1 of 0 // als het een 1 is, zullen we dat OF dat met de Bestaande poort, waardoor de pin HIGH blijft, als 0 de pin wordt geschreven LOW PORTB =((RGB[i] &B10000000) &&B10000000) | Bestaande Haven; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");//dit zijn NOPS - hiermee kunnen we de klok vertragen cycli voor een nauwkeurigere timing PORTB =ExistingPort;//oke, hier weten we dat we LAAG moeten zijn, ongeacht de 0/1 bit-status __asm__("nop\n\t""nop\n\t""nop\n\ t""nop\n\t""nop\n\t""nop\n\t""nop\n\t");//minimale LAGE tijd voor pin, ongeacht de 0/1 bit-status // doe dan het opnieuw voor het volgende stukje enzovoort... zie het laatste stukje voor een kleine verandering PORTB =WS2812pinHIGH;//bit 6 PORTB =((RGB[i] &B01000000) &&B01000000) | Bestaande Haven; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); PORTB =Bestaande Poort; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t "); PORTB =WS2812pinHIGH;//bit 5 PORTB =((RGB[i] &B00100000) &&B00100000) | Bestaande Haven; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); PORTB =Bestaande Poort; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t "); PORTB =WS2812pinHIGH;//bit 4 PORTB =((RGB[i] &B00010000) &&B00010000) | Bestaande Haven; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); PORTB =Bestaande Poort; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t "); PORTB =WS2812pinHIGH;//bit 3 PORTB =((RGB[i] &B00001000) &&B00001000) | Bestaande Haven; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); PORTB =Bestaande Poort; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t "); PORTB =WS2812pinHIGH;//bit 2 PORTB =((RGB[i] &B00000100) &&B00000100) | Bestaande Haven; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); PORTB =Bestaande Poort; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t "); PORTB =WS2812pinHIGH;//bit 1 PORTB =((RGB[i] &B00000010) &&B00000010) | Bestaande Haven; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); PORTB =Bestaande Poort; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t "); PORTB =WS2812pinHIGH;//bit 0 __asm__("nop\n\t");//op dit laatste stukje is de controle veel sneller, dus moest hier een NOP worden toegevoegd PORTB =((RGB[i] &B00000001) &&B00000001) | Bestaande Haven; __asm__("nop\n\t""nop\n\t""nop\n\t""nop\n\t""nop\n\t"); PORTB =ExistingPort;//merk op dat er geen NOP's zijn na het schrijven van de pin LOW, dit komt omdat de FOR Loop klokcycli gebruikt die we kunnen gebruiken in plaats van de NOPS }//for loop interrupts();//enable the interrupts // helemaal klaar!}//void RGB_update
Led_Utility.xlsm
Deze applicatie genereert de verschillende tekst voor kopiëren/plakken in de schets.https://github.com/CobraCat/LED_Utility
Sketches.zip
Dit zijn enkele of meer schetsen die tijdens de ontwikkeling zijn gebruikt. Ze zijn beschikbaar als 'support'.https://github.com/CobraCat/LED_Utility

Productieproces

  1. LCD-paneel met Arduino voor Flight Simulator
  2. Schakel/LED-paneel met Arduino voor FS2020
  3. Excel voor WS2812 RGB LED-array-animaties
  4. Drie stappen voor wereldwijde IoT-beveiliging
  5. Drie digitale productietrends voor 2020
  6. Drie tips voor MKB-bedrijven die uitbreiden naar het buitenland
  7. Drie lessen voor retailers in een jaar van disruptie
  8. Bouw een Go Away! Robot - Easy Starter-project voor kinderen
  9. Slechts drie pinnen voor een 4x3-toetsenbord
  10. Drie tips voor het onderhoud van industriële apparatuur
  11. Drie tips voor het kopen van zware industriële apparatuur