DIY

Comment créer le jeu de la vie de Conway à matrice LED alimentée par Arduino - DIY

Comment créer le jeu de la vie de Conway à matrice LED alimentée par Arduino - DIY

Octets courts: Chaque passe-temps a ses propres projets marquants comme l'introduction de Hello World dans la programmation. La communauté Arduino aime démarrer les gens avec la lumière LED clignotante. Mais que pourrions-nous faire avec 64 lumières LED dans une matrice? Nous pouvons afficher toutes sortes de choses comme des chiffres, des lettres et même des images simples. Dans cet article, nous verrons comment faire cela ainsi que Game of Life de Conway.

L'Arduino a connu une popularité explosive au cours de la dernière décennie. Il existe des milliers de bibliothèques disponibles pour cela. C'est une plate-forme très bien documentée et incroyable pour apprendre à programmer et à concevoir de l'électronique.

Dans cet article, nous couvrirons légèrement l'utilisation des pilotes LED MAX7219 et MAX7221 avec la bibliothèque LedControl, qui est disponible au téléchargement et à l'installation dans l'IDE Arduino ainsi que sur Github, et nous mettrons en œuvre le jeu de la vie de Conway. Les deux parties importantes dont vous aurez besoin pour cela sont l'un des pilotes de LED mentionnés ci-dessus et une matrice LED compatible (en plus de l'Arduino et de certains composants électroniques standard, bien sûr). Vous pouvez en trouver beaucoup à très bon marché (moins de 3 USD) sur différents magasins en ligne tels que eBay, Banggood et AliExpress. Cependant, il est très important de lire la description de ce que vous achetez, car beaucoup d'entre eux sont fournis sous forme de kits qui doivent être assemblés et soudés. Selon l'endroit où vous vivez, le délai de livraison peut être de quelques semaines, alors assurez-vous de vérifier l'heure d'arrivée estimée pour votre région..

Je suis allé de l'avant et partagé la source de ce projet sur mon (baron) Github, alors n'hésitez pas à la télécharger, la modifier, la re-publier ou ce que vous voulez. Il sera nécessaire de suivre et il y a beaucoup de commentaires dans le code sur Github qui ne sont pas inclus dans cet article simplement parce que ce serait un article long et ils sont beaucoup plus efficaces dans le code réel que d'essayer de les presser dans cet article.

Après le fichier d'en-tête et les définitions des broches, vous trouverez une ligne qui pourrait ne pas avoir de sens.

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

Cela crée l'objet LedControl qui est utilisé pour s'interfacer avec notre pilote de LED en fournissant les broches de signal d'entrée numérique, d'horloge et de puce, ainsi que de spécifier le nombre de périphériques (ils peuvent être connectés en série pour un grand écran). Le protocole de contrôle entre le driver LED et l'Arduino est SPI (Serial Peripheral Interface), mais nous n'avons pas à entrer dans cela car nous avons un objet de la classe LedControl pour faire notre offre pour nous.

La partie suivante, dans le installer() fonction, est la plupart du temps explicite, mais nous allons le couvrir pour plus de clarté.

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

Le pilote de LED sera dans un état d'arrêt lors de la première mise sous tension, nous devons donc lui dire de se réveiller, ce que fait la première ligne. Le second définit la luminosité, puisque nous n'utilisons qu'un seul affichage, le premier paramètre, l'adresse de la matrice, est 0, et l'intensité doit être réglée à votre guise, la valeur maximale valide étant 15. Enfin, nous effaçons l'affichage des éventuelles valeurs précédentes. Ce n'est généralement pas un problème, mais si votre Arduino redémarre pour une raison quelconque, il pourrait potentiellement laisser des LED indésirables allumées..

Avant d'entrer dans la programmation, il est important de comprendre ce qu'est le jeu de la vie de Conway et quelles sont les règles. Le jeu est un jeu «zéro joueur». Tout cela signifie que le joueur choisit l'état initial, ce que nous ferons au hasard, puis suit les règles. Le jeu de la vie est très simple et ne comporte que quatre règles:

  1. Toute cellule vivante avec moins de deux voisins vivants meurt, comme si elle était causée par une sous-population.
  2. Toute cellule vivante avec deux ou trois voisins vivants passe à la génération suivante.
  3. Toute cellule vivante avec plus de trois voisins vivants meurt, comme par surpopulation.
  4. Toute cellule morte avec exactement trois voisins vivants devient une cellule vivante, comme par reproduction.

- Wikipédia

Obtenez votre propre carte Arduino et commencez à bricoler aujourd'hui

Pour représenter la grille, nous utilisons deux tableaux bidimensionnels. Puisque nous travaillons avec des matrices 8 × 8, ce sont les dimensions que nous appliquons à nos tableaux. Alors que les tableaux d'octets seraient beaucoup plus efficaces en mémoire (et sont en fait souvent utilisés dans des applications comme celle-ci), les booléens sont beaucoup plus faciles à modifier dans un tableau que les bits dans un octet. La modification de bits dans un octet nécessiterait l'utilisation de bit à bit opérations qui compliqueraient un peu les choses par rapport aux simples tableaux booléens. Le deuxième tableau est dû au fait que nous devons calculer l'état suivant à partir de l'état actuel, mais si nous modifions l'état actuel, nous n'obtiendrons pas l'état successif souhaité.

Les deux prochaines boucles for servent à initialiser le cgrid tableau avec des valeurs aléatoires et le ngrid tableau avec faux valeurs. Il y a une chance sur quatre que la cellule soit `` vivante '', cela se fait en générant un nombre aléatoire entre 0 et 3, si le nombre est supérieur à 2 alors la cellule est vivante.

Le reste du code est soit suffisamment simple pour ne pas nécessiter d'explications supplémentaires, soit une explication dans le code. Mais le displayGeneration () la fonction est plus intéressante. Cette fonction, avec peu de modifications, est capable de prendre des tableaux d'octets et de les pousser directement vers la matrice. le lc.setColumn () L'appel de méthode prend en fait un octet car c'est le dernier argument, le premier étant l'adresse et la colonne en cours de définition. En utilisant ceci et en configurant comme ci-dessous, vous pouvez facilement créer une fonction qui affichera un tableau d'octets de huit éléments, comme une lettre ou une image, sur la matrice.

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

Vous pouvez voir que la méthode utilisée est la setRow () méthode par opposition à la setColumn () méthode. Cela fait simplement appliquer l'octet horizontalement par opposition à verticalement, une simple rotation de 90 degrés. C'est un point important étant donné que l'orientation de votre projet ne sera pas forcément la même que la mienne. En outre, vous pouvez inverser l'ordre dans lequel les octets sont placés en utilisant (7 - i) comme deuxième argument, reflétant efficacement la sortie. C'est un moyen très simple d'orienter correctement la sortie de votre projet.

Si vous avez l'intention d'afficher du texte sur votre matrice, vous pouvez trouver des polices matricielles 8 × 8 en ligne. Il est cependant très important de noter la quantité totale de RAM dont dispose votre microcontrôleur. J'ai utilisé Uno pour ce projet et l'une des polices incluait des définitions pour les configurations 128 bits au-delà de la norme ASCII 7 bits. C'en était trop pour mon Uno (c'est 8 octets x 256 = 2048 octets, la totalité de l'Uno capacité) et j'avais besoin de la moitié de l'ensemble des 128 définitions ASCII d'origine afin de faire fonctionner cette police. Alors, gardez à l'esprit que votre kilométrage peut varier en fonction de votre microcontrôleur.

Après un peu de travail, vous pouvez vous asseoir et regarder l'effet fascinant du Game of Life sur votre propre petit écran matriciel LED.

Y a-t-il d'autres projets Arduino que vous aimeriez voir couverts sur Fossbytes? Faites-nous savoir dans les commentaires ci-dessous.

Qu'est-ce qu'une Android TV Box et comment fonctionne-t-elle?
Un boîtier Android TV est un petit boîtier de centre multimédia à faible coût qui se connecte à un téléviseur et lit des films, des émissions de télév...
Nos choix pour les meilleurs boîtiers TV Android à bas prix à petit prix 2021
Les téléviseurs basés sur Android sont devenus populaires car ils sont peu coûteux et fonctionnent bien pour les vidéos en streaming et les jeux de ba...
Reivew AUKEY CB-C70 Hub USB Type-C 5-en-1 avec chargeur sans fil
Les concentrateurs USB de type C sont d'excellentes unités à avoir lors de l'ajout de ports à presque tout ce qui a un connecteur de type C, y compris...