Canestro contapunti con Arduino
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.
-
Box stampata con stampante 3D che mostra solo il display
-
Canestro completato
Sensore

Per la realizzazione di questo progetto abbiamo utilizzato il sensore ad ultrasuoni HC-SR04.
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 alla temperatura ambiente, che supponiamo .
Il tempo, all'interno nel microcontrollore Arduino, viene misurato in millisecondi. Pertanto, volendo esprimere la distanza in si scriverà:
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:
.
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.
| Componente | Q.tà | Note |
|---|---|---|
| Display LCD | 1 | |
| Buzzer | 1 | |
| Resistenza | 1 | |
| Potenziometro | 1 | |
| 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).buzzeril 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;
}