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

Mini arcade ATtiny85 :Serpent

Composants et fournitures

Microchip Technology ATtiny85
× 1
Graphique OLED, 128 x 64
× 1
SparkFun microB USB Breakout
× 1
Arduino Nano R3
× 1

Outils et machines nécessaires

Fer à souder (générique)
Imprimante 3D (générique)

Applications et services en ligne

Autodesk Fusion 360
Arduino IDE

À propos de ce projet

Inspiration et projet passé

En décembre 2017, j'ai créé une console Arduino Pong portable qui utilisait un écran Arduino Nano et OLED, ainsi que deux boutons.

C'était bien à l'époque, mais la console était un peu trop grande et encombrante. Récemment, cependant, j'ai essayé de recréer certains de mes projets passés. Cette fois, je voulais faire une toute petite console sur laquelle les gens peuvent jouer au serpent.

Les composants choisis

Pour rendre la console petite, je ne pouvais utiliser aucune carte de développement Arduino, c'est pourquoi j'ai opté pour un ATtiny85.

Il dispose de suffisamment d'E/S pour exécuter le jeu, y compris deux broches ADC et un port I2C et une broche GPIO. J'ai choisi d'utiliser un simple module joystick/commutateur à 2 axes, car il est facile à interfacer et n'a besoin que de 3 broches pour la signalisation.

Enfin, il était temps de décider quel écran était nécessaire. Étant donné que l'écran OLED 128 x 64 de DFRobot a une petite taille mais une bonne résolution, je l'ai choisi.

Souder un système

Pour commencer, j'ai attaché un ATtiny85 à un PCB de dérivation SOP-8 à DIP-8 et je l'ai soudé à un petit morceau de carte perforée. Ensuite, j'ai soudé deux en-têtes, un pour la programmation et l'autre pour l'écran. Après avoir fait cela, j'ai connecté les broches du joystick analogique à la carte de perf et l'ai câblé en conséquence. Pour la dernière étape, j'ai câblé une carte de dérivation micro USB au reste du système pour l'alimentation.

Concevoir une enceinte

Le boîtier a été conçu dans Fusion 360. J'ai commencé par créer et disposer les composants que j'ai utilisés dans la construction réelle, puis j'ai créé un boîtier autour d'eux.

Je voulais imiter une borne d'arcade des années 80, tout en conservant une très petite taille. Voici quelques rendus de l'enceinte :

Programmation du jeu

Snake est un jeu assez simple à programmer. J'ai défini une longueur de serpent maximale de 30 pour économiser sur la RAM, ce qui signifie qu'une fois que le serpent a mangé 29 pixels, le joueur gagne. Pour garder une trace des segments du serpent, j'ai créé un tableau à 2 dimensions qui stocke des paires ordonnées pour chaque segment.

Chaque fois que la tête se déplace vers un nouvel emplacement, ses positions précédentes se répercutent vers le bas. Chaque fois qu'un segment est consommé, un nouveau est généré à un moment aléatoire. La vérification des collisions est effectuée en itérant les coordonnées de chaque segment et en vérifiant si les coordonnées de la tête sont les mêmes. De plus, frapper le serpent le long de l'un des murs fera également perdre au joueur.

Jouer au serpent

J'ai commencé par allumer la console et attendre que l'écran charge la nourriture et le premier segment du serpent. Ensuite, j'ai simplement piloté le serpent en déplaçant le joystick dans la bonne direction tout en le regardant manger la nourriture. Ce jeu est amusant à jouer et est un excellent tueur d'ennui dans un petit paquet.

Code

  • Code ATTiny85
Code ATTiny85C/C++
Assurez-vous d'installer U8g2lib d'abord
//#include #include U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g(U8G2_R0,/* clock=/ 2, / data=/ 0, / reset_)/ IN_N8X8;#define MAX_LENGTH 30 //30 segments max#define X 0#define Y 1#define JOYSTICK_X 2#define JOYSTICK_Y 3#define DIR_THRESH 300 //Les valeurs doivent être soit 0-300, soit 723-1023 pour compter les positions de segment8_t[MAX_LENGTH][ 2];uint8_t headPosition[2] ={63, 31}; //Placez le serpent au début de startuint8_t foodPosition[2]; //Où se trouve la nourritureuint8_t tempPosition0[2]; //Stocker la position du segment précédent à transmettre à nextuint8_t tempPosition1[2]; //Stocker la position du segment précédent à transmettre au suivantint segmentLength =1;void gameUpdate();enum DIRECTIONS { RIGHT, DOWN, LEFT, UP} currentDirection;void setup() { //TinyWireM.begin(); u8g.begin(); u8g.setPowerSave(0) ; pinMode(JOYSTICK_X, INPUT); pinMode(JOYSTICK_Y, INPUT); randomSeed(analogRead(0)); beginGame();}boucle vide() { u8g.firstPage(); faire { gameUpdate(); u8g.setColorIndex(1) ; } while(u8g.nextPage());}void beginGame(){ currentDirection =RIGHT; spawnNourriture(); delay(1000);}bool checkCollisions(){ for(int i=1; i=128) return 1; else if(headPosition[Y] <=0 || headPosition[Y]>=64) return 1; return false;}void spawnFood(){ int randomX =random(5, 123); int randomY =random(5, 60); foodPosition[X] =randomX; foodPosition[Y] =randomY;}void checkFoodEaten(){ if(headPosition[X] ==foodPosition[X] || headPosition[Y] ==foodPosition[Y]){ segmentLength +=1; spawnNourriture(); }}void updateDirection(){ int joy_x_val =analogRead(JOYSTICK_X); int joy_y_val =analogRead(JOYSTICK_Y); if(joy_x_val <=DIR_THRESH) currentDirection =LEFT ; else if(joy_x_val>=1023-DIR_THRESH) currentDirection =RIGHT ; else if(joy_y_val <=DIR_THRESH) currentDirection =UP; else if(joy_y_val>=1023-DIR_THRESH) currentDirection =DOWN;}void displaySegments(){ for(int segment=0; segment =MAX_LENGTH) endGame(); delay(50);}void endGame(){ segmentLength =1; headPosition[0] =63 ; headPosition[1] =31 ; beginGame();}

Pièces et boîtiers personnalisés

Schémas


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. Détecteur de portée portable
  6. Lampe de bureau réactive audio Arduino
  7. La galvanoplastie avec du cuivre
  8. NeoMatrix Arduino Pong
  9. Créateur de séquences lumineuses