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 x Placa Arduino.
- 1 x Protoboard.
- 1 x Fotorresistencia.
- 1 x Resistencia de 10.000 ohmios.
- 1 x Servomotor MS18.
- 14 x Cables Dupont ( macho-hembra y macho-macho).
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:
- Detectar cuándo viene un obstáculo.
- Hacer que el dinosaurio salte para evitarlo.
⌚ Párate un minuto a pensar cómo lo harías.
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-.

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.
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.