Mini Básquetbol- Aprendiendo a Usar Arduino!!
by axelkakaroto in Circuits > Arduino
411 Views, 2 Favorites, 0 Comments
Mini Básquetbol- Aprendiendo a Usar Arduino!!

El propósito de este proyecto en principio es poner a prueba las habilidades adquiridas en el periodo de la materia de programación básica.
El cumulo de nuestras habilidades adquiridas con pseudocódigos, con estructuras de control, arreglos y lenguaje en c++, junto con el manejo de Arduino serán indispensables para crear un proyecto que ejemplifique todo nuestro arduo camino, y , por supuesto demostrar el nivel que emos alcanzado.
En es te instructable, en conjunto a otros dos compañeros, explicaremos paso a paso como creamos un mini básquetbol, con ayuda de todos lo conocimientos adquiridos en la materia y algunos otros recursos como material reciclado, en el cual dejamos mente, alma y corazón.
Supplies



















- Arduino uno
- botones de cuatro pines
- buzzer zumbador 5v pasivo
- cable de calibre 22
- cable para Arduino
- cinta de aislar
- jumpers macho-hembra
- pantalla LCD 16x2 1602A V2.0
- pasta para soldar y estaño
- potenciómetro de 10k
- protoboard
- puentes de calibre 22
- resistencias de 220k ohms
- sensor infrarrojo HW-201
- Termo fit
- Base de plástico
- aro de acero
- tubo de acero
Bases Del Proyecto


Primero tenemos que establecer que proyecto vamos a realizar; por nuestra parte, decidimos realizar un mini basquetbol.
En principio queremos mostrar un marcador que lleve un sistema de puntos que nos ayude a definir un ganador y un perdedor, además de un cronometro que limite el tiempo.
Así demostrar lo variedad de conocimientos que se aplicaran en el proyecto a realizar.
Optamos por seleccionar este juego por la variedad de similitudes que ya existen en el mercado como las pinball, o maquinas tragamonedas (futbolitos), ya que los ejemplos cuentan con algo similar por la parte programable, pensamos que seria un gran reto, pues la gran cantidad de ejemplares que existen en el mercado determinarían el enemigo a vencer.
Una vez establecido el proyecto, delimitamos los objetivos:
- Establecer un juego de ejemplifique nuestras habilidades dentro de la materia de programación básica.
- El proyecto a generar debe ser un reto para los alumnos .
- Los resultados deben ser satisfactorios tanto para los alumnos, como para los evaluadores.
- Divertirse con el proyecto final
Conseguir La Base Y Materiales De La Estructura




Como primer paso buscamos los materiales que nos ayudaran a definir y construir la estructura, la mayoría de ellos son reciclados, de tal manera que podamos aprovechar los recursos que tenemos a nuestro alrededor.
Primero conseguimos la base de de un mueble de plástico, donde colocaremos toda la estructura, es decir que será la base de nuestro juego; con un aro de metal soldado a una pequeña lamina de hierro formamos el tablero; posteriormente los soldamos a un tubo de metal de 25cm, así formamos la canasta completa del juego.
La canasta fue fijada a la base con unas pijas para que quedara firme, detrás de la canasta se coloco una tabla adornada con un dibujo alusivo al juego donde posterior mente será colocada la pantalla LCD.
Con la estructura del juego terminada pasaremos al siguiente paso y mas entretenido: ¡PROGRAMARLO!
Programar














