Juego de baloncesto

Este proyecto utiliza un display para indicar la puntuación de los dos jugadores.

Para detectar el paso de la pelota por dentro del aro se utilizan barreras de infrarrojos.

Estas barreras envían una señal a un pin de Arduino para que se incremente una variable, cuyo valor se muestra en el display.

Se utilizan dos interrupciones de Arduino para que, de este modo, Arduino pueda estar entretenido mostrando la información en el display y no haya de estar pendiente a los valores de las barreras de infrarrojos. En su momento estas le interrumpirán y después el continuara con lo que estaba haciendo.

Una interrupción es una señal que interrumpe la actividad normal del microprocesador y salta a atenderla.

Estas interrupciones hardware, se diseñaron por la necesidad de reaccionar a suficiente velocidad en tiempos inimaginablemente cortos a los que la electrónica trabaja habitualmente y a los que ni siquiera el software era capaz de reaccionar.

Para definir una interrupción necesitamos tres cosas:

    • Un pin de Arduino que recibirá la señal de disparo.
    • Una condición de disparo.
    • Una función que se ejecutará, cuando se dispare la interrupción.

Lo primero es un pin de Arduino donde conectaremos la señal de la barrera de infrarrojos. Dependiendo del modelo Arduino que tengamos, tendremos varias posibilidades:

Esto quiere decir que el Arduino UNO puede definir dos interrupciones hardware llamadas 0 y 1, conectadas a los pines 2 y 3.

El Mega como es habitual en él, acepta nada menos que 6 interrupciones diferentes.

En cuanto a la condición de disparo puede ser:

    • LOW, La interrupción se dispara cuando el pin es LOW.
    • CHANGE, Se dispara cuando pase de HIGH a LOW o viceversa.
    • RISING, Dispara en el flanco de subida (Cuando pasa de LOW a HIGH).
    • FALLING, Dispara en el flanco de bajada (Cuando pasa de HIGH a LOW).
    • Y una solo para el DUE: HIGH se dispara cuando el pin esta HIGH.

Si nuestra función se llama Funcion1 (), para activar la interrupción usaremos:

attachInterrupt(0, Funcion1, CHANGE) ;// pin 2

Este es el programa de Arduino:

/*

8x8 LED Matrix MAX7219 Scrolling Text Example

Based on the following library:

GitHub | riyas-org/max7219 https://github.com/riyas-org/max7219

*/

#include <MaxMatrix.h>

#include <avr/pgmspace.h>

