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 :

  • Rezistenta + condensator pe iesirile Yout si Xout pentru a filtra semnalul primit
  • O dioda si un condensator pe VDD si VDA pentru a evita fluctuatiile de tensiune de la microcontroller
  • Deasemenea , am conectat VREF de la accelerometrul la AREF de la microcontroller

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 :

  • Se conecteaza placa de baza la o sursa de tensiune
  • Se “amesteca” zarul ( placuta )
  • Se opreste placuta din amestecat
  • 2 numere generate random vor aparea pe led-urile de pe placuta

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 :

  • circuitul hard :

  • Componente conectate la porturile Atmega16:

  • Componente conectate la Atmega16 :
    • Pe portul B respectiv D, incepand de la pinii 0…7 sunt conectate led-uri
    • Pe portul A pe pinii 0 si 1 sunt conectate outputurile accelerometrului pe axa X respectiv Y
    • Pe portul A pe pinul 9 este conectat VREF al accelerometrului la AREF al Atmega16
    • Pe portul C pe pinii 0…4 sunt conectate ledurile de aspect ( care nu intra in componenta zarului )
    • In rest sunt legate componente la GND si VCC
  • Board Design-ul :

Software Design

  • FUNCTII FOLOSITE:
    • O functie pentru afisarea zarului generat pe unul din zarurile de pe placuta
    • O functie pentru oprirea citirii de pe ADC
    • O functie pentru initializarea ADC-ului ( preluata din laboratorul 6 )
    • O functie pentru citirea de la ADC ( preluata din laboratorul 6 )
  • Descriere :
    • In while-ul principal din main am folosit inca un while in care verific cat timp se “amesteca zarul”. Am folosit doua valori de referinta pe care nu le-am putut identifica exact, de aceea s-ar putea ca zarul sa nu functioneze corect. In acest while se citesc succesiv valorile intoarse de ACCELEROMETRU.
    • In momentul in care zarul a fost oprit din amestecat, se dezactiveaza ADC-ul pentru a nu mai genera citiri.
    • Se calculeaza valorile dupa formula : valoare % 6 + 1
    • Se afiseaza valorile obtinute pe led-urile de pe placuta, specifice fiecarui zar in parte.

!!!!!! 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

  • Cumpararea listei de piese necesare
  • Realizarea schemei in Eagle a placutei
  • Imprimarea si corodarea placutei
  • Lipirea componentelor
  • Realizarea unui program de test pentru placuta
  • Probleme cu bootloaderul de pe placuta de baza ( rescriere bootloader )
  • Problema aparuta din cauza tensiunii mult prea mari care cadea pe un led ( led ars )
  • Rezolvarea acestei probleme prin adaugarea unei rezistente de 1k pe intrarea fiecarui led
  • Realizarea softului final ( in mare masura )
  • Testarea softului pe placuta. Problema cu bootloader ( din nou )

Download

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

ARHIVA CONTINE :

  • Pozele cu proiectul
  • Schema in Eagle si PCB-ul
  • Codul sursa, codul compilat si un makefile
pm/prj2010/amocanu/zar.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