gør det selv

Sådan laver du en Arduino-drevet LED Matrix Conways Game of Life - DIY

Sådan laver du en Arduino-drevet LED Matrix Conways Game of Life - DIY

Korte byte: Hver hobby har sine egne milepælsprojekter som Hello World introduktion i programmering. Arduino-samfundet kan godt lide at starte folk med det blinkende LED-lys. Men hvad kunne vi gøre med 64 LED-lys i en matrix? Vi kan vise alle mulige ting som tal, bogstaver og endda enkle billeder. I denne artikel gennemgår vi, hvordan man gør det såvel som Conways Game of Life.

Arduino har været eksplosiv i det sidste årti. Der er tusindvis af biblioteker til rådighed for det. Det er en meget veldokumenteret platform og fantastisk til at lære at programmere og designe elektronik.

I denne artikel dækker vi let brugen af ​​MAX7219 og MAX7221 LED-drivere med LedControl-biblioteket, som er tilgængeligt til download og installation i Arduino IDE såvel som på Github, og vi implementerer Conways Game of Life. De to vigtige dele, du har brug for til dette, er en af ​​de ovennævnte LED-drivere og en kompatibel LED-matrix (ud over Arduino og nogle standardelektronikkomponenter, selvfølgelig). Du kan finde mange til meget billige (mindre end $ 3USD) på forskellige onlinebutikker som eBay, Banggood og AliExpress. Det er dog meget vigtigt at læse beskrivelsen af, hvad du køber, fordi mange af disse kommer som sæt, der skal samles og loddes. Afhængigt af hvor du bor, kan leveringstiden være et par uger, så sørg for at dobbelttjekke det anslåede ankomsttidspunkt for dit område.

Jeg er gået videre og delte kilden til dette projekt på min (baron) Github-side, så er du velkommen til at downloade den, ændre den, poste den igen eller hvad du vil. Det vil være nødvendigt at følge med, og der er mange kommentarer i koden på Github, der ikke er inkluderet i denne artikel, simpelthen fordi det ville være en lang artikel, og de er meget mere effektive i den faktiske kode end at prøve at presse dem ind i denne artikel.

Efter headerfilen og pin-definitionerne finder du en linje, der måske ikke giver mening.

LedControl lc = LedControl (DIN, CLK, CS, 0);

Dette skaber LedControl-objektet, der bruges til at grænseflade med vores LED-driver ved at levere de digitale input-, ur- og chipsignalstifter samt specificere antallet af enheder (de kan sammenkædes sammen til et stort display). Kontrolprotokollen mellem LED-driveren og Arduino er SPI (Serial Peripheral Interface), men vi behøver ikke komme ind på det, fordi vi har et objekt fra LedControl-klassen til at gøre vores bud for os.

Den næste del, i Opsætning() funktion, er mest selvforklarende, men vi dækker det for klarhedens skyld.

lc.shutdown (0, false); lc.setIntensity (0, 8); lc.clearDisplay (0);

LED-driveren vil være i en lukningstilstand, når den først tændes, så vi er nødt til at fortælle den at vågne op, hvilket er hvad den første linje gør. Den anden indstiller lysstyrken, da vi kun bruger en enkelt skærm, den første parameter, matrixens adresse, er 0, og intensiteten skal indstilles til dig, hvad du foretrækker, den maksimale gyldige værdi er 15. Endelig rydder vi visningen af ​​eventuelle tidligere værdier. Dette er typisk ikke et problem, men hvis din Arduino genstartes af en eller anden grund, kan den muligvis efterlade uønskede lysdioder oplyst.

Før vi går ind i programmeringen er det vigtigt at forstå, hvad Conways Game of Life er, og hvad reglerne er. Spillet er et ”nul spiller” spil. Alt, hvad der betyder, er at spilleren vælger den oprindelige tilstand, hvilket vi vil tilfældigt, og derefter følger reglerne. Livets spil er meget simpelt og har kun fire regler:

  1. Enhver levende celle med færre end to levende naboer dør, som om den er forårsaget af underbefolkning.
  2. Enhver levende celle med to eller tre levende naboer lever videre til den næste generation.
  3. Enhver levende celle med mere end tre levende naboer dør, som ved overbefolkning.
  4. Enhver død celle med nøjagtigt tre levende naboer bliver en levende celle, som ved reproduktion.

- Wikipedia

Få dit eget Arduino Board, og start DIYing i dag

For at repræsentere gitteret bruger vi to to-dimensionelle arrays. Da vi arbejder med 8 × 8 matricer, er det de dimensioner, vi anvender på vores arrays. Mens byte-arrays ville være meget mere effektive i hukommelsen (og faktisk bruges til ofte i applikationer som denne), er booleans meget lettere at ændre i et array end bits i en byte. Ændring af bits inden for en byte kræver brug af bitvis operationer, der ville komplicere tingene ret meget i forhold til de enkle boolske arrays. Den anden matrix er fordi vi er nødt til at beregne den næste tilstand ud fra den aktuelle tilstand, men hvis vi ændrer den aktuelle tilstand, får vi ikke den ønskede successive tilstand.

De næste to for sløjfer er til initialisering af cgrid array med tilfældige værdier og ngrid matrix med falsk værdier. Der er en ud af fire chance for, at cellen vil være 'levende', dette gøres ved at generere et tilfældigt tal mellem 0 og 3, hvis tallet er større end 2, så lever cellen.

Resten af ​​koden er enten enkel nok til ikke at have behov for yderligere forklaring eller har en forklaring i koden. Men displayGeneration () funktion er mere interessant. Denne funktion, med lille ændring, er i stand til at tage byte-arrays og skubbe dem direkte til matrixen. Det lc.setColumn () metodeopkald tager faktisk en byte, da det er det sidste argument, den første er adressen og den kolonne, der indstilles. Ved at bruge dette og opsætte som nedenfor kan du nemt oprette en funktion, der viser et otte-element byte-array, såsom et bogstav eller billede, på matrixen.

ugyldig printByte (byte ba [8]) for (int i = 0; i < 8; i++) lc.setRow(0,0,ba[i]); 

Du kan se, at den anvendte metode er setRow () metode i modsætning til setColumn () metode. Hvad dette gør, er simpelthen at anvende byten vandret i modsætning til lodret, en simpel 90-graders rotation. Dette er et vigtigt punkt i betragtning af, at dit projekts orientering ikke nødvendigvis vil være den samme som min. Derudover kan du vende den rækkefølge, som byte placeres ved hjælp af (7 - i) som dit andet argument, effektivt afspejling af output. Dette er en meget nem måde at orientere output for dit projekt korrekt.

Hvis du agter at vise tekst på din matrix, kan du finde 8 × 8 matrixskrifttyper online. Det er dog meget vigtigt at bemærke den samlede mængde RAM, din mikrocontroller har. Jeg brugte Uno til dette projekt, og en af ​​skrifttyperne indeholdt definitioner til 128-bit konfigurationer ud over 7-bit ASCII-standarden. Dette var for meget for min Uno (det er 8 byte x 256 = 2048 byte, hele Uno kapacitet) og jeg havde brug for at halve sættet til de originale 128 ASCII-definitioner for at få denne skrifttype til at fungere. Så husk, din kilometertal kan variere afhængigt af din mikrocontroller.

Efter en kort mængde arbejde kan du læne dig tilbage og se den fascinerende effekt af Game of Life på dit eget lille LED-matrixskærmbillede.

Er der andre Arduino-projekter, du gerne vil se dækket på Fossbytes? Lad os vide i kommentarerne nedenfor.

Sådan udskiftes en Android TV Box-fjernbetjening
Android TV-kasser er blevet meget populære enheder og er gode billige mediecentre til ethvert hjem. Fjernbetjeningerne, der leveres med en Android TV...
Vores valg til bedste DVR til OTA TV-antenne uden abonnement
Brug af en luft-tv-antenne til at se gratis tv-shows og film er en god mulighed for ledningsskærere. Den eneste virkelige ulempe er ikke at have en DV...
Gennemgå HK1 Android TV Box S905X3 4 GB RAM 128 GB intern opbevaring
HK1 Android TV Box er et billigt mediecenter bygget til at streame 4K-videoer ved 60 fps sammen med grundlæggende spil. Den har en S905X3 CPU, som er ...