Você está na página 1de 8

UPM-DISAM CYBERTECH 2008 UPM-DIE

TALLER 4.
SEÑALES ANALÓGICAS

1.CONVERTIDOR ANALÓGICO/DIGITAL

El micro seleccionado para estos talleres tiene un convertidor analógico/digital. Esto quiere
decir que es capaz de procesar entradas analógicas. El puerto A/D permite convertir de señales
de entrada analógicas a un número digital de 10 bits.

En concreto, el PIC18F442 tiene 8 canales, esto es, 8 patillas que pueden ser utilizadas como
entradas analógicas (2,3,4,5,7,8,9,10) repartidas entre el puerto A y el puerto E. Para poder
usarlas como analógicas hay que configurar estos puertos con mucho cuidado.

Canales:

000 = channel 0, (AN0)

001 = channel 1, (AN1)

010 = channel 2, (AN2)

011 = channel 3, (AN3)

100 = channel 4, (AN4)

101 = channel 5, (AN5)

110 = channel 6, (AN6)

111 = channel 7, (AN7)

NOTA: Más información en el manual de microcontroladores.

Taller 4 1 Nera González Romero


UPM-DISAM Cybertech 2008 UPM-DIE

2. SENSORES ANALÓGICOS

SENSOR DE INFRARROJOS:

Ya vimos en el taller anterior cómo funciona un sensor de infrarrojos de corta distancia


(CNY70), y toda la teoría se puede trasladar a este taller. Consta de un emisor de
infrarrojos(diodo) que envía un haz y un receptor(fototransistor) que recibe la luz infrarroja
que rebota en un objeto. Pueden utilizarse como medidores de distancia o detectores de
presencia (establecemos un umbral de detección para una determinada intensidad de luz
infrarroja).

Hay una amplia gama de sensores desde infrarrojos, desde los que miden 5cm a los que miden
hasta 3m.

La efectividad de los sensores de infrarrojos depende mucho de la superficie sobre la que el


haz incide (material, rugosidad, inclinación y color) y de la luz ambiente. Por ello es
recomendable hacer algunas pruebas para determinar el umbral de detección en condiciones
ambiente idénticas a las del concurso.

SENSOR DE ULTRASONIDOS:

Aunque no lo vamos a utilizar en los talleres merece una mención especial porque es uno de
los sensores preferidos por los aficionados a los minirobotos.

Su funcionamiento es similar al del infrarrojo, pero en este caso se emite una onda de
ultrasonidos que rebota en un objeto o superficie y cuyo eco es recogido por un receptor.

Midiendo el intervalo de tiempo entre la emisión y la recepción se obtiene la distancia entre el


objeto y el sensor. También se puede umbralizar para obtener un sensor de presencia. Tienen
la ventaja de ser menos dependientes del tipo de superficie o del color, aunque algunos
objetos absorben más el ruido que otros. Suelen ser de larga distancia (hasta 9m).

Os recomendamos preguntar a los organizadores si queréis más información y, desde luego,


mirar en Internet.

CÁMARA:

Es una opción muy interesante para robots que se enfrenten a situaciones visuales
cambiantes. Se pueden encontrar cámaras que mandan al micro información ya procesada,
como el centro de masas de un color y el número de píxeles de un color predeterminado.

Suelen ser caras, pero cada vez hay más modelos asequibles.

Requieren mucho más trabajo, pero aporta mucho más aprendizaje y la información que se
obtiene con ellas es mucho más completa. Hay que tener en cuenta que les afecta mucho la
luz ambiente y los umbrales de color hay que determinarlos en condiciones reales de
funcionamiento.

Taller 4 2 Nera González Romero


UPM-DISAM Cybertech 2008 UPM-DIE

3. EL SENSOR DE NUESTRO TALLER: INFRARROJO GP2D12

Es un sensor analógico de infrarrojos de larga distancia de SHARP.

Su rango de detección es entre 10cm y 80cm, aunque se pueden encontrar otros sensores de
la misma familia que cubren otros rangos, como por ejemplo el GP2120, que tiene un rango
entre 4cm y 30cm. Los datos de fuera del rango no son fiables, esto lo podemos ver en la
siguiente gráfica, que muestra la relación entre distancia y voltaje (que es la señal que recibe el
micro).

Lleva toda la electrónica necesaria incorporada, y de él salen tres cables para alimentación y la
señal que va al micro (Vo).

Taller 4 3 Nera González Romero


