Pour un autre projet de jeu de notre client H.U. Küster, j'ai d'abord dû commander un autre module MAX7219 8x32 4 in 1 Dot Matrix LED display (quatre au total sont nécessaires) pour obtenir une zone de jeu de 32x32 points illuminés. Cependant, les souvenirs se sont immédiatement réveillés lorsqu'il a décrit le jeu : Snake, le serpent s'allongeant à chaque point avalé, qui n'avait pas le droit de toucher le bord ou son propre corps. J'avais ce jeu sur mon vieux téléphone portable Nokia, et c'était le meilleur passe-temps après une longue semaine de travail en attendant le ferry de l'Elbe.
J'ai collé les quatre modules d'affichage matriciel à LED avec du ruban adhésif, comme je l'ai fait pour le grand affichage de l'horloge. Pour le premier test, j'ai relié quatre boutons de la carte enfichable à la terre et les ai branchés sur les broches utilisées dans le sketch. Il contrôle la tête avide du serpent et le jeu ne démarre également que lorsqu'un bouton est pressé pour la première fois.
Les alimentations pour les écrans sont 5V et GND, au début la prise 5V sur le micro contrôleur avec ATMEGA 328P est suffisante, mais plus les LEDs s'allument, plus la consommation d'énergie devient élevée, et vous devez envisager une alimentation externe, qui peut également alimenter le MCU.
Matériel utilisé :
1 |
||
4 |
Max7219 8x32 4 en 1 module d'affichage de la matrice de points de point 1 |
|
1 |
Optionnel: PS2 Joystick Shield Jeu Pad Clavier V2.0 |
|
1 |
Optionnel: Module de joystick KY-023 |
|
1 |
||
Breadboard, Bouton et Câble (fil de cavalier) |
En ce qui concerne les lignes de données pour les écrans, il est important de noter que la bibliothèque de programmes "LedControl.h" d'Eberhard Fahle utilisée dans le sketch ne peut contrôler que 8 écrans connectés en série. Étant donné que chaque module matriciel se compose déjà de quatre écrans individuels, seuls deux modules à la fois peuvent être connectés par "daisy chain" et les deux blocs sont instanciés séparément.
// par Eberhard FAHLE peut être trouvé dans l'administrateur de la bibliothèque; Mais ne peut conduire que 8 écrans.
octet Nombre_DISPLAYS = 8;
LEDControl Block_1 = LEDControl(12, 11, 10, Nombre_DISPLAYS); // din; CLK; Cs; 12-11-10
LEDControl block_2 = LEDControl(9, 8, 7, Nombre_DISPLAYS); // din; CLK; Cs; 9-8-7
L'affectation des broches pour les deux lignes de données (respectivement DIN, CLK et CS) résulte du croquis ou du schéma de circuit suivant :
Le haut-parleur optionnel est un haut-parleur piézoélectrique. Comme il a une impédance très élevée, il peut être connecté directement. Il se peut que d'autres haut-parleurs doivent être connectés avec une résistance en série.
Encore une fois, les règles simples du jeu : Le but du jeu est de diriger un serpent à travers le terrain de jeu et d'obtenir des points qu'il mange. Chaque fois qu'il le fait, il allonge d'un membre. Cependant, il ne doit pas dépasser le bord ou se frapper lui-même. Ce qui est assez facile au début devient de plus en plus difficile à mesure que le serpent s'allonge.
Au début, seul le point de départ est visible. Si vous appuyez sur l'une des touches de direction, la première destination apparaît et le serpent commence à se déplacer.
Si le serpent touche le bord ou lui-même, le jeu s'arrête. Le serpent se dissout maillon par maillon. Ensuite, la longueur du serpent est affichée pendant quelques secondes et le jeu est relancé.
Si le jeu est trop rapide ou trop lent pour vous, vous pouvez modifier la vitesse dans la ligne 137.
// vitesse du programme
retard(200);
Mon problème, lorsque je jouais, était parfois que les boutons-poussoirs bon marché de
la carte enfichable n'acceptaient pas toujours la commande de direction et je perdais alors. Bien sûr, cela peut aussi être dû à la ligne delay(200) ; ici, le programme s'arrête pendant 200 ms et n'accepte aucune autre entrée. Je devais donc d'abord me procurer de meilleurs boutons, par exemple ceux du bouclier de joystick que j'avais déjà utilisés pour d'autres projets (actuellement disponibles uniquement dans la boutique AZ-Delivery sur Amazon). Et deuxièmement, un changement de programme pour que le temps d'attente ne conduise pas à un blocage (non-blocage). Le sketch BlinkWithoutDelay en est un exemple.
Les sockets de la partie supérieure de l'afficheur (DIN=D12, CLK=D11, CS=D10) peuvent être lus sur le shield, de même que DIN=D9 de la partie inférieure de l'afficheur. Il reste alors une prise libre (3V3). CLK est ensuite connecté à KEY (derrière, c'est D8) et CS est connecté à la prise suivante, non étiquetée (=D7). Les boutons A à D sont câblés, mais ils sont positionnés légèrement différemment que dans la configuration de M. Küster. Sans plus attendre, apportez quelques modifications à l'esquisse de la ligne 60 :
octet La gauche = 5; octet au dessous de = 4; octet au dessus = 2; octet droite = 3; // port pour la requête clé
Heureusement, ce sont presque les mêmes broches, mais dans un ordre différent ; il n'y a donc aucun conflit avec l'affichage. Cependant, le haut-parleur piézo optionnel doit alors être connecté à la broche 6.
Comme les points lumineux étaient un peu trop lumineux pour moi, j'ai réglé l'intensité à 1 dans les lignes 73 et 76 :
Block_1.Seintensité(zw1, 1);
block_2.Seintensité(zw1, 1);
D'autres modifications ont été nécessaires pour le remplacement du delay(200) ; par un if-query pour savoir si 200ms se sont écoulés depuis la dernière entrée. Pour cela, nous avons besoin au départ :
longue int PrécédentMillis = 0;
longue int intervalle = 200;
avant la boucle cruciale do while :
PrécédentMillis = millis();
et ensuite
SI (millis() - PrécédentMillis >= intervalle) {
étape();
PrécédentMillis = millis();
}
Ce n'était pas la fin de mes réflexions, car le jeu devait aussi être jouable avec le module joystick.
Pour cela, il faut cependant modifier le croquis, car les potentiomètres intégrés délivrent aux entrées analogiques A0 et A1 des valeurs comprises entre 0 et 1023, en position médiane environ 511 chacun.
Au début de la fonction void loop(), il y a deux boucles do while pour la demande des boutons, une fois pour démarrer le jeu et une fois pour la durée du jeu. Les deux doivent être modifiés comme suit :
// fait tout en broyant
faire {
// requête des boutons de joystick et définissez la direction
SI (analogique(Août) > 850) {
direction = 1;
}
Autre SI (analogique(A1) > 850) {
direction = 2;
}
Autre SI (analogique(Août) < 150) {
direction = 3;
}
Autre SI (analogique(A1) < 150) {
direction = 4;
}
En fait, j'ai personnellement réussi à marquer le plus de points avec le module joystick. Le joystick sur le bouclier de joystick mentionné ci-dessus utilise également les entrées analogiques A0 et A1. Cependant, les affectations de la direction doivent alors être ajustées.
Voici le téléchargement des croquis pour le joystick analogique et pour le joystick-shield avec joystick et boutons.
Amusez-vous à construire et à jouer.
Avez-vous un projet intéressant dont nous pouvons rendre compte ici ? Écrivez-moi : Albrecht[at]AZ-Delivery.com