This is an old revision of the document!
Proiectul este o implementare a clasicului joc de pinball. Jocul conține mai multe ținte, ce odată lovite cresc scorul jucătorului (afișat pe ecranul LCD). Jucătorul lovește mingea cu ajutorul unor flippere, acționate prin butoane. Odată ce mingea pătrunde printre flippere jocul se încheie!
Scopul proiectului este divertismentul celor care vor să joace acest arcade game iubit de generații întregi!
Se acționează un buton de start, pentru a porni jocul. Pe tot parcurul lui, scorul curent este vizibil pe ecranul LCD. Mingea va fi propulsată printr-un mecanism mecanic în spațiul de joc. Spațiul de joc este construit din carton, sub forma unui plan înclinat. Jucătorul va acționa prin două butoane laterale flipper-ele. Flipper-ele sunt montate pe servomotoare. De fiecare dată când un buton este apăsat, flipper-ul corespunzător se rotește cu un număr de grade (același pe tot parcurul jocului), după care revine în poziția inițială.
Țintele pe are mingea trebuie să le atingă vor avea punctaje diferite, în funcție de cât de accesibile sunt, iar pentru a detecta când sunt lovite, acestea vor conține limit switch-uri.
Atunci când mingea trece printre flippere, jocul se încheie și se afișează scorul final. Detectarea acestui incident se face tot cu ajutorul unui limit switch montat în planul înclinat, în zona de ieșire.
Listă componente:
În implementarea schemei de pe Tinkercad am folosit slide switch-uri, deoarece nu există limit switch-uri în Tinkercad. Slide switch-urile au, la fel ca limit switch-urile, 3 pini: COM, NO și NC.
În setup() am configurat pinii de input și output și lcd-ul, am atașat pinii corespunzători variabilelor de tip Servo prin care se controlează cele două servomotoare. În loop() se apelează mai întâi funcția checkStart() prin care jocul poate fi pornit sau repornit prin apăsarea butonului de start. Dacă jocul este pornit se pot acționa cele două servomotoare prin apăsarea butoanelor (buttonControl()), se verifică toate target-urile (limit switch-uri) prin funțiile corespunzătoare, dar și dacă jucătorul a atins un scor maxim (checkWin()) sau dacă mingea a ieșit din joc (checkSwOut()). Dacă target-urile sunt atinse scorul este incrementat. Dacă este atins switch-ul montat la ieșirea din spațiul de joc, înainte de atingerea scorului maxim, jucătorul pierde. Dacă jucătorul atinge scorul maxim a câștigat!
Pe parcursul jocului ecranul LCD afișează status-ul jocului: “Game started!”, scorul curent, “You won!” sau “You lost!”. Pentru afișarea mesajelor pe display a fost necesar să găsesc mai întâi adresa I2C a acestuia, cu ajutorul unui loop for care a iterat printre adresele posibile și al funcțiilor Wire.beginTransmission(address) și Wire.endTransmission(). După găsirea adresei (0x27), am eliminat această bucată de cod.
În funcțiile care detectează dacă switch-urile au fost acționate am folosit tehnica de debouncing pentru a evita rezultate neașteptate, cum ar fi incrementarea scorului de mai multe ori atunci când un switch este apăsat o singură dată. Pentru a obține timpii când au fost acționate switch-urile am utilizat funcția milis().
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.
11.05.2022: Realizare schemă pe Tinkercad și schemă electrică
12.05.2022: Realizare schema bloc
20.05.2022: Testarea primei versiuni de cod pe Tinkercad
21.05.2022 - 22.05.2022: Asamblare circuit și testare a componentelor
23.05.2022 - 27.05.2022: Construcția mesei de joc
27.05.2022: Finalizare pagină wiki
Resurse Software:
Resurse Hardware: