1-2 hours

Atrapa a Makey Robot Videojuego

1-2 hours

Ages 11+

¿Qué vas a hacer?

Crearemos un videojuego con Wio terminal, donde tendrás que atrapar la mayor cantidad de Makey Robots que puedas, y cuidado por que es un robot muy veloz.

¿Qué aprenderás?

Programaremos la interacción utilizando el IMU (Unidad de medición inercial) para movernos dentro del juego, al igual que programaremos niveles de dificultad y un medidor para la puntuación.

Coge tus materiales... ¡empecemos!

Paso 1

Para iniciar a programar, abriremos el Arduino IDE, vamos a preferencias a Additional Boards Manager URLs y pegamos:

https://files.seeedstudio.com/arduino/package_seeeduino_boards_index.json

Paso 2

Seleccionamos Herramientas > Tablero > Administrador de tableros, aquí buscaremos Wio Terminal y lo descargamos.Selecciona la entrada en el menú, Herramientas > Tablero. Selección de la Wio Terminal.

Paso 3

Ahora agrega las librerías Sketch > Include Library > Manage Libraries, agregamos “LIS3DHTR”. Para descargar la otra librería vamos a Seeed_Arduino_LCD y la agregamos vamos a Sketch > Include Library > Add ZIP Library.

Paso 4

Abajo de la lupa (Monitor Serial), tenemos un boton y seleccionamos “New Tab”, lo nombraremos “Free_Fonts.h”, dentro de el pegamos el contenido a continuacion: https://raw.githubusercontent.com/Diego-Luna/Maker-Camp-2022/main/Atrapa_a_makey/Free_Fonts.h

Esto para poder tener un mejor control de las fuentes, para nuestra pantalla.

wio step 4

¡Comencemos a codificar!

Paso 5

Es momento de programar, en la parte superior vamos a traer nuestras librerías y crearemos una nueva clase para usarlas:

 

#include”LIS3DHTR.h”

#include”TFT_eSPI.h”

#include”Free_Fonts.h”

 

LIS3DHTR<TwoWire> lis;

TFT_eSPI tft;

wio step 5

Paso 6

Vamos a crear las variables que nos ayudarán con nuestro giroscopio, posición de Makey, tiempos y nivel, Crearemos una cadena de caracteres donde almacenaremos el nivel. Tendremos otras dos variables para los colores principales del juego:

 

float x_values, y_values, z_values;

bool isOnTarget = false;

int MAKEYpos = 0;

unsigned long lastChangeTime = 0;

int MAKEYwaitTime = 0;

int level = 0;

char cadena_1[10];

uint32_t color_1 = TFT_RED;

uint32_t color_2 = 0xD85C5D;

int operation_x = 0;

int operation_y = 0;

Paso 7

Vamos a trabajar en el “void setup” .Iniciaremos la comunicación serial y de nuestro giro sensorial.

Dato importante: Solo se ejecuta una vez cuando encendemos el dispositivo.

 

void setup() {

  Serial.begin(115200);

  lis.begin(Wire1);

}

 

Comprobamos que el Girosensor está funcionando y lo preparamos para usar:

 

  if (!lis) {

    Serial.println(“ERROR”);

    while (1);

  }

  lis.setOutputDataRate(LIS3DHTR_DATARATE_25HZ); //Data output rate

  lis.setFullScaleRange(LIS3DHTR_RANGE_2G); //Scale range set to 2g

 

Preparamos nuestra pantalla tft, iniciamos su comunicación, cambiamos la rotación y la ponemos en blanco:

 

  tft.begin();

  tft.setRotation(3);

  tft.fillScreen(TFT_WHITE);

 

Es momento de declarar que vamos a hacer en los pines buzzer, los botones, led.

Dato importante: En el “pinMode”, especificamos si es un pin de entrada o salida. Nuestra wio terminal ya los tiene integrados y para llamarlo usamos su nombre, por ejemplo “WIO_5S_PRESS” y le especificamos que nos dará un valor con “INPUT_PULLUP”.

 

  pinMode(WIO_5S_PRESS, INPUT_PULLUP);

  pinMode(WIO_KEY_A, INPUT_PULLUP);

  pinMode(WIO_KEY_B, INPUT_PULLUP);

  pinMode(WIO_KEY_C, INPUT_PULLUP);

  pinMode(WIO_BUZZER, OUTPUT);

  pinMode(LED_BUILTIN, OUTPUT);

 

Y para terminar con el “void setup” apagamos nuestro led integrado y llamamos a nuestra función “restar”.

 

  digitalWrite(LED_BUILTIN, LOW);

 

  restar();

}

Paso 8

Crearemos la función “restart”, para reiniciar información en pantalla como el nombre y su sección

 

void restar()