Lo primero que se declaro fueron los pines de la pantalla LCD, para mostrar un mensaje de "iniciar juego", este fue el principio del cual se desglosara un menú de opciones para la jugabilidad, a este circuito se une un potenciómetro de 10k que nos ayuda a regular el contraste de los mensajes mostrados en la pantalla.
También se declararon los pines del sensor infrarrojo, este nos ayudaría a recibir la señal del movimiento, que se utilizara para formar un contador de puntos, es decir un marcador, a este punto le uniremos un buzzer pasivo que genera un sonido diferente, declarado con las variables "ganador" y "perdedor".
Todo esto se conecto a una protoboard por medio de jumpers macho-hembra, puentes de calibre 22 y resistencias de 220k ohms, y siendo que apunas es un prototipo para verificar que si funcione, aun es alimentado por el Arduino uno que se conecta a la laptop.
El código que utilizamos es el siguiente:
#include <LiquidCrystal.h> // importa librería
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); // pines RS, E, D4, D5, D6, D7 de módulo 1602A
const int irSensorPin = 8; // Pin al que está conectado el sensor IR
const int sonido = 12;
const int btn_reinicio = 11;
const int btn_pausa = 10;
const int btn_inicio = 9;
int score = 0;
bool objectDetected = false;
bool isPaused = false;
bool gameStarted = false;
bool gameWon = false;
unsigned long startTime = 0;
unsigned long pausedTime = 0; // Variable para almacenar el tiempo de pausa
unsigned long endTime = 0;
bool endMessageShown = false;
bool waitingForRestart = false;
void setup() {
pinMode(irSensorPin, INPUT);
pinMode(sonido, OUTPUT); // Configura el pin del zumbador como salida
pinMode(btn_reinicio, INPUT_PULLUP);
pinMode(btn_pausa, INPUT_PULLUP);
pinMode(btn_inicio, INPUT_PULLUP);
lcd.begin(16, 2); // Inicializa la pantalla LCD de 16x2;
lcd.setCursor(0, 0);
lcd.print(" Presione Boton ");
lcd.setCursor(0, 1);
lcd.print(" De Inicio ");
}
void loop() {
if (digitalRead(btn_inicio) == LOW && !gameStarted && !waitingForRestart) {
gameStarted = true;
isPaused = false;
gameWon = false;
endMessageShown = false;
score = 0;
startTime = millis();
digitalWrite(sonido, LOW); // Apaga el zumbador al iniciar el juego
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Puntuacion: 0");
delay(500); // Pequeña demora para evitar rebotes
}
if (digitalRead(btn_reinicio) == LOW) {
gameStarted = false;
gameWon = false;
endMessageShown = false;
score = 0;
digitalWrite(sonido, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Presione Boton ");
lcd.setCursor(0, 1);
lcd.print(" De Inicio ");
delay(500); // Pequeña demora para evitar rebotes
}
if (digitalRead(btn_pausa) == LOW && gameStarted) {
if (!isPaused) {
// Pausar el juego
isPaused = true;
pausedTime = millis() - startTime; // Guardar el tiempo transcurrido hasta ahora
lcd.setCursor(0, 1);
lcd.print("Pausado ");
} else {
// Reanudar el juego
isPaused = false;
startTime = millis() - pausedTime; // Ajustar startTime restando el tiempo pausado
lcd.setCursor(0, 1);
lcd.print(" ");
}
delay(500); // Pequeña demora para evitar rebotes
}
if (gameStarted && !isPaused && !gameWon) {
// Lee el estado del sensor IR
int sensorValue = digitalRead(irSensorPin);
if (sensorValue == LOW && !objectDetected) {
score++;
objectDetected = true;
// Hacer sonar el zumbador
digitalWrite(sonido, HIGH);
delay(100); // Duración del zumbido
digitalWrite(sonido, LOW);
lcd.clear();
if (score < 1) {
lcd.setCursor(0, 0);
lcd.print(" Puntuacion : ");
lcd.print(score);
} else {
lcd.setCursor(0, 0);
lcd.print("HERES EL GANADOR!!!");
lcd.setCursor(0, 1);
lcd.print(" GOAT ");
gameWon = true;
endTime = millis(); // Registra el tiempo cuando se muestra el mensaje de ganador
//Buzzer Inicia si ganas
for (int i = 0; i < 12; i++) { // Buzzer Inicia si ganas
digitalWrite(sonido, HIGH);
delay(200); // Duración del zumbido
digitalWrite(sonido, LOW);
delay(100);
}
//Buzzer termina si ganas
}
} else if (sensorValue == HIGH) {
objectDetected = false;
}
unsigned long currentTime;
if (!isPaused) {
currentTime = millis();
} else {
currentTime = pausedTime + startTime; // Usar el tiempo pausado como base
}
unsigned long elapsedTime = (currentTime - startTime) / 1000;
if (elapsedTime >= 60 && !gameWon) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" PERDEDOR ");
lcd.setCursor(0, 1);
lcd.print(" LOSER!!! ");
gameStarted = false;
endTime = millis(); // Registra el tiempo cuando se muestra el mensaje de no hay persona
//Buzzer Inicia si Pierdes
for (int i = 0; i < 8; i++) { // Buzzer Inicia si Pierdes
digitalWrite(sonido, HIGH);
delay(400 + (i % 2) * 100); // Duración del zumbido
digitalWrite(sonido, LOW);
delay(300 - (i % 2) * 100);
}
//Buzzer Termina si Pierdes
} else if (!gameWon) {
lcd.setCursor(0, 1);
lcd.print("Tiempo: ");
lcd.print(elapsedTime); // escribe valor en segundos desde el inicio del juego
lcd.print(" seg.");
}
delay(100); // Pequeña demora para evitar rebotes
}
if ((gameWon || !gameStarted) && !endMessageShown) {
if ((millis() - endTime) / 1000 >= 5) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Presione Boton ");
lcd.setCursor(0, 1);
lcd.print(" De Inicio ");
delay(100);
endMessageShown = true;
waitingForRestart = true;
}
}
// Reiniciar juego al presionar el botón de inicio después de reiniciar
if (waitingForRestart && digitalRead(btn_inicio) == LOW) {
waitingForRestart = false;
gameStarted = true;
isPaused = false;
gameWon = false;
endMessageShown = false;
score = 0;
startTime = millis();
digitalWrite(sonido, LOW); // Apaga el zumbador al reiniciar
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Puntuacion: 0");
delay(500); // Pequeña demora para evitar rebotes
}
}
Con esta fase terminada, podemos pasar al siguiente #include <LiquidCrystal.h> // importa librería
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); // pines RS, E, D4, D5, D6, D7 de módulo 1602A
const int irSensorPin = 8; // Pin al que está conectado el sensor IR
const int sonido = 12;
const int btn_reinicio = 11;
const int btn_pausa = 10;
const int btn_inicio = 9;
int score = 0;
bool objectDetected = false;
bool isPaused = false;
bool gameStarted = false;
bool gameWon = false;
unsigned long startTime = 0;
unsigned long pausedTime = 0; // Variable para almacenar el tiempo de pausa
unsigned long endTime = 0;
bool endMessageShown = false;
bool waitingForRestart = false;
void setup() {
pinMode(irSensorPin, INPUT);
pinMode(sonido, OUTPUT); // Configura el pin del zumbador como salida
pinMode(btn_reinicio, INPUT_PULLUP);
pinMode(btn_pausa, INPUT_PULLUP);
pinMode(btn_inicio, INPUT_PULLUP);
lcd.begin(16, 2); // Inicializa la pantalla LCD de 16x2;
lcd.setCursor(0, 0);
lcd.print(" Presione Boton ");
lcd.setCursor(0, 1);
lcd.print(" De Inicio ");
}
void loop() {
if (digitalRead(btn_inicio) == LOW && !gameStarted && !waitingForRestart) {
gameStarted = true;
isPaused = false;
gameWon = false;
endMessageShown = false;
score = 0;
startTime = millis();
digitalWrite(sonido, LOW); // Apaga el zumbador al iniciar el juego
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Puntuacion: 0");
delay(500); // Pequeña demora para evitar rebotes
}
if (digitalRead(btn_reinicio) == LOW) {
gameStarted = false;
gameWon = false;
endMessageShown = false;
score = 0;
digitalWrite(sonido, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Presione Boton ");
lcd.setCursor(0, 1);
lcd.print(" De Inicio ");
delay(500); // Pequeña demora para evitar rebotes
}
if (digitalRead(btn_pausa) == LOW && gameStarted) {
if (!isPaused) {
// Pausar el juego
isPaused = true;
pausedTime = millis() - startTime; // Guardar el tiempo transcurrido hasta ahora
lcd.setCursor(0, 1);
lcd.print("Pausado ");
} else {
// Reanudar el juego
isPaused = false;
startTime = millis() - pausedTime; // Ajustar startTime restando el tiempo pausado
lcd.setCursor(0, 1);
lcd.print(" ");
}
delay(500); // Pequeña demora para evitar rebotes
}
if (gameStarted && !isPaused && !gameWon) {
// Lee el estado del sensor IR
int sensorValue = digitalRead(irSensorPin);
if (sensorValue == LOW && !objectDetected) {
score++;
objectDetected = true;
// Hacer sonar el zumbador
digitalWrite(sonido, HIGH);
delay(100); // Duración del zumbido
digitalWrite(sonido, LOW);
lcd.clear();
if (score < 1) {
lcd.setCursor(0, 0);
lcd.print(" Puntuacion : ");
lcd.print(score);
} else {
lcd.setCursor(0, 0);
lcd.print("HERES EL GANADOR!!!");
lcd.setCursor(0, 1);
lcd.print(" GOAT ");
gameWon = true;
endTime = millis(); // Registra el tiempo cuando se muestra el mensaje de ganador
//Buzzer Inicia si ganas
for (int i = 0; i < 12; i++) { // Buzzer Inicia si ganas
digitalWrite(sonido, HIGH);
delay(200); // Duración del zumbido
digitalWrite(sonido, LOW);
delay(100);
}
//Buzzer termina si ganas
}
} else if (sensorValue == HIGH) {
objectDetected = false;
}
unsigned long currentTime;
if (!isPaused) {
currentTime = millis();
} else {
currentTime = pausedTime + startTime; // Usar el tiempo pausado como base
}
unsigned long elapsedTime = (currentTime - startTime) / 1000;
if (elapsedTime >= 60 && !gameWon) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" PERDEDOR ");
lcd.setCursor(0, 1);
lcd.print(" LOSER!!! ");
gameStarted = false;
endTime = millis(); // Registra el tiempo cuando se muestra el mensaje de no hay persona
//Buzzer Inicia si Pierdes
for (int i = 0; i < 8; i++) { // Buzzer Inicia si Pierdes
digitalWrite(sonido, HIGH);
delay(400 + (i % 2) * 100); // Duración del zumbido
digitalWrite(sonido, LOW);
delay(300 - (i % 2) * 100);
}
//Buzzer Termina si Pierdes
} else if (!gameWon) {
lcd.setCursor(0, 1);
lcd.print("Tiempo: ");
lcd.print(elapsedTime); // escribe valor en segundos desde el inicio del juego
lcd.print(" seg.");
}
delay(100); // Pequeña demora para evitar rebotes
}
if ((gameWon || !gameStarted) && !endMessageShown) {
if ((millis() - endTime) / 1000 >= 5) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Presione Boton ");
lcd.setCursor(0, 1);
lcd.print(" De Inicio ");
delay(100);
endMessageShown = true;
waitingForRestart = true;
}
}
// Reiniciar juego al presionar el botón de inicio después de reiniciar
if (waitingForRestart && digitalRead(btn_inicio) == LOW) {
waitingForRestart = false;
gameStarted = true;
isPaused = false;
gameWon = false;
endMessageShown = false;
score = 0;
startTime = millis();
digitalWrite(sonido, LOW); // Apaga el zumbador al reiniciar
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" Puntuacion: 0");
delay(500); // Pequeña demora para evitar rebotes
}
}
Con el código y los componentes bien estructurados podemos pasar al siguiente paso.
A Por El Ultimo Paso- ¡ Armar! Y Desarmar!!??






