DIY

Hvordan lage en Arduino-drevet LED Matrix Conways Game of Life - DIY

Hvordan lage en Arduino-drevet LED Matrix Conways Game of Life - DIY

Korte byte: Hver hobby har sine egne milepælprosjekter som Hello World-introduksjonen i programmering. Arduino-samfunnet liker å starte folk med det blinkende LED-lyset. Men hva kunne vi gjøre med 64 LED-lys i en matrise? Vi kan vise alle slags ting som tall, bokstaver og til og med enkle bilder. I denne artikkelen vil vi gå gjennom hvordan du gjør det så vel som Conways Game of Life.

Arduino har hatt eksplosiv popularitet det siste tiåret. Det er tusenvis av biblioteker tilgjengelig for det. Det er en veldig godt dokumentert plattform og fantastisk å lære å programmere og designe elektronikk.

I denne artikkelen vil vi lett dekke bruken av MAX7219 og MAX7221 LED-drivere med LedControl-biblioteket, som er tilgjengelig for nedlasting og installasjon i Arduino IDE så vel som på Github, og vi implementerer Conways Game of Life. De to viktige delene du trenger for dette er en av de ovennevnte LED-driverne og en kompatibel LED-matrise (i tillegg til Arduino og noen standard elektronikkomponenter, selvfølgelig). Du kan finne mange til veldig billige (mindre enn $ 3USD) på forskjellige nettbutikker som eBay, Banggood og AliExpress. Det er imidlertid veldig viktig å lese beskrivelsen av hva du kjøper, fordi mange av disse kommer som sett som må monteres og loddes. Avhengig av hvor du bor, kan leveringstiden være noen uker, så sørg for å dobbeltsjekke beregnet ankomsttid for ditt område.

Jeg har gått videre og delt kilden for dette prosjektet på min (baron) Github-side, så er du velkommen til å laste den ned, endre den, legge den ut på nytt, eller hva du vil. Det vil være nødvendig å følge med, og det er mange kommentarer i koden på Github som ikke er inkludert i denne artikkelen, bare fordi det ville være en langvarig artikkel og de er mye mer effektive i selve koden enn å prøve å presse dem inn i denne artikkelen.

Etter toppfilen og pin-definisjonene finner du en linje som kanskje ikke gir mening.

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

Dette skaper LedControl-objektet som brukes til å grensesnittet med LED-driveren vår ved å gi de digitale inngangs-, klokke- og brikkesignalpinnene, samt spesifisere antall enheter (de kan kjedes sammen for en stor skjerm). Kontrollprotokollen mellom LED-driveren og Arduino er SPI (Serial Peripheral Interface), men vi trenger ikke å komme inn på det fordi vi har et objekt fra LedControl-klassen til å gjøre vårt bud for oss.

Den neste delen, i oppsett () funksjon, er for det meste selvforklarende, men vi vil dekke det for klarhet.

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

LED-driveren vil være i avstenging når den først slås på, så vi må fortelle den å våkne, og det er hva første linje gjør. Den andre angir lysstyrken, siden vi bare bruker en enkelt skjerm, er den første parameteren, adressen til matrisen 0, og intensiteten bør stilles til deg uansett hva du foretrekker, den maksimale gyldige verdien er 15. Til slutt tømmer vi visningen av eventuelle tidligere verdier. Dette er vanligvis ikke et problem, men hvis Arduino starter på nytt av en eller annen grunn, kan det potensielt la uønskede lysdioder lyse.

Før vi går inn i programmeringen er det viktig å forstå hva Conways Game of Life er og hva reglene er. Spillet er et "null spiller" -spill. Alt som betyr er at spilleren velger den opprinnelige tilstanden, som vi vil gjøre tilfeldig, og deretter følger reglene. Livets spill er veldig enkelt og har bare fire regler:

  1. Enhver levende celle med færre enn to levende naboer dør, som om den er forårsaket av underbefolkning.
  2. Enhver levende celle med to eller tre levende naboer lever videre til neste generasjon.
  3. Enhver levende celle med mer enn tre levende naboer dør, som om det er overbefolkning.
  4. Enhver død celle med nøyaktig tre levende naboer blir en levende celle, som ved reproduksjon.

- Wikipedia

Få ditt eget Arduino Board og start DIYing i dag

For å representere rutenettet bruker vi to todimensjonale matriser. Siden vi jobber med 8 × 8-matriser, er det dimensjonene vi bruker på våre matriser. Mens byte-matriser ville være mye mer effektive i minnet (og faktisk brukes til å brukes ofte i applikasjoner som dette), er booleans mye lettere å endre i en matrise enn biter i en byte. Endring av biter i en byte vil kreve bruk av bitvis operasjoner som ville komplisere ting ganske mye i forhold til de enkle boolske oppstillingene. Den andre matrisen er fordi vi må beregne den neste tilstanden fra den nåværende tilstanden, men hvis vi endrer den nåværende tilstanden, får vi ikke ønsket suksessiv tilstand.

De to neste for løkker er for initialisering av cgrid matrise med tilfeldige verdier og ngrid rekke med falsk verdier. Det er en av fire sjanser for at cellen vil være 'levende', dette gjøres ved å generere et tilfeldig tall mellom 0 og 3, hvis tallet er større enn 2 så lever cellen.

Resten av koden er enten enkel nok til at den ikke trenger ytterligere forklaring eller har en forklaring i koden. Men displayGeneration () funksjonen er mer interessant. Denne funksjonen, med liten modifisering, er i stand til å ta byte-arrays og skyve dem direkte til matrisen. De lc.setColumn () metodeanrop tar faktisk en byte da det er det siste argumentet, den første er adressen og kolonnen som blir satt. Ved å bruke dette og sette opp som nedenfor kan du enkelt opprette en funksjon som vil vise et åtte-element byte-array, for eksempel en bokstav eller et bilde, på matrisen.

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

Du kan se at metoden som brukes er setRow () metoden i motsetning til setColumn () metode. Hva dette gjør er å bare bruke byten horisontalt i motsetning til vertikalt, en enkel 90-graders rotasjon. Dette er et viktig poeng gitt at prosjektets orientering ikke nødvendigvis vil være den samme som min. I tillegg kan du reversere rekkefølgen som bytene plasseres ved hjelp av (7 - i) som ditt andre argument, effektivt å speile utdataene. Dette er en veldig enkel måte å orientere output på riktig måte for prosjektet ditt.

Hvis du har tenkt å vise tekst på matrisen din, kan du finne 8 × 8 matriseskrifter online. Det er imidlertid veldig viktig å merke seg den totale mengden RAM mikrokontrolleren din har. Jeg brukte Uno til dette prosjektet, og en av skriftene inkluderte definisjoner for 128-biters konfigurasjoner utover 7-biters ASCII-standarden. Dette var for mye for min Uno (det er 8 byte x 256 = 2048 byte, hele Uno kapasitet) og jeg trengte å halve settet til de opprinnelige 128 ASCII-definisjonene for å få fonten til å fungere. Så husk at kjørelengden din kan variere avhengig av mikrokontrolleren din.

Etter en kort jobbing kan du lene deg tilbake og se den fascinerende effekten av Game of Life på din egen lille LED-matriseskjerm.

Er det noen andre Arduino-prosjekter du vil se dekket på Fossbytes? Gi oss beskjed i kommentarene nedenfor.

Våre valg for de beste lavprissettede Android TV-boksene 2021
Android-baserte TV-bokser har blitt populære siden de er rimelige og fungerer bra til streaming av videoer og grunnleggende spill. En budsjett Androi...
Reivew AUKEY CB-C70 Type-C USB Hub 5-i-1 med trådløs lader
USB Type-C-hubber er gode enheter å ha når du legger til porter i de fleste ting som har en Type-C-kontakt, inkludert Android, MacBook Pro, Chromebook...
Slik tilbakestiller du eller oppdaterer fastvare på en Android TV-boks
Hvert så ofte trenger en Android TV-boks en tilbakestilling av fabrikken eller firmwaren oppdateres, noe som er enkelt å gjøre med noen få trinn. Hv...