Arduino juega a Google Chrome Dinosaur

Este contenido es un complemento práctico para los contenidos teóricos de los temas 4. Fundamentos de Computación Física, 5. Internet de las Cosas y 6. Robótica, de la asignatura Computación y Robótica de 2º y 3º de ESO.

Tabla de contenidos

🛠️ Materiales:

1. Introducción

En este interesante proyecto te propongo que resuelvas el siguiente desafío: quiero que diseñes un circuito y un programa para que Arduino juegue automáticamente -sin intervención humana- al juego Dinosaur de Google Chrome.

¿Sabes ese juego del dinosaurio que aparece cuando Google Chrome no tiene conexión a Internet?

Exacto, ese.

Como ya sabes, lo único que tiene que hacer el jugador es pulsar la barra espaciadora para que el dinosaurio salte y consiga evitar los obstáculos -en forma de cactus o pájaros- que le van llegando.

Nosotros, vamos a intentar automatizar esos dos procesos:

  1. Detectar cuándo viene un obstáculo.
  2. Hacer que el dinosaurio salte para evitarlo.

Te adelanto que ya sabes diseñar y programar el circuito que resuelve este desafío.

Piensa un poco más.

.

.

.

¿Te rindes?

Venga, te lo explico.

2. Detectar obstáculos

Resolver el problema de la detección de obstáculos puede resolverse de muchas maneras, utilizando una amplia variedad de sensores, pero nosotros vamos a optar por usar uno que ya conocemos: la fotorresistencia.

Si lo recuerdas, aquí vimos cómo funcionaba una fotorresistencia, obteníamos un valor analógico en función de la cantidad de luz que le llegaba. Así que, esa propiedad física es la que utilizaremos para saber si viene un obstáculo o no: colocaremos una fotorresistencia sobre la pantalla y detectará más luz cuando el fondo sea blanco -no hay obstáculo-, y menos luz cuando el fondo sea negro -hay un obstáculo-.

¿Qué cantidad de luz vamos a considerar que es blanco y qué cantidad negro?

Dependerá mucho de tu fotorresistencia y de tu pantalla.

La mejor manera de hacer esto es crear un pequeño programa que imprima en el monitor serie qué valor esta leyendo la fotorresistencia, luego la sitúas pegada al monitor con el juego abierto y observas los valores que lee cuando está sobre fondo blanco y sobre fondo negro -al pasar un cactus o un pájaro-.

Yo he creado una variable LUZ para facilitar la lectura del programa.

Con esto ya sabrías cuáles son tus niveles de luz. En mi caso el umbral que usaré será 300. Esto quiere decir que cuando el valor leído por la fotorresistencia sea inferior a 300, estaremos en fondo blanco, y cuando sea superior a 300 estaremos en fondo negro -sobre un obstáculo y tenemos que saltar-:

Bueno, nuestro primer problema está resuelto, sabemos detectar cuándo estamos ante un obstáculo y tenemos que saltar.

3. Saltar

Nos centramos ahora en pensar cómo saltar.

¿Qué mecanismo hemos estudiado, diseñado y programado hasta ahora que nos permite hacer que el personaje salte?

¿Una resistencia? ¿Un potenciómetro? ¿Un LED?

Pues si se trata de pulsar una tecla, el mejor mecanismo que podemos usar es un servomotor. De esta manera, cada vez que necesitemos pulsar la barra espaciadora, moveremos el servomotor una cantidad de grados para que presione la tecla. Luego lo devolveremos a su posición original para que pueda volver a moverse cuando se detecte otro obstáculo.

¿No recuerdas cómo se mueve un servomotor? Aquí aprendimos a usarlos.

Lo que haremos es:

  • Al inicio situar el servomotor a 0º para partir de una posición de referencia.
  • Cada vez que necesitemos saltar, lo moveremos a una posición de 30º -lo suficiente para que sea capaz de pulsar una tecla pero no tanto como para superar el recorrido de la tecla-. Inmediatamente después de moverlo 30º (esperaremos 150ms para asegurarnos de que se ha pulsado la tecla) lo devolveremos a su posición original de 0º.

Por tanto, nuestro programa se completaría así:

Si quieres el código textual, lo tienes aquí:

#include <Servo.h>

// Se crean las variables que necesitará el programa
// LUZ almacena el valor que le da la fotorresistencia (nivel de luz que detecta)
int LUZ = 0;
// miServomotor almacena el valor en grados del ángulo al que quiero mover el servomotor
Servo miServomotor;

void setup() {
  // Configura el servomotor para que recibe señales por el pin 2
  miServomotor.attach(2, 500, 2500);
  // Configura el pin analógico de entrada A5
  pinMode(A5, INPUT);
  // Inicia el monitor serie para ver con qué valores está trabajando el circuito
  Serial.begin(9600);
  // Coloca el servomotor en angulo 0º
  miServomotor.write(0);
  // Espera 250ms para darle tiempo al servomotor a moverse
  delay(250); 
}

void loop() {
  // Guarda el valor (cantidad de luz) que está leyendo la fotorresistencia
  LUZ = analogRead(A5);
  // Lo muestra en el monitor serie para que podamos verlo
  Serial.println(LUZ);
  // Si la cantidad de luz es mayor de 300, es que ha detectado un obstáculo
  if (LUZ > 300) {
    // Mueve 30º el servo para que pulse la tecla
    miServomotor.write(30);
    // Espera para darle tiempo al servo a pulsar la tecla
    delay(150);
    // Devuelve al servo a su posición original de 0º
    miServomotor.write(0);
  }
}

4. Circuito

Hecho todo lo anterior, sólo nos quedaría montar el circuito en Tinkercad y probar si funciona:

Hemos comprobado que funciona correctamente, así que lo montamos sobre la mesa:

5. Pruebas y ajustes finales

Sostenemos la fotorresistencia pegada a la pantalla y el servomotor cerca de la tecla que nos interesa. Lanzamos el juego y observamos qué ocurre.

La primeras veces no funcionará, es posible que tengas que ajustar las esperas en el código para que se consiga pulsar la tecla correctamente. También debes probar la distancia a la que colocas la fotorresistencia, tanto horizontal hasta el dinosaurio como la vertical para que detecte los distintos tipos de cactus y pájaros.

Una vez que alcances el óptimo obtendrás un resultado como este:

Espero que te haya gustado este proyecto, que lo hayas conseguido resolver y también que me hagas saber qué mejoras has introducido para que funcione aún mejor que el mío.

4 thoughts on “Arduino juega a Google Chrome Dinosaur

  • José Wall Sánchez

    Esto es digno de un gran profesor. No tengo palabras, sinceramente, para decir todo mi agradecimiento al ver como compartes con todos tus conocimientos.

    • Lope

      Muchas gracias a ti José por tus palabras, espero que le guste a tus alumnos.
      Saludos.

  • Eva Maria Bogado Gonzalez

    Es alucinante tu implicación y de agradecer que compartas tu trabajo. Sigo pensando que nunca llegaré a este nivel jiji… Pero es fantástico saber que haya profesores que se impliquen como tú…. Asi si apuntaria a mi hija a robotica… Gracias

    • Lope

      Jajaja que tal Eva, no hace falta que la apuntes a nada porque ya tu sabes más que suficiente de esto como para enseñarla tú misma.
      Saludos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *