1. ro
  2. en
03 November 2023

P1ng P0ng

Tenisul de masa, denumit si ping-pong, este un sport in care doi sau, in anumite cazuri, patru jucatori lovesc o minge usoara si de mici dimensiuni, utilizand palete special concepute pentru acest joc, trimitand-o de la unul la celalalt in timp ce o mentin pe suprafata de joc. Suprafata de joc este o masa cu lungimea de 2.74m, latimea de 1.5m și înălțimea de 76cm construita dintr-un material care sa permita producerea unui salt uniform al bilei de ping-pong in orice punct si este împărțită în două jumătăți de un fileu (o plasa care nu permite bilei sa isi continue deplasarea daca nu se afla la o anumita inaltime) de aproximativ 15cm înălțime.

Datorita faptului ca mingea este foarte usoara (are 40mm diametru si o masa de 2.7 grame) aceasta va avea o viteza de deplasare foarte mare si traiectorii imprevizibile atunci cand paleta este manuita cu maiestrie de catre jucator si astfel jocul se desfășoară cu viteză mare și necesită reflexe rapide ale jucatorilor.

 

Pentru acest proiect nu ne vom propune sa utilizam masa, palete si mingi ci sa construim un joc similar celui de ping-pong insa cu resursele pe care le avem la dispozitie: componente electronice si o platforma Arduino.

Avem mai multe solutii la dispozitie: prima solutie ar fi sa utilizam platforma de dezvoltare Arduino impreuna cu un afisaj LED sau TFT care vor deveni suprafata de joc (masa) si pe care vor fi prezentate doua linii (paletele) ce se pot deplasa utilizand butoane (intrerupatoare cu revenire) sau poate chiar un joystick si un punct care se va deplasa pe afisaj in functie de unghiul in care este atinsa de "paleta". Acest tip de joc ar fi similar celui disponibil la adresa web https://www.ponggame.org/ si vom prezenta modalitatea de a-l realiza in cadrul altui articol.

A doua solutie este sa utilizam LED-uri care se aprind alternativ simuland astfel deplasarea bilei de ping-pong. Exista insa o problema esentiala: vom avea nevoie de un numar foarte mare de LED-uri pe care trebuie sa le conectam la Arduino, insa avem o solutie pentru aceasta: sa utilizam o banda cu LED-uri controlate de circuite integrate WS2812B (LED-uri denumite si NeoPixel).

Banda cu LED-uri NeoPixel poseda trei pini marcati cu 5V - ce va fi conectat la polul pozitiv al unei surse de alimentare de 5V, GND - ce va fi conectat la polul negativ al sursei de alimentare si la pinul GND al Arduino si DIN (sau D) - pinul prin intermediul caruia sunt receptionate date de la Arduino.

Fiecare dintre segmentele NeoPixel contine un circuit integrat WS2812B si o capsula de 5 x 5mm in care se regasesc 3 LED-uri: unul rosu, unul verde si unul albastru (RGB - red, green, blue) fiecare dintre acestea permitand 256 de niveluri de luminozitate ceea ce inseamna ca, utilizand aceste segmente, vom putea produce  256 x 256 x 256 = 16.777.216 de culori sau nuante ale acestora. Aceasta inseamna ca datele transmise catre modulele NeoPixel sunt formate din 24 de biti (cate 8 biti pentru fiecare dintre culorile de baza: rosu, verde si alabastru). Un aspect de care trebuie sa tinem cont este acela ca, la intensitate maxima, un segment poate consuma un curent de aproximativ 60mA. Oricum ar fi, limita minima pe care trebuie sa o luam in considerare atunci cand alegem alimentatorul este de 20mA pentru un segment. Referitor la modalitatea in care putem controla aceste LED-uri, nu este necesar sa ne definim propriile functii deoarece avem la dispozitie biblioteca Adafruit NeoPixel by Adafruit.

 

Descrierea proiectului