PROGMEM const unsigned char CH[] = {

3, 8, B00000000, B00000000, B00000000, B00000000, B00000000, // space

1, 8, B01011111, B00000000, B00000000, B00000000, B00000000, // !

3, 8, B00000011, B00000000, B00000011, B00000000, B00000000, // "

5, 8, B00010100, B00111110, B00010100, B00111110, B00010100, // #

4, 8, B00100100, B01101010, B00101011, B00010010, B00000000, // $

5, 8, B01100011, B00010011, B00001000, B01100100, B01100011, // %

5, 8, B00110110, B01001001, B01010110, B00100000, B01010000, // &

1, 8, B00000011, B00000000, B00000000, B00000000, B00000000, // '

3, 8, B00011100, B00100010, B01000001, B00000000, B00000000, // (

3, 8, B01000001, B00100010, B00011100, B00000000, B00000000, // )

5, 8, B00101000, B00011000, B00001110, B00011000, B00101000, // *

5, 8, B00001000, B00001000, B00111110, B00001000, B00001000, // +

2, 8, B10110000, B01110000, B00000000, B00000000, B00000000, // ,

4, 8, B00001000, B00001000, B00001000, B00001000, B00000000, // -

2, 8, B01100000, B01100000, B00000000, B00000000, B00000000, // .

4, 8, B01100000, B00011000, B00000110, B00000001, B00000000, // /

4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // 0

3, 8, B01000010, B01111111, B01000000, B00000000, B00000000, // 1

4, 8, B01100010, B01010001, B01001001, B01000110, B00000000, // 2

4, 8, B00100010, B01000001, B01001001, B00110110, B00000000, // 3

4, 8, B00011000, B00010100, B00010010, B01111111, B00000000, // 4

4, 8, B00100111, B01000101, B01000101, B00111001, B00000000, // 5

4, 8, B00111110, B01001001, B01001001, B00110000, B00000000, // 6

4, 8, B01100001, B00010001, B00001001, B00000111, B00000000, // 7

4, 8, B00110110, B01001001, B01001001, B00110110, B00000000, // 8

4, 8, B00000110, B01001001, B01001001, B00111110, B00000000, // 9

2, 8, B01010000, B00000000, B00000000, B00000000, B00000000, // :

2, 8, B10000000, B01010000, B00000000, B00000000, B00000000, // ;

3, 8, B00010000, B00101000, B01000100, B00000000, B00000000, // <

3, 8, B00010100, B00010100, B00010100, B00000000, B00000000, // =

3, 8, B01000100, B00101000, B00010000, B00000000, B00000000, // >

4, 8, B00000010, B01011001, B00001001, B00000110, B00000000, // ?

5, 8, B00111110, B01001001, B01010101, B01011101, B00001110, // @

4, 8, B01111110, B00010001, B00010001, B01111110, B00000000, // A

4, 8, B01111111, B01001001, B01001001, B00110110, B00000000, // B

4, 8, B00111110, B01000001, B01000001, B00100010, B00000000, // C

4, 8, B01111111, B01000001, B01000001, B00111110, B00000000, // D

4, 8, B01111111, B01001001, B01001001, B01000001, B00000000, // E

4, 8, B01111111, B00001001, B00001001, B00000001, B00000000, // F

4, 8, B00111110, B01000001, B01001001, B01111010, B00000000, // G

4, 8, B01111111, B00001000, B00001000, B01111111, B00000000, // H

3, 8, B01000001, B01111111, B01000001, B00000000, B00000000, // I

4, 8, B00110000, B01000000, B01000001, B00111111, B00000000, // J

4, 8, B01111111, B00001000, B00010100, B01100011, B00000000, // K

4, 8, B01111111, B01000000, B01000000, B01000000, B00000000, // L

5, 8, B01111111, B00000010, B00001100, B00000010, B01111111, // M

5, 8, B01111111, B00000100, B00001000, B00010000, B01111111, // N

4, 8, B00111110, B01000001, B01000001, B00111110, B00000000, // O

4, 8, B01111111, B00001001, B00001001, B00000110, B00000000, // P

4, 8, B00111110, B01000001, B01000001, B10111110, B00000000, // Q

4, 8, B01111111, B00001001, B00001001, B01110110, B00000000, // R

4, 8, B01000110, B01001001, B01001001, B00110010, B00000000, // S

5, 8, B00000001, B00000001, B01111111, B00000001, B00000001, // T

4, 8, B00111111, B01000000, B01000000, B00111111, B00000000, // U

5, 8, B00001111, B00110000, B01000000, B00110000, B00001111, // V

5, 8, B00111111, B01000000, B00111000, B01000000, B00111111, // W

5, 8, B01100011, B00010100, B00001000, B00010100, B01100011, // X

5, 8, B00000111, B00001000, B01110000, B00001000, B00000111, // Y

4, 8, B01100001, B01010001, B01001001, B01000111, B00000000, // Z

2, 8, B01111111, B01000001, B00000000, B00000000, B00000000, // [

4, 8, B00000001, B00000110, B00011000, B01100000, B00000000, // \ backslash

2, 8, B01000001, B01111111, B00000000, B00000000, B00000000, // ]

3, 8, B00000010, B00000001, B00000010, B00000000, B00000000, // hat

4, 8, B01000000, B01000000, B01000000, B01000000, B00000000, // _

2, 8, B00000001, B00000010, B00000000, B00000000, B00000000, // `

4, 8, B00100000, B01010100, B01010100, B01111000, B00000000, // a

4, 8, B01111111, B01000100, B01000100, B00111000, B00000000, // b

4, 8, B00111000, B01000100, B01000100, B00101000, B00000000, // c

4, 8, B00111000, B01000100, B01000100, B01111111, B00000000, // d

4, 8, B00111000, B01010100, B01010100, B00011000, B00000000, // e

3, 8, B00000100, B01111110, B00000101, B00000000, B00000000, // f

4, 8, B10011000, B10100100, B10100100, B01111000, B00000000, // g

4, 8, B01111111, B00000100, B00000100, B01111000, B00000000, // h

3, 8, B01000100, B01111101, B01000000, B00000000, B00000000, // i

4, 8, B01000000, B10000000, B10000100, B01111101, B00000000, // j

4, 8, B01111111, B00010000, B00101000, B01000100, B00000000, // k

3, 8, B01000001, B01111111, B01000000, B00000000, B00000000, // l

5, 8, B01111100, B00000100, B01111100, B00000100, B01111000, // m

4, 8, B01111100, B00000100, B00000100, B01111000, B00000000, // n

4, 8, B00111000, B01000100, B01000100, B00111000, B00000000, // o

4, 8, B11111100, B00100100, B00100100, B00011000, B00000000, // p

4, 8, B00011000, B00100100, B00100100, B11111100, B00000000, // q

4, 8, B01111100, B00001000, B00000100, B00000100, B00000000, // r

4, 8, B01001000, B01010100, B01010100, B00100100, B00000000, // s

3, 8, B00000100, B00111111, B01000100, B00000000, B00000000, // t

4, 8, B00111100, B01000000, B01000000, B01111100, B00000000, // u

5, 8, B00011100, B00100000, B01000000, B00100000, B00011100, // v

5, 8, B00111100, B01000000, B00111100, B01000000, B00111100, // w

5, 8, B01000100, B00101000, B00010000, B00101000, B01000100, // x

4, 8, B10011100, B10100000, B10100000, B01111100, B00000000, // y

3, 8, B01100100, B01010100, B01001100, B00000000, B00000000, // z

3, 8, B00001000, B00110110, B01000001, B00000000, B00000000, // {

1, 8, B01111111, B00000000, B00000000, B00000000, B00000000, // |

3, 8, B01000001, B00110110, B00001000, B00000000, B00000000, // }

4, 8, B00001000, B00000100, B00001000, B00000100, B00000000, // ~

};

