Scopul proiectului consta in realizarea unui zar electronic cu generare random in momentul in care se opreste din “amestecat”.
Se foloseste un accelerometru care va inregistra momentul in care placuta nu se mai misca si atunci va genera un numar random care va fi afisat pe cele 18 led-uri.
Am folosit la crearea proiectului urmatoarele componente :
Scopul zarului este de a economisi timpul si energia impatimitilor de table sau de orice joc in care sunt implicate zarurile.
Doar printr-ro simpla agitare a placutei se poate genera un numar de pe un zar complet aleator.
In faza incipienta componentele proiectului si placa au aratat asa :
http://elf.cs.pub.ro/pm/wiki/_detail/prj2010/amocanu/proiect2.jpg?id=prj2010%3Aamocanu%3Azar
Ideea de baza de la care am plecat a fost aceea de a conecta pe pinii microcontrollerului led-uri, iar pe unul din ADC-uri outputul pe care il primesc de la accelerometru. In acest fel pot controla cand anume sa generez numarul random care va fi afisat pe led-uri.
Sub indrumarea domnului Adrian Mocanu, am proiectat si modul in care se conecteaza accelerometrul la Atmega16. Astfel, dupa cum se poate observa si mai jos, am conectat :
Led-urile care vor fi functionale au fost conectate la Port B si Port D al placii de baza. Celelalte Led-uri au fost conectate la Port C pentru o eventuala folosire ulterioara.
Proiectul ar trebui sa functioneze in felul urmator :
Pozele de la faza finala in care arata proiectul atasat pe placa de baza le puteti gasi aici :
Fiind un proiect bazat pe foarte multe LED-uri, a trebuit sa proiectez un circuit imprimat pentru a-mi usura munca la faza de lipire a componentelor. Pentru aceasta, m-am folosit de programul Eagle pentru a realiza PCB-ul si deasemenea circuitul rutat.
A aparut o schimbare in designul placutei! Pentru ca tensiunea care cadea pe led-uri era mult prea mare pentru cat suportau ele, am introdus pe intrarea fiecareia o rezistenta de 1k, la fel cum s-a procedat si cu ledurile de pe placuta de baza. Astfel limitam tensiunea care cate pe acestea, evitand evenimente neplacute ( arderea unuia sau mai multe led-uri ). Noul circuit arata la fel ca cel de mai jos, dar are pe fiecare intrare a fiecarui led o rezistenta.
Pentru poza Click aici:
http://elf.cs.pub.ro/pm/wiki/_detail/prj2010:amocanu:01062010034.jpg
Le puteti vedea in continuare :
!!!!!! SPOR LA JOACA !!!!!!!
#include <util/delay.h> #include <avr/interrupt.h> #define XCHANNEL 0 // DEFINIREA CANALELOR PE CARE O SA CITESC DIN ADC #define YCHANNEL 1 #define zar1 0x08; // DEFINIREA PINILOR PE CARE SE VA TRANSMITE SEMNAL #define zar2 0x12; // cAND SE SELECTEAZA UN ZAR #define zar3 0x49; #define zar4 0x55; #define zar5 0x5D; #define zar6 0x77; #define zar7 0x7F; #define MEAN 500 // DEFINIREA UNEI TENSIUNI DE REFERINTA PENTRU X SI PT Y #define MEANY 500 int val = 0; uint8_t i=0; void afisare(int x, int zar){ // FUNCTIA DE AFISARE A UNUI ZAR GENERAT if(zar == 1){ if (x==1) {PORTB = zar1;} if (x==2) {PORTB = zar2;} if (x==3) {PORTB = zar3;} if (x==4) {PORTB = zar4;} if (x==5) {PORTB = zar5;} if (x==6) {PORTB = zar6;} //PORTB = zar4; } if(zar == 2){ if (x==1) {PORTD = zar1;} if (x==2) {PORTD = zar2;} if (x==3) {PORTD = zar3;} if (x==4) {PORTD = zar4;} if (x==5) {PORTD = zar5;} if (x==6) {PORTD = zar6;} //PORTD = zar3; } } void ADC_stop(){ // FUNCTIA DE STOP A ADC-ULUI. VA FI FOLOSITA IN MAIN ADCSRA = 0; } int ADC_get(uint8_t channel) // FUNCTIE DE CITIRE DE LA ADC ( COPIATA DIN LAB 6 ) { ADMUX &= 0xE0; ADMUX |= channel; ADCSRA |= _BV(ADEN)|_BV(ADSC); while(!(ADCSRA & (1<<ADIF))); return ADC; } void ADC_init(void) // FUNCTIE DE INITIALIZARE A ADC ( COPIATA DIN LAB 6 ) { // AVCC cu condesator pe AREF; PA7 ca input single ended; rezultat left-adjusted (8 biti de date) ADMUX = (1<<REFS0); // activeaza ADC . Prescaler de ceas la maximum ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); } int main(){ DDRB = 0xFF; // setam pinii B pe output DDRD = 0xFF; // setam pinii D pe output DDRA = 0x00; // setam pinii A pe input ADC_init(); // initializam ADC //PORTA = 0xFF; //PORTB = 0x00; //PORTD = 0x00; int zar11 = 0; // INITIALIZARE VARIABILA PENTRU ZARUL GENERAT PENTRU ZAR 1 int zar22 = 0; // INITIALIZARE VARIABILA PENTRU ZARUL GENERAT PENTRU ZAR 2 int xval = 0; // INITIALIZARE VARIABILA PENTRU CITIRE DE LA ADC PE AXA X int yval = 0; // INITIALIZARE VARIABILA PENTRU CITIRE DE LA ADC PE AXA Y while(1){ xval = ADC_get(XCHANNEL); // CITIRE VALOARE ADC PENTRU X yval = ADC_get(YCHANNEL); // CITIRE VALOARE ADC PENTRU Y while( ((xval > 300) && (xval < 500)) || ((yval > 300) && (yval < 500)) ) // ATAT TIMP CAT ZARUL SE AMESTECA { xval = ADC_get(XCHANNEL); // SE CITESTE VALOARE PENTRU Y yval = ADC_get(YCHANNEL); // SE CITESTE VALOARE PENTRU X } ADC_stop(); // OPRESTE CITIREA DE PE ADC //afisare(1,6); //afisare(2,6); zar11 = xval%6+1; // GENERARE ZAR RANDOM PENTRU ZARUL 1 zar22 = yval%6+1; // GENERARE ZAR RANDOM PENTRU ZARUL 2 afisare(zar11,1); // AFISEAZA ZARUL GENERAT PE ZARUL 1 DE PE PLACUTA afisare(zar22,2); // AFISEAZA ZARUL GENERAT PE ZARUL 2 DE PE PLACUTA _delay_ms(5000); ADC_init(); } }
ARHIVA PROIECTULUI : http://elf.cs.pub.ro/pm/wiki/_detail/prj2010/amocanu/Dinu_Andrei_proiectPM_ZAR.rar
ARHIVA CONTINE :