{

  tft.fillScreen(TFT_WHITE);

  tft.fillRect( 0, 0, 320, 60, color_1);

  tft.setTextColor(TFT_WHITE);

  tft.setFreeFont(FF23);

  tft.drawString(“Maker Camp”, 10, 15);

}

Paso 9

Vamos a crear el “Void Loop”, donde nos moveremos entre el menú y el juego.

Dato importante: Dentro de “void loop”  programaremos la lógica del juego, esto se ejecutará siempre que nuestro arduino tenga electricidad.

 

void loop() {

  if (MAKEYwaitTime  == 0) {

    menu();

  } else {

    game();

  }

}

Paso 10

Vamos a crear la función “menu”

 

void menu()

{

}

 

Dentro de la función escribimos toda la parte gráfica de la pantalla para seleccionar la  dificultad.

 

  tft.setTextColor(TFT_BLACK);

  tft.setFreeFont(FF22);

  tft.drawString(“Select the level”, 75, 80);

 

  tft.setFreeFont(FF21);

  tft.drawString(“Easy”, 40, 130);

  tft.drawString(“Normal”, 130, 130);

  tft.drawString(“Hard”, 240, 130);

 

  tft.drawString(“C”, 55, 170);

  tft.drawString(“Button”, 30, 190);

  tft.drawRect( 20, 160, 80, 60, TFT_BLACK);

 

  tft.drawString(“B”, 155, 170);

  tft.drawString(“Button”, 130, 190);

  tft.drawRect( 120, 160, 80, 60, TFT_BLACK);

 

  tft.drawString(“A”, 260, 170);

  tft.drawString(“Button”, 235, 190);

  tft.drawRect( 225, 160, 80, 60, TFT_BLACK);

 

Vamos a colocar las dificultades.

 

if (digitalRead(WIO_KEY_A) == LOW) {

    Serial.println(“A Key pressed”);

    onButton(260, 170, “A”);

    MAKEYwaitTime = 1000;

    delay(2000);

    restar();

  }

 else if (digitalRead(WIO_KEY_B) == LOW) {

    Serial.println(“B Key pressed”);

    onButton(155, 170, “B”);

    MAKEYwaitTime = 2000;

    delay(2000);

    restar();

  }

  else if (digitalRead(WIO_KEY_C) == LOW) {

    Serial.println(“C Key pressed”);

    onButton(55, 170, “C”);

    MAKEYwaitTime = 4000;

    delay(2000);

    restar();

  }

Paso 11

Ahora crearemos la funcion “onButton”:

 

void  onButton(int x, int y, char *b)

{

  tft.fillRect( x – 35, y – 10, 80, 60, color_2);

  tft.drawString(b, x, y);

  tft.drawString(“Button”, x – 25, y + 20);

}

Paso 12

Ahora programaremos el videojuego, vamos a la parte inferior de nuestro código y creamos nuestra función:

 

void game()

{

}

 

Colocamos lo siguiente dentro de la función:

Dato importante: La función “tft.drawString” solo acepta cadena de caracteres, y para transformar a carácter usamos la función “sprintf” que viene por default en el lenguaje c, y los paso a “level” para ponerlo en pantalla.

 

  tft.setTextColor(TFT_WHITE);

  tft.setFreeFont(FF21);

 

  tft.fillRect( 240, 10, 75, 17, color_1);

  sprintf(cadena_1, “%d”, level);

 

  tft.drawString(cadena_1, 270, 12);

  tft.drawString(“Points”, 250, 32);

 

Guardamos los valores de nuestro giroscopio:

 

x_values = lis.getAccelerationX();

y_values = lis.getAccelerationY();

 

Ponemos una condición para cuando no hemos encontrado a Mackay en un tiempo predeterminado, reiniciemos el juego

 

if (lastChangeTime + MAKEYwaitTime < millis()) {

    generateRandomMAKEY();

    level = 0;

}



Colocamos dos condiciones, si apretamos el botón, estando en la misma posición que Makey ganamos un punto, y si no es así reiniciamos el juego.

 drawHoles();

if (digitalRead(WIO_5S_PRESS) == LOW) {

    if (isOnTarget) {

      Serial.println(“Hit!”);

      digitalWrite(LED_BUILTIN, HIGH);

      analogWrite(WIO_BUZZER, 128);

      delay(300);

      digitalWrite(LED_BUILTIN, LOW);

      analogWrite(WIO_BUZZER, 0);

      level++;

    }

  }

 

  if (digitalRead(WIO_5S_PRESS) == LOW) {

    if (isOnTarget) {

      Serial.println(“Hit!”);

      digitalWrite(LED_BUILTIN, HIGH);

      analogWrite(WIO_BUZZER, 128);

      delay(300);

      digitalWrite(LED_BUILTIN, LOW);

      analogWrite(WIO_BUZZER, 0);

      level++;

    } else {

      Serial.println(“Miss!”);

      level = 0;

      delay(300);

    }

    generateRandomMAKEY();

  }