int DIN = 8; // DIN pin of MAX7219 module

int CLK = 10; // CLK pin of MAX7219 module

int CS = 9; // CS pin of MAX7219 module

int maxInUse = 4;

MaxMatrix m(DIN, CS, CLK, maxInUse);

byte buffer[10];

char text[]= " Joc de basquet "; // Scrolling text

int contador1 = 0;

int contador2 = 0;

void setup() {

pinMode(5,OUTPUT);

pinMode(6,OUTPUT);

m.init(); // module initialize

m.setIntensity(15); // dot matix intensity 0-15

attachInterrupt(0, Funcion1, CHANGE) ;// pin 2

attachInterrupt(1, Funcion2, CHANGE) ;//pin 3

}

void Funcion1(){

contador1 = contador1 + 1;

delay(30000);

}

void Funcion2(){

contador2 = contador2 + 1;

delay(30000);

}

void loop() {

char text[] = " Joc de basquet "; // Scrolling text

printStringWithShift(text, 100); // (text, scrolling speed)

char text1[] = " Puntuacio de Judith "; // Scrolling text

printStringWithShift(text1, 100); // (text, scrolling speed)

int contador11 = contador1/2;

String str;

str=String(contador11);

str.toCharArray(text,3);

printStringWithShift(text, 100); // (text, scrolling speed)

char text2[] = " Puntuacio de Sergi "; // Scrolling text

printStringWithShift(text2, 100); // (text, scrolling speed)

int contador21 = contador2/2;

String str1;

str1=String(contador21);

str1.toCharArray(text,3);

printStringWithShift(text, 100); // (text, scrolling speed)

}

// Display=the extracted characters with scrolling

void printCharWithShift(char c, int shift_speed) {

if (c < 32) return;

c -= 32;

memcpy_P(buffer, CH + 7 * c, 7);

m.writeSprite(32, 0, buffer);

m.setColumn(32 + buffer[0], 0);

for (int i = 0; i < buffer[0] + 1; i++)

{

delay(shift_speed);

m.shiftLeft(false, false);

}

}

// Extract the characters from the text string

void printStringWithShift(char* s, int shift_speed) {

while (*s != 0) {

printCharWithShift(*s, shift_speed);

s++;

}

}