Table of Contents

Introducere

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.

Descriere generală

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 :

Hardware Design

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.

FIXME FIXME FIXME 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. FIXME FIXME FIXME

Pentru poza Click aici:

http://elf.cs.pub.ro/pm/wiki/_detail/prj2010:amocanu:01062010034.jpg

Le puteti vedea in continuare :

Software Design

!!!!!! 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();

				
	
	
			}

	
}

Bibliografie/Resurse

Jurnal

Download

ARHIVA PROIECTULUI : http://elf.cs.pub.ro/pm/wiki/_detail/prj2010/amocanu/Dinu_Andrei_proiectPM_ZAR.rar

ARHIVA CONTINE :