DIY

Hoe maak je een Arduino-aangedreven LED-matrix Conway's Game Of Life - DIY

Hoe maak je een Arduino-aangedreven LED-matrix Conway's Game Of Life - DIY

Korte bytes: Elke hobby heeft zijn eigen mijlpaalprojecten zoals de introductie van Hello World in programmeren. De Arduino-community begint mensen graag met het knipperende LED-lampje. Maar wat kunnen we doen met 64 LED-lampjes in een matrix? We kunnen allerlei dingen weergeven, zoals cijfers, letters en zelfs eenvoudige afbeeldingen. In dit artikel zullen we bespreken hoe je dat kunt doen, evenals Conway's Game of Life.

De Arduino is het afgelopen decennium explosief populair geworden. Er zijn duizenden bibliotheken voor beschikbaar. Het is een zeer goed gedocumenteerd platform en geweldig om te leren programmeren en elektronica te ontwerpen.

In dit artikel bespreken we het gebruik van de MAX7219 en MAX7221 LED-stuurprogramma's met de LedControl-bibliotheek, die zowel in de Arduino IDE als op Github kan worden gedownload en geïnstalleerd, en implementeren we Conway's Game of Life. De twee belangrijke onderdelen die je hiervoor nodig hebt, zijn een van de bovengenoemde LED-stuurprogramma's en een compatibele LED-matrix (naast de Arduino en enkele standaard elektronische componenten natuurlijk). Je kunt er veel voor heel goedkoop (minder dan $ 3 USD) vinden in verschillende online winkels zoals eBay, Banggood en AliExpress. Het is echter erg belangrijk om de beschrijving te lezen van wat u koopt, omdat veel van deze worden geleverd als kits die moeten worden geassembleerd en gesoldeerd. Afhankelijk van waar u woont, kan de verzendtijd enkele weken duren, dus zorg ervoor dat u de geschatte aankomsttijd voor uw regio dubbel controleert.

Ik ben doorgegaan en heb de bron voor dit project gedeeld op mijn (baron) Github-pagina, dus voel je vrij om het te downloaden, aan te passen, opnieuw te plaatsen of wat je maar wilt. Het zal nodig zijn om mee te volgen en er zijn veel opmerkingen in de code op Github die niet in dit artikel zijn opgenomen, simpelweg omdat het een lang artikel zou zijn en ze veel effectiever zijn in de eigenlijke code dan ze proberen te persen in dit artikel.

Na het header-bestand en de pin-definities vindt u een regel die misschien niet klopt.

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

Dit creëert het LedControl-object dat wordt gebruikt om te communiceren met onze LED-driver door de digitale invoer-, klok- en chipsignaalpennen te leveren, evenals het aantal apparaten te specificeren (ze kunnen aan elkaar worden gekoppeld voor een groot scherm). Het besturingsprotocol tussen de LED-driver en de Arduino is SPI (Seriële perifere interface), maar daar hoeven we niet op in te gaan omdat we een object van de LedControl-klasse hebben om voor ons te bieden.

Het volgende deel, in de opstelling() functie, spreekt meestal voor zich, maar we zullen het voor de duidelijkheid behandelen.

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

De LED-driver is uitgeschakeld wanneer hij voor het eerst wordt ingeschakeld, dus we moeten hem vertellen om wakker te worden, wat de eerste regel doet. De tweede stelt de helderheid in, aangezien we slechts één display gebruiken, is de eerste parameter, het adres van de matrix 0, en de intensiteit moet naar wens worden ingesteld, de maximale geldige waarde is 15. Ten slotte wissen we de weergave van eventuele eerdere waarden. Dit is meestal geen probleem, maar als uw Arduino om de een of andere reden opnieuw opstart, kan het mogelijk zijn dat ongewenste LED's gaan branden.

Voordat we met programmeren beginnen, is het belangrijk om te begrijpen wat Conway's Game of Life is en wat de regels zijn. Het spel is een spel met nul spelers. Dat betekent alleen dat de speler de begintoestand kiest, wat we willekeurig zullen doen, en vervolgens de regels volgt. The Game of Life is heel eenvoudig en kent maar vier regels:

  1. Elke levende cel met minder dan twee levende buren sterft, alsof deze wordt veroorzaakt door onderbevolking.
  2. Elke levende cel met twee of drie levende buren leeft door naar de volgende generatie.
  3. Elke levende cel met meer dan drie levende buren sterft als door overbevolking.
  4. Elke dode cel met precies drie levende buren wordt een levende cel, als door reproductie.

