Canestro contapunti con Arduino

Da Wikiversità, l'apprendimento libero.
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.

laboratorio
laboratorio
Canestro contapunti con Arduino
Tipo di risorsa Tipo: laboratorio
Materia di appartenenza Materia: Sistemi automatici per le superiori 2
Avanzamento Avanzamento: laboratorio completa al 100%

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

Principio di funzionamento[modifica]

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[modifica]

Sensore di prossimità HC SR-04

Per 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[modifica]

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
Buzzer 1
Resistenza 1
Potenziometro 1
Sensore 1 HC-SR04
Interruttore 1

Codice sorgente[modifica]

Includo le librerie[modifica]

Libreria utile per l'utilizzo del display LCD.

#include <LiquidCrystal.h>

Definizione di alcune costanti[modifica]

  • 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[modifica]

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[modifica]

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

Input e Output[modifica]

  • 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[modifica]

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;
}