Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

ATtiny85 Mini Arcade:Serpiente

Componentes y suministros

Tecnología de microchip ATtiny85
× 1
OLED gráfico, 128 x 64
× 1
SparkFun microB USB Breakout
× 1
Arduino Nano R3
× 1

Herramientas y máquinas necesarias

Soldador (genérico)
Impresora 3D (genérica)

Aplicaciones y servicios en línea

Autodesk Fusion 360
Arduino IDE

Acerca de este proyecto

Inspiración y proyecto pasado

En diciembre de 2017, creé una consola portátil Arduino Pong que usaba una pantalla Arduino Nano y OLED, junto con dos botones.

Esto estaba bien en ese momento, pero la consola era demasiado grande y engorrosa. Sin embargo, recientemente he intentado recrear algunos de mis proyectos anteriores. Esta vez, quería hacer una consola muy pequeña en la que la gente pudiera jugar a la serpiente.

Los componentes elegidos

Para hacer la consola pequeña, no pude usar ninguna placa de desarrollo Arduino, por eso elegí un ATtiny85.

Cuenta con suficiente E / S para ejecutar el juego, incluidos dos pines ADC y un puerto I2C y un pin GPIO. Opté por usar un módulo de joystick / interruptor simple de 2 ejes, ya que es fácil de conectar y solo necesita 3 pines para la señalización.

Finalmente, llegó el momento de decidir qué pantalla se necesitaba. Dado que la pantalla OLED de 128 x 64 de DFRobot tiene un tamaño pequeño pero mucha resolución, lo elegí.

Soldar un sistema

Para comenzar, conecté un ATtiny85 a un PCB de ruptura SOP-8 a DIP-8 y lo soldé a una pequeña pieza de placa perforada. A continuación, soldé dos encabezados, uno para la programación y el otro para la pantalla. Después de hacer eso, conecté los pines del joystick analógico a la placa de perforación y lo cableé en consecuencia. Para el paso final, conecté una placa de conexión micro USB al resto del sistema para obtener energía.

Diseño de un recinto

El gabinete fue diseñado en Fusion 360. Comencé creando y diseñando los componentes que usé en la construcción real, luego creé un gabinete alrededor de ellos.

Quería imitar una caja de juegos de los años 80, pero aún así mantener un tamaño muy pequeño. A continuación se muestran algunas versiones del recinto:

Programando el juego

Snake es un juego bastante fácil de programar. Establecí una longitud máxima de serpiente de 30 para ahorrar en RAM, lo que significa que una vez que la serpiente se ha comido 29 píxeles, el jugador gana. Para realizar un seguimiento de los segmentos de la serpiente, creé una matriz bidimensional que almacena pares ordenados para cada segmento.

Siempre que la cabeza se mueve a una nueva ubicación, sus posiciones anteriores se despliegan en cascada hacia abajo. Cada vez que se consume un segmento, se genera uno nuevo en un punto aleatorio. La verificación de colisiones se realiza iterando a través de las coordenadas de cada segmento y viendo si las coordenadas de la cabeza son las mismas. Además, golpear a la serpiente a lo largo de cualquiera de las paredes hará que el jugador también pierda.

Jugando Snake

Comencé encendiendo la consola y esperando a que la pantalla cargara la comida y el primer segmento de la serpiente. Luego simplemente piloteé la serpiente moviendo el joystick en la dirección correcta mientras la veía comer la comida. Este juego es divertido de jugar y es un gran asesino del aburrimiento en un paquete pequeño.

Código

  • Código ATTiny85
Código ATTiny85 C / C ++
Asegúrese de instalar U8g2lib primero
 // # include  #include  U8G2_SSD1306_128X64_NONAME_1_SW_I2C u8g (U8G2_R0, / * clock =/ 2, / data =/ 0, / reset); #define MAX_LENGTH 30 // 30 segmentos max # define X 0 # define Y 1 # define JOYSTICK_X 2 # define JOYSTICK_Y 3 # define DIR_THRESH 300 // Los valores deben ser 0-300 o 723-1023 para countuint8_t segmentoPositions [MAX_LENGTH] [ 2]; uint8_t headPosition [2] ={63, 31}; // Coloca la serpiente al principio de startuint8_t foodPosition [2]; // Dónde se encuentra la comida uint8_t tempPosition0 [2]; // Almacena la posición del segmento anterior para pasar a nextuint8_t tempPosition1 [2]; // Almacenar la posición del segmento anterior para pasar al siguiente segmentoLength =1; void gameUpdate (); enum DIRECTIONS {DERECHA, ABAJO, IZQUIERDA, ARRIBA} currentDirection; void setup () {//TinyWireM.begin (); u8g.begin (); u8g.setPowerSave (0); pinMode (JOYSTICK_X, ENTRADA); pinMode (JOYSTICK_Y, INPUT); randomSeed (analogRead (0)); beginGame ();} bucle vacío () {u8g.firstPage (); hacer {gameUpdate (); u8g.setColorIndex (1); } while (u8g.nextPage ());} void beginGame () {currentDirection =RIGHT; spawnFood (); delay (1000);} bool checkCollisions () {for (int i =1; i  =128) return 1; else if (headPosition [Y] <=0 || headPosition [Y]> =64) return 1; devuelve falso;} 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]) {segmentoLength + =1; spawnFood (); }} 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 (alegría_y_val <=DIR_THRESH) currentDirection =UP; else if (joy_y_val> =1023-DIR_THRESH) currentDirection =DOWN;} void displaySegments () {for (int segmento =0; segmento  =MAX_LENGTH) endGame (); delay (50);} void endGame () {segmentoLength =1; headPosition [0] =63; headPosition [1] =31; beginGame ();} 

Piezas y carcasas personalizadas

Esquemas


Proceso de manufactura

  1. TinyML-Language Detector basado en Edge Impulse y Arduino
  2. Juego de giroscopio Arduino con MPU-6050
  3. Dados digitales Arduino
  4. Juego de ruleta DIY 37 LED
  5. Detector de alcance portátil
  6. Luz de escritorio reactiva de audio Arduino
  7. Galvanoplastia con cobre
  8. NeoMatrix Arduino Pong
  9. Creador de secuencias de luz
  10. Enchufe inteligente
  11. Sistema de seguridad basado en Arduino