Вы находитесь на странице: 1из 8

DETECTOR DE COLORES BLANCO Y NEGRO.

Por Carlos Humberto Molina Rodrguez Universidad del Soconusco Este tutorial pretende sentar las bases para la elaboracin de un carrito seguidor de lneas programado, que se han puesto tan de moda e incluso existen torneos nacionales e internacionales organizados por universidades, estos carritos llamados robots seguidores de lneas se construyen segn las bases de los torneos en que participarn por ejemplo algunos torneos exigen que el chasis del robot sea de materiales reciclados como tapas de frascos de mayonesa para las llantas, tambin se dividen en categoras analgico y digital, en los analgicos la inteligencia del robot es a base de transistores y en el digital tambin llamado programados se utilizan microcontroladores para la toma de decisiones siendo esta categora la que considero de mayor reto. Podemos dividir el circuito del seguidor de lneas en 2 partes, el reconocimiento de la lnea (por lo regular una lnea negra sobre una superficie blanca, aunque puede ser lo contrario) y el control de los motores de las llantas. En este tutorial nos enfocamos al reconocimiento del color de la lnea, para eso utilizaremos un sensor de luz reflectante. Sensor de luz El sensor de luz ms comn es el LDR (Light Dependant Resistor) (Resistor dependiente de la luz). Tambin se le conoce como "Celda fotoelctrica" o fotoresistencia. Un LDR es bsicamente un resistor que cambia su resistencia cuando cambia la intensidad de la luz. Como los LDRs son simplemente resistores, se puede conectar sencillamente al ADC del Atmega48.

El principio de un sensor reflectante es muy sencillo cuando emitimos luz sobre una superficie blanca esta absorbe la luz y no refleja o rebota la luz por lo cual el LDR no capta intensidad suficiente para cambiar su estado, cuando la superficie sobre la que se proyecta la luz es negra, se reflejar hacia el LDR y este cambiara su estado. Podemos fabricar los sensores reflectantes con un

LED brillante y un LDR. Tengamos en cuenta que el alcance de este sensor ser muy limitado, adems de que tendremos mucha interferencia por la luz ambiental.

Para una mejor deteccin podramos sustituir los elementos anteriores por sus contrapartes infrarrojas.

Tambin puede comprar los sensores reflectantes IR. Generalmente vienen en un tamao compacto y las lecturas de los sensores son ms fiables. QRD1114-ND

CNY70

Para nuestro ejemplo he utilizado el sensor QRD1114-ND ya que me fue el ms fcil de conseguir pero funciona igual para un CNY70 o cualquiera hecho a mano, necesitamos una resistencia de 10khoms y una de 220 homs para el sensor, conectamos la salida del sensor al ADC canal 0 (PC0).

Cuando el sensor lee blanco da un voltaje cercano a cero y cuando lee negro da un voltaje cercano a 5, variando segn la intensidad de luz ambiente y otras fuentes adems de la cercana del sensor con la superficie por lo que habr que regular la distancia hasta obtener valores linealmente separables, recomiendo que la salida del sensor se conecte a un circuito amplificador LM358N este nos devolver 0 si es blanco o 5 si es negro, para no trabajar con valores intermedios, tambin aconsejo que la fuente de alimentacin de los sensores y el LM358N sea diferente de la que alimenta al microcontrolador. LM358N (se pueden filtrar las salidas de 2 sensores)

Conectamos la salida del sensor al Input A +, el Input A va a tierra, alimentamos la pata 8 con 5V y la cuatro la ponemos a tierra, el Output A (pata 1) lo conectamos al ADC 0 del micro.

Utilizaremos el LCD para desplegar la lectura del sensor, si el ADC nos da un valor menor de 50 entonces estaremos leyendo color blanco, sino estaremos leyendo color negro, si el sensor no est colocado en posicin correcta sobre la superficie, por ejemplo tenemos el sensor colocado hacia arriba este captara la luz ambiente y el display nos marcar negro. Recuerden que el sensor marca negro cuando la luz del diodo se refleja sobre la superficie, en este caso la luz que capta no es la del diodo sino la del ambiente. Configura el LCD y ADC (8 bits) como se explica en los tutoriales respectivos, este el cdigo fuente:

