LED Rubik's Cube

Contact

Email: chiornitaadrian@gmail.com

Introducere

Analizând proiectele din anii trecuți, acestea m-au inspirat să fac un LED Cube, însă nu știam ce utilizare pot să îi atribui. Așa mi-a venit ideea să fac un cub rubik care se poate manipula din butoane, fără a se mai pune problema degradării unui cub fizic după un număr de rezolvări.

Consider că este un proiect destul de interesant și complex, iar prin realizarea acestuia voi învăța destul de multe. În plus, un cub rubik pe care să îl poți folosi fără să il uzezi pare a fi un dispozitiv util pentru pasionați.

Descriere generală

Logica proiectului este destul de simplă: microcontroller-ul va primi un input (de la butoane) pe baza căruia va face niște prelucrări, și va realiza mutarea pe cub (se vor aprinde alte culori pe LED-urile RGB) - output.

Schema bloc


Schema electrica

Probabil voi folosi și un afișaj LCD pentru a vedea pe ce față a cubului se fac mișcările și cât timp a trecut de când am început rezolvarea acestuia.


Interfața cu utilizatorul (player)

Utilizatorul va putea acționa 4 butoane de control al unei fețe, unul de schimbare a feței și unul de start/stop game.

  • Butonul start/stop game va porni jocul, cât și timpul de pe LCD (probabil va amesteca și cubul pentru un nou joc)
  • Butonul de schimbare a feței va cilca prin cele 6 fețe ale cubului (pentru a aplica mișcările doar pe acea față)
  • Cele 4 butoane de control al unei fețe vor genera mișcările pentru acea față

Hardware Design

Lista de piese

  • ATMEGA 324
  • 54 LED-uri RGB (voi folosi banda de WS2812B)
  • 5 Butoane
  • LCD 16×2
  • condensatoare, rezistențe, diode, etc.

Software Design

Dacă în hardware design cea mai grea parte mi s-a parut lipirea cubului, atunci cand am ajuns la software design m-am lovit de rotirea cubului. Analizând situația în detaliu am găsit o mapare a vectorului de led-uri (cubului) la ceva mai asemănător cu un cub, pentru realizarea mai rapidă a mișcarilor (o matrice de 6x3x3 (față, linie, coloană) = culoarea).

Am implementat apoi o funcție de duplicare și una de initializare a cubului. După care m-am folosit de notația clasică a mișcărilor și am implementat r, ri, l, li, d, di. De aici toate celelalte funcții de logică a cubului au devenit ușor de implementat. Amestecarea cubului se face la fiecare joc nou.

Am folosit întreruperi pentru Timer-ul 1, mod CTC, la o secundă pentru afișarea timpului scurs de la începutul jocului (se resetează la NEW GAME), dar și întreruperea PCINT0 pentru a verifica dacă butonul de schimbat fața este ținut jos sau doar apăsat (hold = reset, pressed = face switch).

Pentru LCD folosesc biblioteca din laborator, iar pentru banda de led-uri folosesc o biblioteca pentru WS2812B găsită pe GitHub.

Atașez aici și codul sursă:
led_rubik_cube_code.zip

Rezultate Obţinute

Deși a fost destul de greu să lipesc led-urile și să creez un software care să realizeze mișcările cubului, rezultatul este unul satisfăcător. Am să atașez și imagini și un video scurt cu proiectul final.

Concluzii

Pot spune că prin intermediul acestui proiect am avut prima mea realizare în lumea embeded, am aflat foarte multe informații despre AVR, Eagle, cât și despre bucăți de hardware. Această realizare m-a făcut mult mai curios să invăț lucruri noi în acest domeniu, așa că mai rămâne doar să îmi hrănesc curiozitatea.

Jurnal

- Realizarea plăcii de bază

- Procurarea pieselor adiționale

- Comandarea led-urilor necesare

- Realizarea plăcuței de butoane

- Testarea LCD-ului text 2 x 16

- Realizare cub de led-uri

- Realizare carcasă

- Creare de cod și îmbunătățiri

Bibliografie/Resurse

WS2812B Datasheet: WS2812.pdf

Generare PDF

pm/prj2019/mlungoci/rubikscube.txt · Last modified: 2021/04/14 17:07 (external edit)
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