Canestro contapunti con Arduino

Da testwiki.
Vai alla navigazione Vai alla ricerca

Template:Lavori in corso Template:Risorsa

In questo progetto viene mostrato come realizzare un canestro contapunti tramite il microcontrollore Arduino.

Principio di funzionamento

Questo progetto è un prototipo di un basketball arcade per bambini, come quelli che si incontrano facilmente nelle sale-giochi. È in grado di rilevare ogni canestro che si compie emettendo un suono tramite un cicalino, e – automaticamente – segna 2 punti in un display dove viene mostrato il punteggio totale e il tempo residuo per terminare la partita.

Il display e il microcontrollore sono stati alloggiati in un box, stampato mediante stampate 3D, progettato e decorato per l'occasione.

Sensore

Sensore di prossimità HC SR-04

Per la realizzazione di questo progetto abbiamo utilizzato il sensore ad ultrasuoni HC-SR04.

Template:Vedi anche

I sensori a ultrasuoni, rilevano oggetti e liquidi utilizzando onde ultrasoniche. Il calcolo della distanza dell'oggetto avviene tramite una misurazione indiretta del tempo di transito del segnale stesso. Questi sensori vengono utilizzati quando sono necessari ampi campi di rilevamento.

La velocità del suono nell'aria è pari a circa 343m/s alla temperatura ambiente, che supponiamo 20C.

Il tempo, all'interno nel microcontrollore Arduino, viene misurato in millisecondi. Pertanto, volendo esprimere la distanza in cm si scriverà:

d=ct/10002100

dove:

  • la divisione per 1.000, serve per la conversione da millisecondi a secondi;
  • la moltiplicazione per 100, per la conversione da metri a centimetri;
  • la divisione per 2, poiché il segnale ha un'andata e un ritorno.

Finalmente, si ottiene:

d=120ct .

Schema di montaggio

Per questo progetto abbiamo utilizzato un canestro per bambini nel quale sono stati installati i componenti elettronici utilizzati per la funzione descritta all'inizio elencati nella tabella sottostante.

Componenti utilizzati
Componente Q.tà Note
Display LCD 1 16×2
Buzzer 1 8Ω
Resistenza 1 220Ω
Potenziometro 1 220Ω
Sensore 1 HC-SR04
Interruttore 1

Codice sorgente

Includo le librerie

Libreria utile per l'utilizzo del display LCD.

#include <LiquidCrystal.h>

Definizione di alcune costanti

  • trigger1è collegato al pin 9;
  • echo1 è collegato al pin 10;
  • buzzer è collegato al pin 6;
  • 0.0343 è la velocità del suono nel vuoto a una temperatura di 20°;
#define trigger1 9
#define echo1 10
const int buzzer = 6;

#define conversione 0.0343
#define offset 15

Inizializzazione del display LCD

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
const int riposo = 400;
const int lunghezzaSuono = 200;

Inizializzazione di alcune variabili

int punteggio = 0;
long tempo = millis() + 40000; //ms
long passato = 0;
long i = 1;
bool sound = false;

Input e Output

  • trigger1è il pin “Trigger”: dice al sensore quando inviare un segnale;
  • echo1 è il pin "Echo" che riceve il ritorno del segnale inviato dal sensore (ammesso che vi sia).
  • buzzer il pin del buzzer utilizzato come output.
void setup() {
  pinMode(trigger1, OUTPUT);
  pinMode(echo1, INPUT);
  pinMode(buzzer, OUTPUT);
  lcd.begin(16, 2);

  //Debug

  Serial.begin(9600);
}

Programma principale

Nel programma principale forniamo ad Arduino tutte le informazioni relative all'esecuzione del programma e tutti i comandi relativi.

La particolarità del void loop è che i comandi vengono ripetuti sempre fino allo spegnimento della macchina.

void loop() {
  if (i > 0) {
    i = tempo - millis();
    int distanza = calcolaDistanza(trigger1, echo1);
    if (distanza <= offset) {
      if ((millis() - passato) >= riposo) {
        punteggio += 2;
        passato = millis();
        sound = true;
      }
    }
    if ((millis() - passato) >= lunghezzaSuono) {
      sound = false;
    }
	
	  digitalWrite(buzzer, sound);
  
    scritturaDisplay(punteggio, i/1000);
  }
  
  delay(100);
}

void scritturaDisplay(int score, int timeLeft) {
  lcd.clear();
  lcd.print("Score: ");
  lcd.print(score);
  lcd.setCursor(0, 1);
  lcd.print("Time left: ");
  lcd.print(timeLeft);
}

//Sensore di prossimità a ultrasuoni
int calcolaDistanza(int tr, int ec) {
  digitalWrite(tr, LOW);
  delayMicroseconds(2);
  digitalWrite(tr, HIGH);
  delayMicroseconds(10);
  digitalWrite(tr, LOW);
  long duration = pulseIn(ec, HIGH);
  int distance = (duration * conversione) / 2;
  return distance;
}