Mihaela CĂLINESCU - POV Analogic Clock

Autorul poate fi contactat la adresa: Login pentru adresa

Introducere

Prezentarea pe scurt a proiectului meu:

  • ce face
  • care este scopul lui
  • care a fost ideea de la care am pornit
  • de ce cred că este util pentru alţii şi pentru mine

  • Proiectul reprezinta un ceas cu afisaj analogic bazat pe principiul POV(Persistance of Vision). In traducere libera, este vorba despre fenomenul de inertie a retinei care face ca o imagine sa persiste pe aceasta (nr. retina) 1/25 sec. Bazandu-ne pe acest fapt, vom construi o suprapunere rapida de imagini diferite dar succesive ce va avea rezultatul unei animatii pentru ochiul uman.
  • Scopul acestui proiect este studierea fenomenului despre care am vorbit mai sus si exemplificarea acestuia intr-un mod atractiv intrucat oricine stie ce este un ceas analogic, dar nu oricine s-a gandit ca dintr-o insiruire liniara de doar cateva leduri se poate obtine un produs atat de popular. Pentru studenti are scopul de a aprofunda cunostiintele dobandite in cursul laboratorului.
  • Ideea de la care am pornit a fost simplificarea unui proiect pe care l-am vizualizat impreuna cu asistentul la primul laborator. POV pe roata unei biciclete. Mi s-a parut unul dintre cele mai interesante fenomene - as spune chiar spectaculoase in anumite situatii - pe care le putem testa cu resurse relativ restranse si nu foarte costisitoare.
  • Utilitatea pentru cei ce vad direct rezultatul final este de constientizare a comportamentului organismului in anumite situatii (aici ochiul uman in conditii de variatie rapida a unor imagini ce se succed logic - foarte asemanatoare).Pentru persoana care creeaza dispozitivul intervin intelegerea si abilitatea de folosire a suportului teoretic in sincron cu cel practic (componentele fizice).

Descriere generală

Schema bloc pentru partea software este prezentata in figura de mai sus. Dupa cum se observa, programul consta intr-o bucla infinita in care la fiecare pas se recalculeaza timpul sub forma de ora, minute, secunde, se ordoneaza limbile conform datelor obtinute dupa care se afiseaza rezultatul.

Pentru partea hardware vom folosi cablajul imprimat din 2013 care contine controlerul ATMEGA324, vom alimenta cu ajutorul unei baterii de 9V iar output-ul va fi redirectionat pe o placuta cu LED-uri.

Hardware Design

Lista piese:

  • 6 LED-uri rosii albastre (cele rosii au fost lipite invers si am fost nevoita sa le inlocuiesc, avand la dispozitie doar leduri albastre)
  • 6 rezistente 2K2
  • o baterie de 9V
  • placuta cu cablaj imprimat PM2013
  • placuta de test
  • adaptor baterie 9V cu mufa jack
  • cooler 120mm
  • 7 conectori de tip mama-mama
  • generator pentru alimentare cooler 12V

Software Design

Pentru programarea microcontrolerului ATMEGA324PA am folosit limbajul C si WinAvr. Programul consta intr-o bucla infinita in care, la fiecare pas sunt recalculate valorile pentru ora, minut si secunda. Implementarea este prezentata mai jos:

pm.c
#include <avr/io.h>
#define F_CPU 16000000
#include <util/delay.h>
 
#define HOURS 3
#define MINUTES 17
#define SECONDS 50
#define PERIOD 121
#define ON_TIME 2
 
void switch_line(double *a, double *b){
	double aux;
	aux = *a;
	*a = *b;
	*b = aux;
}
 
int angleToMs(double angle){
	return (int)(PERIOD * angle/360);
}
 
int main(){
	double h = HOURS, m = MINUTES, s = SECONDS; 
	double ms = 0;
	double angle_hour, angle_minute, angle_second;
	int current_time, aux;
 
	DDRD = 0xFF;
	PORTD = 63; 
 
	while(1){
		angle_hour = (double)360/12 * h + (double)360/(12*60) * m + (double)360/(12*60*60) * s;
		angle_minute = (double)360/60 * m + (double)360/(60*60) * s;
		angle_second = (double)360/60 * s;
 
		if(angle_minute > angle_second)
			switch_line(&angle_minute, &angle_second);
		if(angle_hour > angle_minute)
			switch_line(&angle_hour, &angle_minute);
		if(angle_minute > angle_second)
			switch_line(&angle_minute, &angle_second);
		current_time = 0;
		aux = angleToMs(angle_hour);
		_delay_ms(aux);
		PORTD = PORTD ^ 63; _delay_ms(ON_TIME); PORTD = PORTD ^ 63;
		current_time += (aux + ON_TIME);
 
		aux = angleToMs(angle_minute) - current_time;
		if(aux > 0){
			_delay_ms(aux);
			PORTD = PORTD ^ 63; 
			_delay_ms(ON_TIME); 
			PORTD = PORTD ^ 63;
			current_time += (aux + ON_TIME);
		}
		aux = angleToMs(angle_second) - current_time;
		if(aux > 0){
			_delay_ms(aux);
			PORTD = PORTD ^ 63; 
			_delay_ms(ON_TIME); 
			PORTD = PORTD ^ 63;
			current_time += (aux + ON_TIME);
		}
		aux = PERIOD - current_time;	
		if(aux > 0)
			_delay_ms(aux);
 
		ms += PERIOD;
		if(ms >= 1000){
			s ++;
			ms = ms - 1000;
		}
		if(s == 60)	{
			m ++;
			s = 0;
		}
		if(m == 60){
			h ++;
			m = 0;
		}
		if(h == 12)
			h = 0;
	}
	return 0;
}

Rezultate Obţinute

In imaginile de mai sus vedeti forma finala a proiectului, o captura din timpul functionarii, precum si LED-urile lipite incorect (cu bornele inversate) si inlocuite reprezentand daunele proiectului :-D

Concluzii

  • Rezultatul obtinut reprezinta un proiect functional.
  • Partea cea mai dificila o reprezinta stabilizarea sistemului, intrucat nu l-am putut echilibra perfect.
  • De asemenea, folosind un cooler nu am putut controla viteza si turatia astfel incat sa obtin valori constante ale acestora.
  • Daca baza coolerului ar fi bine fixata pentru a diminua oscilatiile atunci viteza s-ar stabiliza.
  • Pentru ca am folosit un motor DC (cel al cooler-ului) determinarea turatiei a fost foarte dificila implicand modificari repetate ale codului pentru a obtine un rezultat cat de cat satisfacator.
  • Pe viitor, pentru imbunatatirea performantei sistemului, s-ar putea folosi un motor pas cu pas sau chiar un senzor pentru masurarea duratei unei rotatii complete care ar ajuta la determinarea turatiei.

Bibliografie/Resurse

pm/prj2013/avoinescu/pov-clock.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