Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Jeu Arduino par écran LCD

Composants et fournitures

Arduino UNO
× 1
Adafruit RGB rétro-éclairé LCD - 16x2
× 1
Planche à pain (générique)
× 1
Résistance 220 ohm
× 1
Interrupteur à bouton-poussoir SparkFun 12mm
× 1
Câbles de raccordement (générique)
× 1
Câble USB-A vers B
× 1

Applications et services en ligne

Arduino IDE

À propos de ce projet

Les pièces nécessaires sont montrées dans l'image ci-dessus. Commencez avec l'Arduino non alimenté. Ne branchez PAS le câble USB. Cela se produira plus tard lorsqu'il sera temps de le programmer et d'essayer le jeu.

Connexions

Utilisez un long fil de raccordement pour connecter le signal 5V sur l'Arduino à l'extrême gauche de la rangée rouge en haut de la planche à pain.

Utilisez un long fil de raccordement pour connecter le signal GND à l'extrême gauche de la rangée noire (ou bleue sur certaines planches à pain) en haut de la planche à pain.

Le module LCD (Liquid Crystal Display) a un en-tête mâle à 16 broches sur la face inférieure. Branchez-le sur la planche à pain comme indiqué sur l'image. Tous les signaux électroniques qui alimentent et contrôlent l'écran LCD passent par cet en-tête.

Ces épingles sont (de gauche à droite) :

  • GND - signal de masse d'alimentation
  • VCC - signal de puissance positif
  • V0 - réglage du contraste
  • RS - enregistrer sélectionner
  • R/W - lecture/écriture sélection
  • E - signal d'activation de l'opération
  • DB0 - bit de données 0 (non utilisé ici)
  • DB1 - bit de données 1 (non utilisé ici)
  • DB2 - bit de données 2 (non utilisé ici)
  • DB3 - bit de données 3 (non utilisé ici)
  • DB4 - bit de données 4
  • DB5 - bit de données 5
  • DB6 - bit de données 6
  • DB7 - bit de données 7
  • LED+ - rétroéclairage LED positif
  • LED- - rétroéclairage LED négatif

À l'aide de fils de raccordement courts, connectez GND et LED- (broches 1 et 16) à la rangée noire en haut.

De même, connectez VCC (broche 2) à la rangée rouge en haut avec un fil de raccordement court.

Pliez les fils conducteurs de la résistance 220 Ω (bandes de couleur rouge-rouge-marron) et connectez-le entre LED+ et la rangée rouge en haut de la planche à pain.

Utilisez des câbles de raccordement plus longs pour effectuer le reste des connexions :

  • Connectez DB7 à la broche 3 d'Arduino
  • Connectez DB6 à la broche 4 d'Arduino
  • Connectez DB5 à la broche 5 de l'Arduino
  • Connectez DB4 à la broche Arduino 6
  • Connectez E à la broche Arduino 9
  • Connectez R/W à la broche Arduino 10 (ou à la rangée noire en haut de la maquette)
  • Connectez RS à la broche Arduino 11
  • Connectez V0 à la broche Arduino 12 (ou à la rangée noire en haut de la planche à pain)

Branchez le bouton-poussoir quelque part à gauche de l'écran LCD, à cheval sur le canal longeant le centre de la maquette (voir l'image ci-dessus). Connectez l'une des deux broches supérieures du bouton à la rangée noire en haut de la planche à pain à l'aide d'un fil de raccordement court. Connectez l'autre broche en haut du bouton à la broche 2 de l'Arduino.

Code

  • LCD_Game.ino
