Canestro contapunti con Arduino
Questa risorsa è stata scritta dagli studenti dell'Istituto ITIS "Enrico Mattei" di Urbino, della classe 4A/EN (Matteo Coccia, Andrea Piergiovanni, Nicolas Mangani, Matteo Omiccioli) nell'a.s. 2021/2022, all'interno del corso di Sistemi automatici per le superiori 2.
Per favore, prima di apportare modifiche, attendi sino alla fine dell'anno scolastico (termina il 30 giugno 2022) oppure contatta il docente di riferimento Giacomo Alessandroni nel caso venissero rilevati contenuti non in linea con le linee guida della comunità. Se leggi questo avviso ad anno scolastico concluso puoi rimuoverlo. |
In questo progetto viene mostrato come realizzare un canestro contapunti tramite il microcontrollore Arduino.
Principio di funzionamento
modificaQuesto 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
modificaPer la realizzazione di questo progetto abbiamo utilizzato il sensore ad ultrasuoni HC-SR04.
Per approfondire questo argomento, consulta la pagina Misurazione della distanza con sensore a ultrasuoni. |
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
modificaPer 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
modificaIncludo le librerie
modificaLibreria utile per l'utilizzo del display LCD.
#include <LiquidCrystal.h>
Definizione di alcune costanti
modificatrigger1
è 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
modificaconst 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
modificaint punteggio = 0;
long tempo = millis() + 40000; //ms
long passato = 0;
long i = 1;
bool sound = false;
Input e Output
modificatrigger1
è 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
modificaNel 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;
}