Ya que tenemos toda la estructura armada, y los códigos funcionando, llega la parte mas laboriosa del proyecto, juntar ambas partes.
Para conectar todos los componentes y ajustarlos a las partes designadas de cada uno, todos los componentes se unieron con cable de calibre 22 y cinta de aislar.
La pantalla LCD se coloco en la esquina superior derecha de la tabla ilustrada para que se viera de frente el marcador, el cronometro y la puntuación.
Los botones se colocaron en la parte frontal de la estructura, a la derecha se encuentra el botón de inicio, en medio se encuentra el botón de pausa y al final esta el botón de reinicio, este pequeño menú nos permite iniciar, pausar y reiniciar el juego, el contador y el cronometro.
El sensor a infrarrojo se coloco por debajo de la canasta, de tal manera que al entrar una pelota, este manda la señal al Arduino y la registra la pantalla LCD, mostrando la puntuación, esta misma activa el buzzer que emite un diferente sonido dependiendo si se gana o se pierde.
Con el juego totalmente armado solo queda divertirse; la mecánica del juego es la siguiente: El propósito del juego es encestar 3 pelotas en la canasta, con un tiempo limite de 60 segundos, si se logra el objetivo se mostrara un mensaje que dice " GOALS, ERES GANADOR", de lo contrario se mostrara un mensaje que diga "LOSER".
Con esto, podemos decir que emos concluido el proyecto "MINI BASQUETBOL".