/***************************************************** This program was produced by the CodeWizardAVR V2.03.4 Standard Automatic Program Generator Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l. http://www.hpinfotech.com Project : Version : Date : 28/04/2009 Author : Company : Comments: Chip type : ATmega48 Clock frequency : 1.000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 128 *****************************************************/ #include <mega48.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x05 ;PORTB #endasm #include <lcd.h> #include <stdio.h> // incluir libreria para menjo de cadenas #include <delay.h> #define ADC_VREF_TYPE 0x60 unsigned int temp; char cadena2[10]; // Read the 8 most significant bits // of the AD conversion result unsigned char read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion

ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCH; } // Declare your global variables here void main(void) { // Declare your local variables here // Crystal Oscillator division factor: 8 #pragma optsizeCLKPR=0x80; CLKPR=0x03; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif // Input/Output Ports initialization // Port B initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTB=0x00; DDRB=0x00; // Port C initialization // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In // State6=T State5=T State4=T State3=T State2=T State1=T State0=T PORTC=0x00; DDRC=0x00; // Port D initialization // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=Out Func0=Out // State7=T State6=T State5=T State4=P State3=P State2=P State1=0 State0=0 PORTD=0x00; DDRD=0xff; // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: Timer 0 Stopped // Mode: Normal top=FFh // OC0A output: Disconnected // OC0B output: Disconnected TCCR0A=0x00; TCCR0B=0x00; TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // // // // // // // Timer/Counter 1 initialization Clock source: System Clock Clock value: Timer 1 Stopped Mode: Normal top=FFFFh OC1A output: Discon. OC1B output: Discon. Noise Canceler: Off

// Input Capture on Falling Edge // Timer 1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 2 initialization // Clock source: System Clock // Clock value: Timer 2 Stopped // Mode: Normal top=FFh // OC2A output: Disconnected // OC2B output: Disconnected ASSR=0x00; TCCR2A=0x00; TCCR2B=0x00; TCNT2=0x00; OCR2A=0x00; OCR2B=0x00; // External Interrupt(s) initialization // INT0: Off // INT1: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-14: Off // Interrupt on any change on pins PCINT16-23: Off EICRA=0x00; EIMSK=0x00; PCICR=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=0x00; // Timer/Counter 1 Interrupt(s) initialization TIMSK1=0x00; // Timer/Counter 2 Interrupt(s) initialization TIMSK2=0x00; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; ADCSRB=0x00; // // // // // // ADC initialization ADC Clock frequency: 250.000 kHz ADC Voltage Reference: AVCC pin ADC Auto Trigger Source: None Only the 8 most significant bits of the AD conversion result are used

// Digital input buffers on ADC0: Off, ADC1: Off, ADC2: On, ADC3: On // ADC4: On, ADC5: On DIDR0=0x03; ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x82; // LCD module initialization lcd_init(16); while (1) { // Place your code here temp=read_adc(0); //leer estatus del sensor sprintf(cadena2,"%d",temp); //convierte temp para poder imprimir con lcd_puts() lcd_clear(); lcd_gotoxy(4,0); lcd_putsf("Color:"); if (temp<50) { lcd_putsf("Blanco"); } else { lcd_putsf("Negro"); } lcd_gotoxy(4,1); lcd_puts(cadena2); delay_ms(2000); }; }

Ahora ya podemos diferenciar entre el color blanco y negro, el siguiente paso es implementar un sensor ms en el canal ADC 1 e imprimir ambos valores. En el prximo tutorial hablaremos del circuito de potencia para implementar los motores y la lgica de un robot seguidor de lneas, dudas o comentarios en los foros ya saben. Una disculpa si omit algo o fui muy escueto, tengo que aclarar que no soy especialista en electrnica es ms bien un hobbie y satisfacer mi curiosidad de cmo funcionan las cosas, soy Licenciado en Informtica por el Tecnolgico de Tapachula y Maestro en Ciencias Computacionales con Especialidad en Base de Datos por la UVG de Tapachula , mi fuerte es la programacin de sistemas, mi primer contacto con microcontroladores ATMEL fue en la MCC que estudio en la UAG y de ah mi aficin. Carlos Humberto Molina Rodrguez, Jefe del Depto. De Desarrollo de Sistemas del H. Ayuntamiento Municipal de Tapachula, Chiapas y Catedrtico de la Universidad del Soconusco.
charliesw@hotmail.com

www.comunidadatmel.com