LCD_Game.inoArduino
#include #define PIN_BUTTON 2#define PIN_AUTOPLAY 1#define PIN_READWRITE 10#define PIN_CONTRAST 12#define SPRITE_RUN1 1#define SPRITE_RUN2 2#define SPRITE_JUMP 3#define SPRITE_JUMP'_UPPER '. // Utilisez le '.' caractère pour la tête#define SPRITE_JUMP_LOWER 4#define SPRITE_TERRAIN_EMPTY ' ' // Utilisez le caractère ' '#define SPRITE_TERRAIN_SOLID 5#define SPRITE_TERRAIN_SOLID_RIGHT 6#define SPRITE_TERRAIN_SOLID_SOLID_LEFT 7#define HEROPOSITION_HORIZW TERRAIN_EMPTY 0#define TERRAIN_LOWER_BLOCK 1#define TERRAIN_UPPER_BLOCK 2#define HERO_POSITION_OFF 0 // Le héros est invisible#define HERO_POSITION_RUN_LOWER_1 1 // Le héros court sur la rangée inférieure (pose 1)#define HERO_POSITION_RUN_LOWER_2 2 // (pose 2) /#JUMP HERO_POSITION 3 / Commencer un saut#define HERO_POSITION_JUMP_2 4 // À mi-hauteur#define HERO_POSITION_JUMP_3 5 // Le saut est sur la ligne supérieure#define HERO_POSITION_JUMP_4 6 // Le saut est sur la ligne supérieure#define HERO_POSITION_JUMP_5 7 // Le saut est sur la ligne supérieure#define HERO_POSITION_JUMP_6 8 // Le saut est sur la rangée supérieure#define HERO_POSITION_JUMP_7 9 // À mi-chemin#define HERO_POSITION_JUMP_8 10 // Sur le point d'atterrir#define HERO_POSITION_RUN_UPPER_1 11 // Hero court sur la rangée supérieure (pose 1)#define HERO_POSITION_RUN_UPPER_2 12 // (pose 2)LiquidCrystal lcd(11, 9, 6, 5, 4, 3);static char terrainUpper[TERRAIN_WIDTH + 1];static char terrainLower [TERRAIN_WIDTH + 1];static bool buttonPushed =false;void initializeGraphics(){ static byte graphics[] ={ // Exécuter la position 1 B01100, B01100, B00000, B01110, B11100, B01100, B11010, B10011, // Exécuter la position 2 B01100, B01100, B00000, B01100, B01100, B01100, B01100, B01110, // Sauter B01100, B01100, B00000, B11110, B01101, B11111, B10000, B00000, // Sauter plus bas B11110, B01101, B11111, B10000, B00000, B00000 , B00000, B00000, // Terre B11111, B11111, B11111, B11111, B11111, B11111, B11111, B11111, // Terre droite B00011, B00011, B00011, B00011, B00011, B00011, B00011, B00011, // Terre gauche B11000, B11000, B11000, B11000, B11000, B11000, B11000, B11000, } ; int je; // Ignorer l'utilisation du caractère 0, cela permet à lcd.print() d'être utilisé pour // dessiner rapidement plusieurs caractères pour (i =0; i <7; ++i) { lcd.createChar(i + 1, &graphics[i * 8]); } pour (i =0; i  9999) ? 5 :(score> 999) ? 4 :(score> 99) ? 3 :(note> 9) ? 2 :1 ; // Dessine la scène terrainUpper[TERRAIN_WIDTH] ='\0'; terrainLower[TERRAIN_WIDTH] ='\0'; char temp =terrainUpper[16-chiffres] ; terrainUpper[16-chiffres] ='\0'; lcd.setCursor(0,0); lcd.print(terrainSupérieur); terrainUpper[16-chiffres] =temp; lcd.setCursor(0,1) ; lcd.print(terrainLower); lcd.setCursor (16 - chiffres, 0); lcd.print(score); terrainUpper[HERO_HORIZONTAL_POSITION] =upperSave; terrainLower[HERO_HORIZONTAL_POSITION] =lowerSave; return collision;}// Gérer la pression du bouton comme une interruption buttonPush() { buttonPushed =true;}void setup(){ pinMode(PIN_READWRITE, OUTPUT); digitalWrite(PIN_READWRITE, BAS); pinMode(PIN_CONTRASTE, SORTIE); digitalWrite(PIN_CONTRASTE, FAIBLE); pinMode(PIN_BUTTON, INPUT); digitalWrite(PIN_BUTTON, HAUT); pinMode(PIN_AUTOPLAY, SORTIE); digitalWrite(PIN_AUTOPLAY, HAUT); // La broche numérique 2 mappe pour interrompre 0 attachInterrupt(0/*PIN_BUTTON*/, buttonPush, FALLING); initializeGraphics(); lcd.begin (16, 2);}boucle vide(){ octet statique heroPos =HERO_POSITION_RUN_LOWER_1; octet statique newTerrainType =TERRAIN_EMPTY; octet statique newTerrainDuration =1 ; lecture booléenne statique =faux ; bool statique clignotement =faux ; distance int non signée statique =0 ; if (!playing) { drawHero((clignote) ? HERO_POSITION_OFF :heroPos, terrainUpper, terrainLower, distance>> 3); if (clignote) { lcd.setCursor(0,0); lcd.print("Appuyez sur Démarrer"); } délai (250); clignoter =!cligner; if (boutonPoussé) { initializeGraphics(); heroPos =HERO_POSITION_RUN_LOWER_1 ; jouer =vrai; boutonPoussé =faux ; distance =0 ; } retourner; } // Décale le terrain vers la gauche advanceTerrain(terrainLower, newTerrainType ==TERRAIN_LOWER_BLOCK ? SPRITE_TERRAIN_SOLID :SPRITE_TERRAIN_EMPTY); AdvanceTerrain(terrainUpper, newTerrainType ==TERRAIN_UPPER_BLOCK ? SPRITE_TERRAIN_SOLID :SPRITE_TERRAIN_EMPTY); // Créer un nouveau terrain à saisir à droite if (--newTerrainDuration ==0) { if (newTerrainType ==TERRAIN_EMPTY) { newTerrainType =(random(3) ==0) ? TERRAIN_UPPER_BLOCK :TERRAIN_LOWER_BLOCK ; newTerrainDuration =2 + random(10) ; } else { newTerrainType =TERRAIN_EMPTY; newTerrainDuration =10 + aléatoire(10) ; } } if (buttonPushed) { if (heroPos <=HERO_POSITION_RUN_LOWER_2) heroPos =HERO_POSITION_JUMP_1; boutonPoussé =faux ; } if (drawHero(heroPos, terrainUpper, terrainLower, distance>> 3)) { play =false; // Le héros est entré en collision avec quelque chose. Dommage. } else { if (heroPos ==HERO_POSITION_RUN_LOWER_2 || heroPos ==HERO_POSITION_JUMP_8) { heroPos =HERO_POSITION_RUN_LOWER_1; } else if ((heroPos>=HERO_POSITION_JUMP_3 &&heroPos <=HERO_POSITION_JUMP_5) &&terrainLower[HERO_HORIZONTAL_POSITION] !=SPRITE_TERRAIN_EMPTY) { heroPos =HERO_POSITION_RUN_UPPER_1; } else if (heroPos>=HERO_POSITION_RUN_UPPER_1 &&terrainLower[HERO_HORIZONTAL_POSITION] ==SPRITE_TERRAIN_EMPTY) { heroPos =HERO_POSITION_JUMP_5; } else if (heroPos ==HERO_POSITION_RUN_UPPER_2) { heroPos =HERO_POSITION_RUN_UPPER_1; } else { ++heroPos; } ++distance; digitalWrite(PIN_AUTOPLAY, terrainLower[HERO_HORIZONTAL_POSITION + 2] ==SPRITE_TERRAIN_EMPTY ? HIGH :LOW); } retard (100);}

Schémas

Aucun document.


Processus de fabrication

  1. Détecteur de langage TinyML basé sur Edge Impulse et Arduino
  2. Jeu de gyroscope Arduino avec MPU-6050
  3. Dés numériques Arduino
  4. Jeu de roulette DIY 37 LED
  5. Contrôleur de jeu Arduino
  6. Jeu de manette
  7. Trouvez-moi
  8. Jeu Pixel Chaser
  9. Oscilloscope DIY 10Hz-50kHz sur écran LCD 128x64