UPM-DISAM Cybertech 2008 UPM-DIE

NOTA: Consumen bastante, es recomendable poner una alimentación adicional para ellos,
pero acordándose de que se alimentan a 5 V. Las masas deben estar unidas a las del resto del
circuito aunque la alimentación sea distinta.

4. CONECTAR UN SENSOR ANALÓGICO AL CONVERTIDOR A/D


/********PROGRAMA PARA LEER EL CONVERTIDOR A/D ********/
#include <p18f442.h>
#include <delays.h>
#include <adc.h>
#define led1 PORTDbits.RD0
#define led2 PORTDbits.RD1
#define led3 PORTDbits.RD2
#define analog1 PORTAbits.RA5
#define analog2 PORTEbits.RE0
#define analog3 PORTAbits.RE2
void main()
{
int result1, result2, result3;
TRISE=7; //analógicos entrada
TRISD=240; //Sensores entrada
TRISA=255; //analógicos entrada
OpenADC(ADC_FOSC_32 & ADC_RIGHT_JUST & ADC_8ANA_0REF, ADC_CH4 & ADC_INT_OFF);
Delay10TCYx(5);
while(1)
{
ConvertADC();
while(BusyADC());
result1=ReadADC();
SetChanADC(ADC_CH5);
ConvertADC();

Taller 4 4 Nera González Romero


UPM-DISAM Cybertech 2008 UPM-DIE
while(BusyADC());
result2=ReadADC();
SetChanADC(ADC_CH7);
ConvertADC();
while(BusyADC());
result3=ReadADC();
SetChanADC(ADC_CH4);
if(result1<300) led1=1;
else led1=0;
if(result2<300) led2=1;
else led2=0;
if(result3<300) led2=1;
else led3=0;
}
CloseADC();
}

COMENTARIOS:

- Se incluye la librería adc.h para usar las funciones relacionadas con el convertidor A/D.

- En este ejemplo, se han utilizado tres sensores analógicos, conectados en los cales 4, 5 y 7,
correspondientes con las patillas RA5, RE0, RE2.

- La configuración del puerto A y el puerto E es compleja, no se puede utilizar el puerto A para


entradas digitales en algunas patillas y para entradas analógicas en otras.

- Para habilitar el convertidor analógico utilizamos la función OpenADC( ), con los argumentos
que la siguen. Después de eso añadimos un delay para asegurarnos que se ha abierto.

- Cuando terminamos de utilizar el convertidor A/D lo cerramos con CloseADC( )

- Fragmento de código para leer cada canal:

ConvertADC(); //empieza el proceso de conversión


while(BusyADC()); //espera para completar la conversión
result1=ReadADC(); //lee el resultado de la conversión y lo guarda en la //
variable result1
SetChanADC(ADC_CH5); //selecciona el canal para la próxima conversión
- Al final leemos el resultado de la conversión y actuamos encendiendo un led del puerto E en
el caso de que esta variable sea menor que un determinado valor.

5. USART

Para la transmisión de datos con el ordenador se usan los pines Rx (RC7) y Tx (RC6), aunque
para este ejemplo, como solo vamos a enviar nos basta con Tx. Para poder comunicarnos con
el ordenador, necesitamos adaptar los niveles de tensión y esto los podemos hacer con un
MAX232 o con un DS275. El primero de los dos integrados es más barato y puede convertir las
señales Rx y Tx de 2 canales mientras que el segundo consume menos potencia y no necesita
de condensadores externos:

Taller 4 5 Nera González Romero


UPM-DISAM Cybertech 2008 UPM-DIE

En cualquiera de los dos casos, lo conectaríamos al puerto de serie del PC (es muy importante
conectar también todas las tierras). De esta manera, con cualquier programa que escuche del
puerto de serie, como el HiperTerminal que viene con Windows, podremos ver la lectura del
sensor. Para esto tendremos que configurar dicho programa para una velocidad de 19200 bits
por segundo, 8 bits de datos, paridad ninguna, 1 bit de parada y sin control de flujo para que
coincida con la configuración que le pondremos al microcontrolador. (Podemos poner otra
velocidad, pero siempre la misma en el PC que en el microcontrolador). También se puede
utilizar el tinybootloader.

En el siguiente ejemplo se muestra el código de un ejemplo, en el que se lee la lectura del


sensor por el puerto de serie. Como sensor vamos a utilizar un potenciómetro.