Ne propunem sa utilizam o banda cu LED-uri NeoPixel si intrerupatoare cu revenire, impreuna cu platforma de dezvoltare Arduino pentru a construi un joc similar celui de ping-pong. In plus, vom utiliza si un difuzor pentru a indica deplasarea bilei (simulata, evident, de iluminarea unuia dintre LED-urile de pe banda NeoPixel) si pentru alte efecte acustice. Deoarece mi s-a parut foarte interesant, am preluat ideea acestui proiect, impreuna cu codul sursa, de pe site-ul web www.vagrearg.org, unde veti gasi si alte idei de proiecte.

Vom avea urmatorul set de reguli pentru jocul nostru, pe care l-am denumit P1ng P0ng:

  • suprafata de joc este reprezentata de 60 de LED-uri NeoPixel (numarul LED-urilor poate fi modificat utilizand un parametru al codului sursa, dar 60 de LED-uri inseamna deja 1 metru de banda LED iar o distanta mai mare va face dificila urmarirea LED-urilor; similar, utilizarea unui numar mai mic de LED-uri se reflecta in scurtarea timpului de deplasare a "bilei" intre capete si presupune reflexe foarte bune ale utilizatorilor).
  • jocul este construit pentru doi concurenti (utilizatori)
  • fiecare dintre utilizatori are la dispozitie cate doua butoane. Buton principal reprezinta "paleta", iar apasarea sa la timpul oportun va trimite "bila" in terenul adversarului. Butonul secundar reprezinta o accelerare suplimentara a "bilei" si, daca este apasat, la momentul oportun, impreuna cu butonul principal, va creste viteza "bilei" trimise catre adversar.
  • deplasarea "bilei" este reprezentata de aprinderea unui LED in timp ce celelalte raman stinse: se aprinde LED-ul n, apoi se stinge si se aprinde n+1 (sau n-1, in functie de directie), care se stinge si se aprinde n+2 (sau n-2)  tot asa, simuland deplasarea intr-un sens sau in celalalt
  • exista cate o zona, pentru fiecare utilizator, in care poate fi "lovita bila". Daca LED-ul aprins ("bila") se afla in aceasta zona si utilizatorul apasa butonul principal, atunci "bila" va fi retrimisa catre celalalt utilizator. Cu cat apasarea se produce mai aproape de marginea dinspre utilizatorul, cu atat viteza de deplasare a "bilei" trimise catre adversar va fi mai mare (deci riscul mai mare va aduce beneficii mai mari). Daca in acelasi timp va fi apasat si butonul secundar atunci "bila" va fi retrimisa cu o viteza si mai mare, insa cu o penalizare pentru utilizator, in sensul ca ii va fi diminuata zona de lovire cu cate un LED pentru fiecare accelerare suplimentara (pana cand zona va avea dimensiunea de 1 LED). Penalizarea va fi diminuata in timp, odata cu pierderea punctelor de catre utilizator. Daca "bila" depaseste zona de lovire atunci utilizatorul pierde un punct (sau, mai precis, adversarul castiga un punct). Scorul este afisat prin intermediul aprinderii unui LED de pe banda NeoPixel.
  • castigator este primul care ajunge pana la 10, parametru care poate fi modificat prin intermediul codului sursa.
  • dupa finalizarea jocului urmeaza o animatie care poate fi intrerupata de apasarea unui buton principal si astfel poate incepe un nou joc.

 

Schema electrica

Schema electrica este destul de simpla. Avem urmatoarele conexiuni electrice:

Arduino D2 --> DIN banda LED (atentie, banda LED NeoPixel are un pin DIN si unul DO - data out - conectati Arduino intotdeauna la DIN, in sensul indicat si de catre sageata imprimata pe cablajul benzii cu LED-uri), Arduino D4 --> term1nal 1 buton "paleta" dreapta, term1nal 2 buton "paleta" dreapta --> GND, Arduino D5 --> term1nal 1 buton "acceleratie" dreapta, term1nal 2 buton "paleta" dreapta --> GND,

 

 

​​​​​​​

​​​​​​​