This is an old revision of the document!


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

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.

Rezultate obtinute

Videoclip cu jocul jucat de mine.

Afisarea timpilor la interfata seriala dupa fiecare joc inregistrat:

800

Concluzie

Resurse

pm/prj2021/amocanu/ball_maze.1622641963.txt.gz · Last modified: 2021/06/02 16:52 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