- Wikipedia

Koop je eigen Arduino-bord en begin vandaag nog met klussen

Om het raster weer te geven, gebruiken we twee tweedimensionale arrays. Omdat we werken met 8 × 8 matrices, zijn dat de afmetingen die we toepassen op onze arrays. Hoewel byte-arrays veel efficiënter zouden zijn in het geheugen (en in feite vaak worden gebruikt in toepassingen zoals deze), zijn booleans veel gemakkelijker te wijzigen in een array dan bits in een byte. Het wijzigen van bits binnen een byte vereist het gebruik van bitsgewijs bewerkingen die de zaken behoorlijk ingewikkeld zouden maken in vergelijking met de eenvoudige booleaanse arrays. De tweede array is omdat we de volgende status moeten berekenen op basis van de huidige status, maar als we de huidige status wijzigen, krijgen we niet de gewenste opeenvolgende status.

De volgende twee for-lussen zijn voor het initialiseren van het cgrid array met willekeurige waarden en de ngrid array met false waarden. Er is een kans van één op vier dat de cel 'leeft', dit wordt gedaan door een willekeurig getal tussen 0 en 3 te genereren, als het getal groter is dan 2 dan leeft de cel.

De rest van de code is eenvoudig genoeg om geen verdere uitleg nodig te hebben of heeft een uitleg in de code. Maar de displayGeneration () functie is interessanter. Deze functie, met weinig aanpassingen, is in staat byte-arrays te nemen en deze rechtstreeks naar de matrix te sturen. De lc.setColumn () method-aanroep neemt eigenlijk een byte omdat dit het laatste argument is, het eerste is het adres en de kolom die wordt ingesteld. Door dit te gebruiken en in te stellen zoals hieronder, kunt u eenvoudig een functie maken die een array van acht elementen in bytes, zoals een letter of afbeelding, op de matrix weergeeft.

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

U kunt zien dat de gebruikte methode de setRow () methode in tegenstelling tot de setColumn () methode. Wat dit doet, is gewoon de byte horizontaal toepassen in plaats van verticaal, een eenvoudige rotatie van 90 graden. Dit is een belangrijk punt, aangezien de oriëntatie van uw project niet noodzakelijk dezelfde is als die van mij. Bovendien kunt u de volgorde waarin de bytes zijn geplaatst, omkeren door (7 - ik) als je tweede argument, effectief de output spiegelen. Dit is een zeer gemakkelijke manier om de uitvoer voor uw project correct te oriënteren.

Als u van plan bent tekst op uw matrix weer te geven, kunt u 8 × 8 matrixlettertypen online vinden. Het is echter erg belangrijk om te weten hoeveel RAM uw microcontroller heeft. Ik heb de Uno voor dit project gebruikt en een van de lettertypen bevatte definities voor de 128-bits configuraties buiten de 7-bits ASCII-standaard. Dit was teveel voor mijn Uno (dat is 8 bytes x 256 = 2048 bytes, de Uno is volledig capaciteit) en ik moest de set halveren tot de oorspronkelijke 128 ASCII-definities om dat lettertype te laten werken. Houd er dus rekening mee dat uw kilometerstand kan variëren, afhankelijk van uw microcontroller.

Na een korte inspanning kunt u achterover leunen en het betoverende effect van de Game of Life bekijken op uw eigen kleine LED-matrixdisplay.

Zijn er nog andere Arduino-projecten die je graag behandeld zou willen zien op Fossbytes? Laat het ons weten in de reacties hieronder.

Top 5 gratis videostreaming-apps voor de Fire TV-stick en Android-apparaten in de app-winkels
Er zijn veel gratis opties om video's naar de Fire TV Stick of een Android-apparaat te streamen. Hoewel Kodi en APK's erg populair zijn, zijn er ook ...
Beste film- en tv-show-apps (APK's) voor Android-apparaten en Fire TV Stick
Android-app voor films en tv-programma's (APK's) is erg populair geworden als een manier om video's te streamen. Vaak eenvoudigweg een APK genoemd, h...
Beoordeel DBPOWER T20 LCD-miniprojector 1080P HD Home Theatre
De DBPOWER T20 is een kleine miniprojector die is gebouwd om video's of afbeeldingen op een plat oppervlak, zoals een muur, weer te geven. Het zorgt ...