This is an old revision of the document!


Basketball Arcade Game

Introducere

Proiectul constă într-un joc de tip arcade în care jucătorul trebuie să marcheze cât mai multe puncte într-o anumită perioadă de timp(60s).

Proiectul utilizează un senzor ultrasonic pentru a intercepta mișcarea mingii care trece prin coșul de baschet, numără punctele marcate și le afișează pe un display digital.

Ideea acestui proiect a pornit din pasiunea mea pentru baschet și din dorința de a crea ceva cu care îmi mai pot ocupa timpul liber la cămin.

Descriere generală

Sub inelul coșului de baschet va fi atașat un senzor ultrasonic. După ce un coș va fi marcat, senzorul va înregistra mișcarea mingii de baschet și va transmite un semnal către placa Arduino Uno folosită, iar mai apoi scorul va fi actualizat pe un display digital. De asemenea după marcarea coșului, prin intermediul unui buzzer, jucătorii vor fi anunțați că au câștigat un punct prin emiterea unui sunet.

Pentru a face lucrurile mai interesante, jucătorii vor avea de marcat cât mai multe puncte într-o perioadă de 60 de secunde. Timpul rămas pentru efectuarea aruncărilor va fi afișat pe un display LCD dar va fi indicat și printr-un sistem de iluminare LED care își va schimba culoare în funcție de timpul rămas(între 60 și 40 de secunde ,verde, între 40 și 20 de secunde ,galben și între 20 și 0 secunde, roșu).

Schema:

Hardware Design

Componente folosite:

  • Arduino UNO
  • Modul Buzzer activ de 3V
  • Senzor Ultrasonic HC-SR04
  • Breadboard
  • 10cm LED strip
  • Wires
  • LCD display

Hardware Scheme

Software Design

Pe partea de software a proiectului, am lucrat cu 3 librării din IDE-ul Arduino, acestea fiind: “LiquidCrystal_I2C”, “Adafruit_NeoPixel” și “Wire.h”.

Sistemul înregistrează mișcarea prin intermediul senzorului ultrasonic care transimte un semnal către Arduino. După ce semnalul este interceptat, un contor numără coșurile marcate și scorul este permanent actualizat pe display-ul LCD pe care este afișat și timpul rămas pentru marcarea punctelor.

În codul folosit există și o funcție care modifică culoarea benzii LED în funcție de timpul rămas. După ce timpul expiră, banda LED se va opri.

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <Adafruit_NeoPixel.h>

#define LED_PIN 2
#define LED_COUNT 6

const int triggerPin = 7;
const int echoPin = 6;
const int buzzerPin = 9;

LiquidCrystal_I2C lcd(0x27, 16, 2);
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

int score = 0;
long minute = 0, second = 59;
long countdown_time = minute * 60 + second;

void setup() {
  pinMode(triggerPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(buzzerPin, OUTPUT);
  lcd.init();
  lcd.backlight();
  lcd.setCursor(4, 0);
  lcd.print("score:");
  lcd.setCursor(11, 0);
  lcd.print(score);

  strip.begin();
  strip.show();  // Initialize all pixels to off
}

void loop() {

  long duration;
  int distance;

  digitalWrite(triggerPin, LOW);
  delayMicroseconds(2);

  digitalWrite(triggerPin, HIGH);
  delayMicroseconds(10);

  digitalWrite(triggerPin, LOW);
  duration = pulseIn(echoPin, HIGH);
  distance = duration * 0.034 / 2;

  if (distance < 10) {
    score++;
    lcd.setCursor(11,0);
    lcd.print(score);
  }
 
  long countdowntime_seconds = countdown_time - (millis() / 1000);
  if (countdowntime_seconds >= 0) {
    long countdown_minute = ((countdowntime_seconds / 60) % 60);
    long countdown_sec = countdowntime_seconds % 60;
    lcd.setCursor(4, 1);

    if (countdown_minute < 10) {
      lcd.print("0");
    }
    lcd.print(countdown_minute);
    lcd.print(":");
    if (countdown_sec < 10) {
      lcd.print("0");
    }
    lcd.print(countdown_sec);

    // Control LED strip based on timer value
    if (countdowntime_seconds <= 60 && countdowntime_seconds > 40) {
      setColor(strip.Color(0, 255, 0));  // Green
    } else if (countdowntime_seconds <= 40 && countdowntime_seconds > 20) {
      setColor(strip.Color(255, 255, 0));  // Yellow
    } else if (countdowntime_seconds <= 20 && countdowntime_seconds > 0) {
      setColor(strip.Color(255, 0, 0));  // Red
    } else {
      strip.clear();  // Turn off LED strip
      strip.show();
    }

    if (countdowntime_seconds == 0) {
      lcd.setCursor(4, 1);
      lcd.print("Time's up");
      strip.clear();  // Turn off LED strip
      strip.show();
    }
  }
  delay(500);
}

void setColor(uint32_t color) {
  for (int i = 0; i < LED_COUNT; i++) {
    strip.setPixelColor(i, color);
  }
  strip.show();
}

void playSound() {
  tone(buzzerPin, 1000, 100);
  delay(100);
  noTone(buzzerPin);
}

Rezultate Obţinute

1. Coșul de baschet finalizat.

2. Sistemul de afișaj al coșului.

3. Coșul de baschet în primele 20 de secunde.

4. Coșul de baschet între 40 și 20 de secunde.

5. Coșul de baschet în ultimele 20 de secunde.

6. Afișajul după oprire + LED-urile oprite.

7. Afișajul cu puncte.

Concluzii

Download

O arhivă (sau mai multe dacă este cazul) cu fişierele obţinute în urma realizării proiectului: surse, scheme, etc. Un fişier README, un ChangeLog, un script de compilare şi copiere automată pe uC crează întotdeauna o impresie bună ;-).

Fişierele se încarcă pe wiki folosind facilitatea Add Images or other files. Namespace-ul în care se încarcă fişierele este de tipul :pm:prj20??:c? sau :pm:prj20??:c?:nume_student (dacă este cazul). Exemplu: Dumitru Alin, 331CC → :pm:prj2009:cc:dumitru_alin.

Jurnal

Puteți avea și o secțiune de jurnal în care să poată urmări asistentul de proiect progresul proiectului.

Bibliografie/Resurse

Listă cu documente, datasheet-uri, resurse Internet folosite, eventual grupate pe Resurse Software şi Resurse Hardware.

Export to PDF

pm/prj2023/avaduva/basketball_score_counter.1685405004.txt.gz · Last modified: 2023/05/30 03:03 by vlad.paraschiv1511
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0