Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

ATtiny85 Mini Arcade:Snake

Componenten en benodigdheden

Microchip-technologie ATtiny85
× 1
Grafische OLED, 128 x 64
× 1
SparkFun microB USB Breakout
× 1
Arduino Nano R3
× 1

Benodigde gereedschappen en machines

Soldeerbout (algemeen)
3D-printer (algemeen)

Apps en online services

Autodesk Fusion 360
Arduino IDE

Over dit project

Inspiratie en vorig project

In december 2017 heb ik een handheld Arduino Pong-console gemaakt die een Arduino Nano- en OLED-scherm gebruikte, samen met twee knoppen.

Dit was destijds prima, maar de console was een beetje te groot en omslachtig. Onlangs heb ik echter geprobeerd enkele van mijn eerdere projecten opnieuw te maken. Deze keer wilde ik een heel kleine console maken waarop mensen snake kunnen spelen.

De gekozen componenten

Om de console klein te maken, kon ik geen Arduino-ontwikkelbord gebruiken, daarom koos ik voor een ATtiny85.

Het beschikt over voldoende I/O om het spel uit te voeren, inclusief twee ADC-pinnen en een I2C-poort en een GPIO-pin. Ik heb ervoor gekozen om een ​​eenvoudige 2-assige joystick/switch-module te gebruiken, omdat deze gemakkelijk te gebruiken is en slechts 3 pinnen nodig heeft voor signalering.

Eindelijk was het tijd om te beslissen welk display nodig was. Omdat het 128 x 64 OLED-scherm van DFRobot een klein formaat heeft maar veel resolutie, ging ik ermee akkoord.

Een systeem solderen

Om te beginnen heb ik een ATtiny85 op een SOP-8 naar DIP-8 breakout-PCB bevestigd en deze op een klein stukje perf-board gesoldeerd. Vervolgens heb ik op twee headers gesoldeerd - een voor programmeren en de andere voor het scherm. Nadat ik dat had gedaan, heb ik de pinnen van de analoge joystick op het perf-board aangesloten en dienovereenkomstig bedraad. Voor de laatste stap heb ik een micro-USB-breakoutboard aangesloten op de rest van het systeem voor stroomvoorziening.

Een behuizing ontwerpen

De behuizing is ontworpen in Fusion 360. Ik begon met het maken en indelen van de componenten die ik in de eigenlijke build heb gebruikt, waarna ik er een behuizing omheen maakte.

Ik wilde een arcadedoos uit de jaren 80 nabootsen, maar toch een heel klein formaat behouden. Hieronder staan ​​enkele renders van de behuizing:

Het spel programmeren

Snake is een vrij eenvoudig spel om te programmeren. Ik heb een maximale slanglengte van 30 ingesteld om RAM te besparen, wat betekent dat zodra de slang 29 pixels heeft gegeten, de speler wint. Om de segmenten van de slang bij te houden, heb ik een tweedimensionale array gemaakt waarin de geordende paren voor elk segment worden opgeslagen.

Telkens wanneer het hoofd naar een nieuwe locatie beweegt, worden de vorige posities naar beneden gecascadeerd. Elke keer dat een segment wordt geconsumeerd, wordt er op een willekeurig punt een nieuw segment voortgebracht. Collision-checking wordt gedaan door de coördinaten van elk segment te doorlopen en te kijken of de coördinaten van de kop hetzelfde zijn. Bovendien zorgt het raken van de slang langs een van de muren ervoor dat de speler ook verliest.

Slang spelen

Ik begon door de console aan te zetten en te wachten tot het scherm het eten en het eerste segment van de slang laadde. Daarna bestuurde ik de slang eenvoudig door de joystick in de juiste richting te bewegen terwijl ik toekeek hoe hij het voedsel opeet. Deze game is leuk om te spelen en is een geweldige vervelingmoordenaar in een klein pakketje.

Code

  • ATTiny85-code
ATTiny85-codeC/C++
Zorg ervoor dat u eerst U8g2lib installeert
//#include #include U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g(U8G2_R0,/* clock=/ 2, / data=/ 0, / reset_*/ U8NONE);#define MAX_LENGTH 30 //30 segmenten max#define X 0#define Y 1#define JOYSTICK_X 2#define JOYSTICK_Y 3#define DIR_THRESH 300 //Waarden moeten 0-300 of 723-1023 zijn om te tellen8_t segmentPositions[MAX_LENGTH][ 2];uint8_t headPosition[2] ={63, 31}; //Plaats de slang in het begin van startuint8_t foodPosition[2]; //Waar het voedsel zich bevindt uint8_t tempPosition0[2]; // Bewaar positie van vorig segment om door te geven aan nextuint8_t tempPosition1[2]; // Bewaar positie van vorig segment om door te geven aan nextint segmentLength =1; void gameUpdate (); enum RICHTINGEN {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();}void loop() { u8g.firstPage(); doe { gameUpdate(); u8g.setColorIndex(1); } while(u8g.nextPage());}void beginGame(){ currentDirection =RECHTS; spawnFood(); delay(1000);}bool checkCollisions(){ for(int i=1; i=128) retourneer 1; else if(headPosition[Y] <=0 || headPosition[Y]>=64) return 1; return false;}void spawnFood(){ int randomX =random(5, 123); int willekeurigY =willekeurig (5, 60); foodPosition[X] =willekeurigX; foodPosition[Y] =randomY;}void checkFoodEaten(){ if(headPosition[X] ==foodPosition[X] || headPosition[Y] ==foodPosition[Y]){ segmentLength +=1; spawnFood(); }}nietig updateDirection(){ int joy_x_val =analogRead(JOYSTICK_X); int joy_y_val =analogRead (JOYSTICK_Y); if(joy_x_val <=DIR_THRESH) currentDirection =LINKS; anders if (joy_x_val>=1023-DIR_THRESH) currentDirection =RECHTS; anders if (joy_y_val <=DIR_THRESH) currentDirection =OMHOOG; 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; hoofdPositie [0] =63; hoofdPositie [1] =31; beginGame();}

Aangepaste onderdelen en behuizingen

Schema's


Productieproces

  1. TinyML-taaldetector-gebaseerd op Edge Impulse &Arduino
  2. Arduino-gyroscoopspel met MPU-6050
  3. Arduino digitale dobbelstenen
  4. DIY 37 LED Roulette Game
  5. Draagbare afstandsdetector
  6. Arduino Audio Reactive Desk Light
  7. galvaniseren met koper
  8. NeoMatrix Arduino Pong
  9. Light Sequence Creator
  10. Slimme stekker
  11. Arduino-gebaseerd beveiligingssysteem