Paso 13

Vamos a crear la función “generateRandomMAKEY”, vamos al final del código y colocamos:

Dato importante: Usamos la Función “random”, para que nos de un número del 0 – 8, siendo un total de 9 posiciones, donde está Makey en la tabla.

 

void generateRandomMAKEY() {

  MAKEYpos = random(0, 9);

  lastChangeTime = millis();

}

Paso 14

Es momento de crear la función “drawHoles”. Vamos al final de nuestro código y colocamos:

 

void drawHoles() {

  for (int i = -1; i <= 1; i++) {

    for (int j = -1; j <= 1; j++) {

      bool isShaded = (((int)(y_values * -5) + operation_y) == i) && (((int)(x_values * 5) – operation_x) == j);

 

      calibrate_game();

 

      int index = (i + 1) + (j + 1) * 3;

      tft.fillRect(111 + i * 108, 125 + j * 60, 100, 52,  isShaded ? color_2 : TFT_DARKGREY);

 

      if (index == MAKEYpos) {

        isOnTarget = isShaded;

        if (isShaded == false) {

          drawMAKEY(111 + i * 108, 125 + j * 60);

        }

      }

 

    }

  }

}

Paso 15

La función de Calibración, que tomará la poción del giroscopio y lo usa de referencia para la función “drawHoles”.

 

void calibrate_game() {

  if (digitalRead(WIO_KEY_C) == LOW) {

    Serial.println(“C Key pressed”);

    operation_x = -((int)(x_values * -5));

    operation_y = -((int)(y_values * -5));

  }

}

Paso 16

La última función es “drawMAKEY”, que nos ayudará a dibujar lo dependiendo la posición en X y Y.

Dato importante: Es muy importante especificar el tipo de dato por ejemplo un número, carácter, etc.

 

void drawMAKEY(int x, int y) {

  tft.fillRect(x, y, 100, 52, TFT_RED);

  tft.fillCircle(x + 50, y + 26, 20, TFT_WHITE);

  tft.setTextColor(TFT_RED);

  tft.setFreeFont(FF22);

  tft.drawString(“M”, x + 40, y + 17);

  tft.fillRect(x, y + 26 – 4, 30, 8, TFT_WHITE);

  tft.fillRect(x + 60, y + 26 – 4, 40, 8, TFT_WHITE);

}

Let's test our code!

Paso 17

Por último vamos a conectar nuestra Wio Terminal a nuestra computadora, Vamos a seleccionar nuestra placa Tools > Board > Seeed samd > Wio Terminal. Después vamos a  Tools > Port y seleccionamos nuestra Wio Terminal y subimos nuestro código.

En unos segundos vamos a poder ver nuestro menú en la pantalla de la Wio terminal y es momento de jugar.

Proyecto terminado

wio finished project

Recursos

Encuentre el código completo en Github

¿Qué está pasando aquí?

funciones, variables, botones

Estamos usando los componentes de nuestra Wio terminal para crear un divertido videojuego. Programando funciones, variables, utilizando IMU, botones, la pantalla tft, entre otras cosas más con la Wio Terminal, creamos la lógica de un video juego refrescando la pantalla con nueva información.

¿Qué es lo siguiente?

Ahora experimenta agregando nuevos elementos para personalizar tu videojuego, cambia los colores de Makey Robot o incluye tu inicial, cambia los niveles de dificultad y agrega una nueva sección para guardar los puntos más altos.

Entonces prueba estos proyectos...

MoonMakers_SmartFarm_Featured
Smart Farm with Wio Terminal by MoonMakers
artificial nose by ben cabé
Artificial Nose by Benjamin Cabé

Acerca de MoonMakers

MoonMakers — lideradas por Camila and Diego Luna — somos una comunidad de creadores apasionados por el conocimiento. Un Makerspace, un espacio abierto con diferentes máquinas de fabricación digital. Y un canal de YouTube donde promovemos la ciencia, la tecnología y el movimiento maker.

MoonMakers ha colaborado con empresas como: Sesame Street, Make Community y en México con Televisión Educativa y Fundación Televisa, creando contenido educativo.

Hemos imparto talleres por la República Mexicana con: Talent Land, Secretaría de educación en Jalisco, Conacyt, Centro Cultural España.

MoonMakers

Materials: 

  • Wio Terminal
  • Cable usbc a usb

Escape to an island of imagination + innovation as Maker Faire Bay Area returns for its 16th iteration!

Prices Increase in....

Days
Hours
Minutes
Seconds
FEEDBACK