Cómo funciona:
el sensor consisten de sensor LDR y LED RGB, por lo que cuando se pone el objeto en el sensor de la luz que emiten de RGB LED había reflejada del objeto al sensor LDR y lea por ADC de ATMEGA16 como siguiente secuencia:
1-Encienda la azul en RGB LED y espera.
2-leer ADC y almacenar en el registro como azul.
3-Encienda la verde RGB LED y espera.
4-lectura ADC y almacenar en el registro como verde.
5-Encienda la roja en LED RGB y esperar.
6-lectura ADC y almacenar en el registro como rojo.
7-si rojo > verde > azul encienda la pantalla de LED rojos.
Si verde > rojo > azul encienda la pantalla LED verde.
Si el azul > rojo > verde encienda pantalla Led azul.
Calibración:
El RGB LED emisor rojo, azul y verde en diferente intensidad para ecualizarlos, resistencias variables se deben utilizar con pasos siguientes:
1-Ponga un objeto blanco en el sensor.
2-Encienda la azul en RGB y leer el voltaje a través del sensor LDR con voltímetro.
3-Encienda la verde RGB LED y leer el voltaje a través del sensor LDR con voltímetro.
4-de vuelta al rojo en RGB y leer el voltaje a través del sensor LDR con voltímetro.
5-ajustar las resistencias variables para hacer todo el voltaje igualado al objeto blanco puesta en el sensor.
Software (AVR studio 4):
#define F_CPU 1000000UL
#include < avr/io.h >
#include < util/delay.h >
void InitADC() //Initiate ADC
{
ADMUX = (1 << REFS0); Para Aref = AVcc;
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); Rrescalar div factor = 128
}
uint16_t ReadADC (uint8_t ch)
{
ch = ch & 0b00000111;
ADMUX| = ch;
Iniciar la conversión individual
ADCSRA| = (1 << ADSC);
Esperar para que la conversión completa
mientras (! () ADCSRA & (1 << ADIF)));
ADCSRA| = (1 << ADIF);
Return(ADC);
}
void Wait()
{
uint8_t.
para (i = 0; i < 1; i ++)
_delay_loop_2(0);
}
void main()
{
DDRB = 0XFF; Definir salida para LED RGB
DDRD = 0XFF; Definir salida para display LED
uint16_t rojo;
uint16_t verde;
uint16_t azul;
Inicializar el ADC
InitADC();
while(1)
{
PORTD = 0b11111111; Apagar la pantalla de LEDs
PORTB = 0b11111110; Enciende azul RGB
_delay_ms(2000); esperar 2s
Blue=ReadADC(0); Leer valor analógico y guardarlo en azul
PORTB = 0b11111101; Encienda verde RGB;
_delay_ms(2000); esperar 2s
verde = ReadADC(0); Leer valor analógico y guardarlo en verde
PORTB = 0b011111011; RGB rojo;
_delay_ms(2000); esperar 2s
rojo = ReadADC(0); Leer valor analógico y guardarlo en rojo
Si ((red > green) & (rojo > azul)) {PORTD = 0b11111110; _delay_ms(4000); PORTD = 0b11111111;} Pantalla roja
Si ((green > red) & (verde > azul)) {PORTD = 0b11111011; _delay_ms(4000); PORTD = 0b11111111;} Pantalla verde
Si ((blue > green) & (azul > rojo)) {PORTD = 0b11111101; _delay_ms(4000); PORTD = 0b11111111;} Pantalla azul
}
}