Ball Maze🏀

Autor

Introducere

Proiectul implementeaza un joc format dintr-un labirint ce trebui parcurs cu o minge. Imputul este dat printr-un joystick ce controleaza inclinatia labirintului. Scopul jocului este de aduce migea din punctul A in punctul B si inapoi in A folosind doar inclinatia labirintului.

Descrierea Generala

In functie de inputul joystickului (voltajele oferite de acesta), voi controla voltajul trimis la 2 motoare diferite.

Motoarele servo au scopul de a mentine/updata inclinatia labirintului. Am nevie de 2 motoare; unul pentru a control incinatia pe OX, iar altul pe OY.

Servo motorul OY invarte in jurul axei sale tot planul albastru, pe care este aplasat servo motorul OX. La randul sau servo motorul OX invarte labirintul in jurul propriei axe. Astfel labirintul poate fi inclinat cu unghiuri variate, de jur imprejurul centrului sau.

Senzorul de lumina este folosit pentru a calcula durata parcurgerii labirintului.

Un joc complet inseama plecarea de langa senzorul de lumina, parcurgerea intr-un sens al labirintului si intoarecerea inapoi langa senzorul de lumina in sens invers.

Hardware Design

  1. Arduino Mega2560
  2. Joystick
  3. 2 Motoare Servo
  4. Senzor de lumina
  5. BreadBoard
  6. Fire

800

800

Designul este unul modular (labirintul poate fi dat jos usor prin desfacerea celor 2 piulite si desurubarea senzorului de lumina), ceea ce face ca labirintul sa poata fi inlocuit usor cu designuri noi.

Software Design

Un ciclu in functia loop() are urmatorii pasi:

  • Citirea inputului analogic de la joystick;
  • Transformarea inputului in output pentru servo motoare;
  • Transmiterea datelor catre servo motoare;
  • Citirea inputului de la senzorul de lumina si schimbarea starii jocului (daca este nevoie);

Inputul primit de la joystick este analogic si are valori cuprinse in intervalul [0-1023] pe fiecare din cele 2 axe. Outputul cate servo este dat sub forma unghiurilor de in clinare. Am ales ca inclinarea maxima sa fie 15 grade pe fiecare dintre cele 4 directii. Asadar am ales functia de gradul 1 : f(x) = 30 / 1024 * x, unde x este valoare de la joystick pe una dintre cele 2 axe, pentru a transforma inputul in output pentru servo motoare. Intucat outputul este de formt int, functia nu este discreta si se comporta defapt ca parte_intreaga_inferoara( 30 / 1024 * x ).

Pentru a inregistra timpul de parcurgere al jocului, variabila game_state se poate afla in 2 stari posibile: ongoing sau finished. Starea ongoing este asociata citirii valorii 0 de la senzorul de lumina (lumina nu este blocata de bila), iar starii finished ii este asociata valoarea 1.

Un joc nou este terminat daca game_state este ongoing iar de la senzor se citeste starea finished. Un nou joc este inceput daca game_state este finished iar la senzor se citeste ongoing timp de minim 5 secunde consecutive. Timpul in joc este calculat ca diferenta intere valorii millis() la finalul si inceputul jocului.

Rezultate obtinute

Prezentarea unui demo al jocului.

Afisarea timpilor la interfata seriala dupa fiecare joc inregistrat:

800

Concluzie

Montajul tehnic a fost cea mai grea parte a proiectului.

Din punct de vedere al softwareului am ajuns la concluzia ca 30 de grade de miscare pe fiecare axa este alegerea optima.

Resurse

pm/prj2021/amocanu/ball_maze.txt · Last modified: 2021/06/02 18:21 by rares.badita
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