Código
/********PROGRAMA CONVERIDOR A/D Y USART********/
#include <p18F442.h>
#include <delays.h> // para usar retardos
#include <adc.h> // para las funciones del convertidor
#include <usart.h> // para la comunicacion serie
#include <stdlib.h> // para la funcion toa()
#define CR 0x0D // para enviar caracteres concretos
#define NL 0x0A
#define NULL 0x00
#define TAB 0x09
int conversion(unsigned char canal)
{
SetChanADC(ADC_CH0);
Delay10TCYx(2); // retardo de 20TCY (tiempo de adquisicion

ConvertADC(); // comienza la conversión

Taller 4 6 Nera González Romero


UPM-DISAM Cybertech 2008 UPM-DIE
while(BusyADC()); // espera a que termine la conversion
return ReadADC(); //
}
void main (void)
{
int sens1;
char cadena[7];
TRISA=0b11111111; // los pines AN0, AN1, AN2, AN3, AN4 como entradas
TRISCbits.TRISC6=0; // rx como entrada y tx como salida
OpenADC(ADC_FOSC_8 & ADC_RIGHT_JUST & ADC_5ANA_0REF, ADC_CH0 & ADC_INT_OFF);
OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE &
USART_EIGHT_BIT & USART_BRGH_HIGH, 12);
while(1)
{
sens1=conversion(ADC_CH0);
itoa(sens1,cadena); // convierto la medida en un string
putsUSART(cadena); // la envio
WriteUSART(0x09); // envio un tabulador
Delay10TCYx(100); // retardo de 1 ms
WriteUSART(CR); // envio un retorno de carro
Delay10TCYx(100);
WriteUSART(NL); // envio un caracter de nueva linea
Delay10TCYx(100);
}
}

Para utilizar la USART se necesita el fichero de cabeceras usart.h, en él encontraremos


funciones como:

1- OpenUSART(): que la enciende y la configura. Para conectarnos al puerto de serie del


ordenador la transmisión ha de ser asíncrona, además lo haremos con las
interrupciones deshabilitadas. Configuramos que las transmisiones sean de 8 bits y,
para seleccionar una velocidad de 19200 bits/segundo, como suponemos un cristal de
4 Mhz, pondremos BRGH=1 y SPBRG=12. Éstos valores los podemos obtener en unas
tablas que hay en las hojas de especificaciones o, para velocidades que no vienen en
las tablas, calcularlos como viene indicado:

2- putsUSART(): envía una cadena de texto.


3- WriteUSART(): envía un único carácter. La uso para enviar tabuladores después de
cada valor y un retorno de carro cuando se han enviado las 5 lecturas.

Para poder enviar una cadena de texto con el valor que ha leído el convertidor (es un int)
tenemos que convertirlo primero en una cadena. Esto se hace mediante la función:

char * itoa( int value, char * string );

a la que hay que pasarle como argumento el entero a convertir y un char* en el que quepa la
representación ASCII del numero, incluido el signo y el carácter nulo del final). Para poder usar
ésta función tenemos que incluir stdlib.h.

Taller 4 7 Nera González Romero


UPM-DISAM Cybertech 2008 UPM-DIE
En el caso de que queramos utilizar el puerto serie para enviar una cadena de caracteres desde
el ordenador al microcontrolador se puede utilizar las funciones ReadUSART() y
DataRdyUSART(). Un ejemplo de programa que escribe dos variables leídas del puerto de serie
del ordenador es
/******** PROGRAMA PARA LEER DEL PUERTO DE SERIE ********/
#include <p18f442.h>
#include <delays.h>
#include <usart.h> // para la comunicacion serie
#include <stdlib.h> // para la funcion itoa()
#define LED PORTCbits.RC5
void main()
{
char dato;
char inicio[12]="Conectado\r\n";
char error[20]="caracter erroneo \r\n"; // terminamos con retorno de
//carro y nueva línea
OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF & USART_ASYNCH_MODE &
USART_EIGHT_BIT & USART_BRGH_HIGH, 12);
TRISC = 0b10011111; // RC5 como salida(led), RC6 como salida
// (escritura USART)
putsUSART(inicio);
while(1)
{
if (DataRdyUSART())
{
dato = ReadUSART();
switch(dato)
{
case 'a':
LED = 1; // enciendo el led
break;
case 'b':
LED = 0; // apago el led
break;
default:
putsUSART(error);
}
}
}
CloseUSART();
}

Taller 4 8 Nera González Romero

Você também pode gostar