Progetto Arduino: segnapunti per ping pong

Non ricordi di quanto stai battendo l’avversario? Non sai se è il tuo turno di battuta? Buone notizie…


Versione 1.0 (“Cambio palla”)

Strumenti

  • Arduino UNO
  • Due matrici LED 8×8
  • Due moduli joystick a doppio asse
  • Cavi elettrici e breadbord

Ogni giocatore è associato ad un joystick e ad una matrice LED su cui è riportato il proprio punteggio. Muovendo la levetta verso l’alto o verso il basso, il punteggio di quel giocatore incrementa o decrementa di un punto. Muovendo contemporaneamente entrambe le levette a destra o a sinistra all’inizio della partita, viene deciso a chi spetta la prima battuta. Ogni 5 punti, il sistema effettua automaticamente il “cambio palla”.

Diagramma dei collegamenti

Codice

Clicca qui per visualizzare
#include "LedControlMS.h"

LedControl lc=LedControl(12,10,11,2); // usiamo 2 matrici

const int SW_pin0 = 7;
const int X_pin0 = 0;
const int Y_pin0 = 1;

const int SW_pin1 = 6;
const int X_pin1 = 2;
const int Y_pin1 = 3;

void setup() {

  pinMode(SW_pin0, INPUT);
digitalWrite(SW_pin0, HIGH);
pinMode(SW_pin1, INPUT);
digitalWrite(SW_pin1, HIGH);

   for(int i=0; i<2; i+=1) { // inizializza le 2 matrici
   lc.shutdown(i,false);
   lc.setIntensity(i,8);
   lc.clearDisplay(i);
}

  lc.setLed(0,7,0,1);
writeNumber(0,0);
writeNumber(0,1);

}

void writeDigit(int i, int m, int r) { // scrivi la cifra i sulla matrice m partendo dalla riga r
switch(i) {
   case 0:
   lc.setRow(m,r,B00111110);
   lc.setRow(m,r+1,B00100010);
   lc.setRow(m,r+2,B00111110);
   break;
   case 1:
   lc.setRow(m,r,B00000000);
   lc.setRow(m,r+1,B00000000);
   lc.setRow(m,r+2,B00111110);
   break;
   case 2:
   lc.setRow(m,r,B00111010);
   lc.setRow(m,r+1,B00101010);
   lc.setRow(m,r+2,B00101110);
   break;
   case 3:
   lc.setRow(m,r,B00101010);
   lc.setRow(m,r+1,B00101010);
   lc.setRow(m,r+2,B00111110);
   break;
   case 4:
   lc.setRow(m,r,B00001110);
   lc.setRow(m,r+1,B00001000);
   lc.setRow(m,r+2,B00111110);
   break;
   case 5:
   lc.setRow(m,r,B00101110);
   lc.setRow(m,r+1,B00101010);
   lc.setRow(m,r+2,B00111010);
   break;
   case 6:
   lc.setRow(m,r,B00111110);
   lc.setRow(m,r+1,B00101010);
   lc.setRow(m,r+2,B00111010);
   break;
   case 7:
   lc.setRow(m,r,B00000010);
   lc.setRow(m,r+1,B00000010);
   lc.setRow(m,r+2,B00111110);
   break;
   case 8:
   lc.setRow(m,r,B00111110);
   lc.setRow(m,r+1,B00101010);
   lc.setRow(m,r+2,B00111110);
   break;
   case 9:
   lc.setRow(m,r,B00101110);
   lc.setRow(m,r+1,B00101010);
   lc.setRow(m,r+2,B00111110);
   break;
}
}

void writeNumber(int n, int m) { // scrivi il numero (di due cifre) n sulla matrice m
int u = n % 10;
int d = n / 10;
writeDigit(d, m, 0);
writeDigit(u, m, 4);
}

int punteggio0 = 0; // punti giocatore 0
int punteggio1 = 0; // punti giocatore 1
int palla = 0; // di default la palla è del giocatore 0

void loop() {

if( analogRead(X_pin0) > 700 ) { // incrementa il punteggio del giocatore 0
   if(punteggio0 < 99) {
     punteggio0 = punteggio0 + 1;
   }
   writeNumber(punteggio0,0);
   int a = punteggio0+punteggio1; // controlla se cambia palla
   a = a % 5;
   if (a == 0 ) {
     lc.setLed(palla,7,0,0);
     palla = palla + 1;
     palla = palla % 2;
     lc.setLed(palla,7,0,1);
   }
   delay(300);
}

  if( analogRead(X_pin0) < 400 ) { // decrementa il punteggio del giocatore 0
   if(punteggio0>0) {
     punteggio0 = punteggio0 - 1;
   }
   writeNumber(punteggio0,0);
   int a = punteggio0+punteggio1; // controlla se cambia palla
   a = a % 5;
   if (a == 0 ) {
     lc.setLed(palla,7,0,0);
     palla = palla + 1;
     palla = palla % 2;
     lc.setLed(palla,7,0,1);
   }
   delay(300);
}

  if( analogRead(X_pin1) > 700 ) { // incrementa il punteggio del giocatore 1
   if(punteggio1 < 99) {
     punteggio1 = punteggio1 + 1;
   }
   writeNumber(punteggio1,1);
   int a = punteggio0+punteggio1; // controlla se cambia palla
   a = a % 5;
   if (a == 0 ) {
     lc.setLed(palla,7,0,0);
     palla = palla + 1;
     palla = palla % 2;
     lc.setLed(palla,7,0,1);
   }
   delay(300);
}

  if( analogRead(X_pin1) < 400 ) { // decrementa il punteggio del giocatore 0
   if(punteggio1>0) {
     punteggio1 = punteggio1 - 1;
   }
   writeNumber(punteggio1,1);
   int a = punteggio0+punteggio1; // controlla se cambia palla
   a = a % 5;
   if (a == 0 ) {
     lc.setLed(palla,7,0,0);
     palla = palla + 1;
     palla = palla % 2;
     lc.setLed(palla,7,0,1);
   }
   delay(300);
}

if( digitalRead(SW_pin0) == LOW ) { // resetta il punteggio del giocatore 0
   punteggio0 = 0;
   writeNumber(punteggio0,0);
   delay(100);
}

if( digitalRead(SW_pin1) == LOW ) { // resetta il punteggio del giocatore 1
   punteggio1 = 0;
   writeNumber(punteggio1,1);
   delay(100);
}

  if( analogRead(Y_pin0) < 400 && analogRead(Y_pin1) < 400 ) { // cambio palla manuale al giocatore 0
   lc.setLed(0,7,0,1);
   lc.setLed(1,7,0,0);
   palla = 0;
   delay(300);
}

  if( analogRead(Y_pin0) > 700 && analogRead(Y_pin1) > 700 ) { // cambio palla manuale al giocatore 1
   lc.setLed(0,7,0,0);
   lc.setLed(1,7,0,1);
   palla = 1;
   delay(300);
}

  delay(100);

}

Galleria

Commenti

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *