Você está na página 1de 25

119

8. EJEMPLOS APLICATIVOS




8.1 EJEMPLO DE CONTROL DE LEDS


Con este montaje pretendemos controlar 8 LEDs por medio del microcontrolador,
generando una secuencia para encenderlos y apagarlos. En este caso los LED se
encendern y apagarn de izquierda a derecha y cuando se encienda el ltimo LED de la
derecha se devuelven encendindose y apagndose de derecha a izquierda.

Para este ejemplo utilizaremos los siguientes componentes:

Microcontrolador pic 16f84a
Chip ULN2803
8 Resistencias de 330 Omn
5 Resistencias de 10 K
1 Resistencias de 15 K
8 Diodos LED.
1 Oscilador a cristal X1
2 capacitores de 22 pF





El diagrama del circuito es el siguiente:

120

Figura 5.1 Diagrama de circuito de LEDs controlados por el PIC 16F84


El primer paso es instalar la PIC y el chip ULN2803 en la board como se muestra en la
figura 5.2:



Figura 5.2 Configuracin de la PIC 16F84 (Izquierda) y el chip ULN2803 (Derecha)

121
El siguiente paso es conectar los 8 pines del puerto B de la pic (que ser configurado de
salida por medio de software) a las entradas del chip ULN2803. Las entradas del anterior
chip (ULN2803) se encuentran en la parte inferior. Para observar en detalle la
configuracin de los pines de la pic se puede mirar la imagen 1.3. Para el chip ULN2803
se pueden observar los anexos. Este es el resultado del proceso anterior:




Figura 5.3 Configuracin de la conexin de las salidas de la PIC a las entradas del chip ULN2803



Luego conectamos los LEDs a la salida del chip ULN2803 y estas a su vez a las
resistencias de 330Omn. Es importante conectar de forma ordenada cada una de las
salidas del chip ULN2803 a los LEDs, para facilitar el trabajo de programacin de la PIC a
la hora de definir la secuencia de iluminacin. En este caso, conectamos la primera salida
al primer LED, la segunda salida al segundo LED, y as sucesivamente hasta conectar la
ultima salida al LED que se encuentra en el extremo derecho, que es el ltimo.


122
Observamos el detalle de esta configuracin en la figura 5.4



Figura 5.4 Indicador de progreso para el proceso de grabacin





Figura 5.5 Vista lateral de la configuracin del circuito


El siguiente paso es conectar las resistencias de 10K a los pines del puerto A que no se
van a utilizar en este caso. Tambin se conecta el oscilador con sus respectivos
capacitares como muestra la imagen 5.6
123



Figura 5.6 Circuito con las resistencias aadidas a la configuracin inicial






Figura 5.7 Circuito con las resistencias aadidas a la configuracin inicial


Finalmente conectamos la resistencia de 15K al pin MCLR (reset) de la pic y ponemos los
cables para alimentar el circuito con energa. La corriente negativa recorrer el bus inferior
de la borrad, es decir, transitara por el cable naranja que se muestra a la izquierda en la
figura 5.8, donde puede observarse el circuito terminado.

124


Figura 5.8 Circuito inicial completo. Incluye la resistencia de 15K y el MCLR (reset)


8.1.1 Cdigo del programa que controla la secuencia de Iluminacin

El siguiente proceso consiste en programar la pic para que funcione como plantea el
objetivo del ejercicio. Para esto vamos a utilizar el MPLAB y el PICC Lite, que nos permite
escribir el cdigo en C y generar el archivo .HEX que va a ser pasado a la pic.

El cdigo fuente del programa que va a ser cargado en la pic es el siguiente:

/*
Programa para controlar secuencia de iluminacin
de 8 LEDs
con la PIC 16f84a

Para realizar el proceso se configura el puerto B
de Salida
*/
#include <pic.h>
#include <pic1684.h>

// Configuracion (Oscilador de Cristal, Watch Dog desactivado
__CONFIG(HS & WDTDIS & PWRTEN );
/* -------------------------------------------------------------------
rutinas de retardos asumiendo reloj de 4MHz
*/

/*
retardo en MicroSegundos
*/
#define delay_us(x) {unsigned char cnt; cnt = (x)/(3)|1; while( --cnt
125
!=0) continue; }
/*
retardo en MiliSegundo
*/
void delay_ms( unsigned char cnt)
{
unsigned char i;
do
{
i = 4;
do{ delay_us(250);} while( i--);
} while( cnt--);
}
/*
retardo en Segundo
*/
void delay_s( unsigned char cnt)
{
unsigned char i;
do
{
i = 4;
do{ delay_ms(250);} while( i--);
} while( cnt--);
}

/* -------------------------------------------------------------------
Programa Principal
*/

main(void)
{
short paso;
short delta;

TRISA = 255; // Se configura el Puerto A de entrada
TRISB = 0; // Se configura el Puerto B de salida
PORTB = 0; // Se pone en 0 todos los bits del puerto B

// ciclo infinito
paso = 0;
delta = 1;
for(;;)
{
paso += delta;
if( paso > 7 )
{
paso = 6;
delta = -1;
}
else if( paso < 0 )
{
paso = 1;
delta = 1;
126
}
switch( paso )
{
case 0:PORTB = 0b00000001;break;
case 1:PORTB = 0b00000010;break;
case 2:PORTB = 0b00000100;break;
case 3:PORTB = 0b00001000;break;
case 4:PORTB = 0b00010000;break;
case 5:PORTB = 0b00100000;break;
case 6:PORTB = 0b01000000;break;
case 7:PORTB = 0b10000000;break;
}
delay_ms(255);
}
} // Fin programa



Programa equivalente en Asembler:

;
; Programa para encender un grupo de LEDs en una secuencia
; especifica con la PIC 16f84a
;
; Para realizar el proceso se configura el puerto B
; de Salida y se mueve la secuencia de encendido esperando
; un retardo
;


list p=pic16f84a
#include p16f84a.inc
__config _HS_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF

; Declaracin de Constantes
ptob equ 06
reg1 equ 0b
reg2 equ 0c
reg3 equ 0d
valor1 equ 30
valor2 equ 40
valor3 equ 30

; Direcciones de Programa Principales
reset org 0
goto inicio
org 4
goto inicio
org 5
inicio bsf STATUS,RP0

; Configuracin Puerto A de entrada
movlw h'ff'
movwf TRISA
127
; Configuracin Puerto B de Salida
clrf TRISB

; Inicio Programa
bcf STATUS,RP0
; Avanza Motor Paso a Paso
label_led movlw b'00000001'
movwf ptob
call retardo
movlw b'00000010'
movwf ptob
call retardo
movlw b'00000100'
movwf ptob
call retardo
movlw b'00001000'
movwf ptob
call retardo
movlw b'00010000'
movwf ptob
call retardo
movlw b'00100000'
movwf ptob
call retardo
movlw b'01000000'
movwf ptob
call retardo
movlw b'10000000'
movwf ptob
call retardo
movlw b'01000000'
movwf ptob
call retardo
call retardo
movlw b'00100000'
movwf ptob
call retardo
movlw b'00010000'
movwf ptob
call retardo
movlw b'00001000'
movwf ptob
call retardo
movlw b'00000100'
movwf ptob
call retardo
call retardo
movlw b'00000010'
movwf ptob
call retardo
movlw b'00000001'
movwf ptob
call retardo
goto label_led
128

; Se realiza los retardos
retardo movlw valor1
movwf reg1
tres movlw valor2

movwf reg2
dos movlw valor3

movwf reg3
uno decfsz reg3

goto uno

decfsz reg2
goto dos
decfsz reg1
goto tres
retlw 0
end


A continuacin se muestra como configurar el proyecto en el MPLAB.
Primero seleccionamos la opcin Project Wizard de la entrada Project en la barra de
men.



Figura 5.9 Opciones del men Project en el IDE MPLAB
129
Luego seleccionamos el tipo de controlador.



Figura 5.10 Seccin de seleccin del dispositivo en el asistente para la creacin del proyecto


A continuacin el tipo de compilador (Seleccionamos la opcin PICC Lite)




Figura 5.11 Seccin de seleccin del compilador en el asistente para la creacin del proyecto
130

Asignamos un nombre para el proyecto y la ruta donde se guardarn los archivos para el
mismo


Figura 5.12 Seccin de seleccin del nombre y ubicacin del proyecto en el asistente para la
creacin del proyecto

Cargamos el archivo fuente al proyecto haciendo clic derecho sobre la etiqueta "Sources"
de la ventana de navegacin y escogiendo la opcin add files del men emergente



Figura 5.13 Seccin de inclusin de los archivos fuentes en el proyecto
131

Abrimos el cdigo fuente dando doble clic sobre el archivo que recin agregamos y
procedemos a compilar usando la opcin "Make" del men Project.

Si la compilacin es exitosa deberamos ver una imagen como la siguiente



Figura 5.14 Salida producida por el proceso de compilacin


Cuando hayamos compilado el cdigo obtendremos un archivo llamado de igual forma
que el archivo fuente con extensin .HEX. Este archivo representa el programa en cdigo
binario que vamos a grabar en la pic.


8.1.2 Proceso de grabacin de la PIC

1. Cargamos el archivo con extensin Hex en el ICPROG (Mirar seccin 2.1.3).
2. Conectamos la grabadora de PIC al puerto serial del PC
3. Ensamblamos la PIC 16F84 en la ranura
132
4. Ejecutamos el comando de grabacin desde el ICPROG y si el proceso de grabacin
es exitoso retiramos la pic.
5. Integramos nuevamente la pic en el circuito y lo alimentamos para probar su
funcionamiento.




Figura 5.15 Circuito del grabador de PIC uJDM



8.2 EJEMPLO DE CONTROL DE LEDS CON SWITCH FEEDBACK

Este montaje extiende el ejemplo anterior aadiendo un nuevo componente que permite la
operacin de la pic bajo condiciones que pueden cambiarse en tiempo real. El
componente es un Switch normalmente abierto que enva seales a las entradas de la pic
para cambiar el sentido de la secuencia de iluminacin de los LEDs.

Para este ejemplo utilizaremos los siguientes componentes:

Microcontrolador pic 16f84a
Chip ULN2803
8 Resistencias de 330 Omn
5 Resistencias de 10 K
133
1 Resistencias de 15 K
8 Diodos LED.
1 Oscilador a cristal X1
2 capacitores de 22 pF
Switch (default open)

El diagrama del circuito es el siguiente:

Figura 5.17 Diagrama de circuito de LEDs controlados por el PIC 16F84. Secuencia de iluminacin
controlada por Switch Simple (SW Direccin)


El montaje final queda igual al ejemplo anterior, excepto por el Switch observado en la
siguiente figura:




Figura 5.18 Circuito de LEDs controlados por la PIC 16F84 usando un Switch simple

134
8.2.1 Cdigo del programa que controla la secuencia de Iluminacin (SW)

/*
Programa para controlar secuencia de iluminacin
de 8 LEDs
con la PIC 16f84a

Para realizar el proceso se configura el puerto B
de Salida
*/
#include <pic.h>
#include <pic1684.h>

// Configuracion (Oscilador de Cristal, Watch Dog desactivado
__CONFIG(HS & WDTDIS & PWRTEN );

// Formula para escribir o leer un bit del puerto
#define PORTBIT(adr, bit) ((unsigned)(&adr)*8+(bit))

// Bits de Entrada
static bit btnCambio @ PORTBIT(PORTA, 2); // Bit DOS del puerto A


/* -------------------------------------------------------------------
rutinas de retardos asumiendo reloj de 4MHz
*/

/*
retardo en MicroSegundos
*/
#define delay_us(x) {unsigned char cnt; cnt = (x)/(3)|1; while( --cnt
!=0) continue; }
/*
retardo en MiliSegundo
*/
void delay_ms( unsigned char cnt)
{
unsigned char i;
do
{
i = 4;
do{ delay_us(250);} while( i--);
} while( cnt--);
}
/*
retardo en Segundo
*/
void delay_s( unsigned char cnt)
{
unsigned char i;
do
{
i = 4;
do{ delay_ms(250);} while( i--);
135
} while( cnt--);
}

/* ------------------------------------------------------------------
Programa Principal
*/

main(void)
{
short paso;
short delta;

TRISA = 255; // Se configura el Puerto A de entrada
TRISB = 0; // Se configura el Puerto B de salida
PORTB = 0; // Se pone en 0 todos los bits del puerto B

// ciclo infinito
paso = 0;
delta = 1;
for(;;)
{
// Leemos el estado de la entrada 2 del puerto A
if( btnCambio == 0)
// Si esta en cero invertimos la direccin
delta = -delta;

paso += delta;
if( paso > 7 )
{
paso = 6;
delta = -1;
}
else if( paso < 0 )
{
paso = 1;
delta = 1;
}
switch( paso )
{
case 0:PORTB = 0b00000001;break;
case 1:PORTB = 0b00000010;break;
case 2:PORTB = 0b00000100;break;
case 3:PORTB = 0b00001000;break;
case 4:PORTB = 0b00010000;break;
case 5:PORTB = 0b00100000;break;
case 6:PORTB = 0b01000000;break;
case 7:PORTB = 0b10000000;break;
}
delay_ms(255);
}
} // Fin programa


136
El proceso para compilar el programa y grabarlo en la PIC es igual al del ejemplo anterior.

El resultado de este experimento es igual al anterior. El efecto de operar el Switch es un
cambio en la direccin de la secuencia de iluminacin de los LEDs en tiempo real.


8.3 EJEMPLO DE CONTROL DE MOTOR CC


En esta aplicacin vamos a crear un carro con dos motores tipo CC que manejaran la
traccin y la direccin, y dos sensores implementados mediante swiches simples, uno
lateral y uno frontal. La idea es que el carro est siempre en contacto con una pared o
superficie al lado derecho y que avance por la misma. Mientras el carro est en contacto
con la pared no tendr cambio de direccin. Cuando se pierda contacto empezar a girar
hacia la derecha en busca de una superficie. Si choca de frente contra otra superficie
retroceder, cambiar de direccin y luego avanzar hacia adelante. Este movimiento lo
repetir hasta que no encuentre obstculos al frente.

Para el montaje, utilizaremos un camin de juguete que es controlado por control remoto.

Puede conseguir artculos como este en cualquier almacn de cadena a precios muy
asequibles. Lo importante en este caso, es contar con un carrito que nos permita instalar
los motores en los ejes de movilidad, como los ejes de transmisin y de direccin.

Tambin pueden construirse prototipos en balso que se ajusten de forma muy bsica a los
requerimientos.

Los componentes electrnicos necesarios son los siguientes:

- Microcontrolador pic 16f84a
- Chip L293D
- 9 Resistencias de 10 K
- 1 Resistencia de 15 K
137
- 2 Switches
- 1 Oscilador a cristal X1
- 2 capacitores de 22 pF



El diagrama del circuito es el siguiente:



Figura 5.19 Diagrama de circuito de Motores CC controlados por la PIC 16F84 usando 2 Switch
para alimentar las entradas de la PIC.



Una vez construimos el circuito en una protoboard convencional, la placa queda de la
siguiente forma

138


Figura 5.20 Circuito de Motores CC controlados por la PIC 16F84 usando dos Switch simples


Esta placa la ubicaremos en el volco del camin. En el mismo volco, se ubicar la fuente
como se muestra en la figura 8.x.

Opcionalmente, puede reemplazar la fuente de alimentacin por bateras para mejorar la
movilidad del carrito, as no tendra limitaciones a la hora de recorrer espacios grandes.


139


Figura 5.21 Configuracin del carrito controlado por Motores CC. El volco estn instaladas la fuente
(parte superior izquierda) y la placa con el circuito (parte inferior).



Luego se ubica el switch lateral. En este caso hemos ubicado el Switch en la parte
derecha, justo al lado de la llanta delantera. Con esto, podremos realizar recorridos en
espacios cerrados en sentido contrario de las manecillas del reloj.

Este diseo puede mejorarse, por ejemplo, agregando ms Switchs para permitir
recorridos libres en espacios ms abiertos o con ms obstculos.

140


Figura 5.22 Switch lateral para el control del avance.

Y as queda ubicado el switch frontal



Figura 5.23 Switch frontal para control de direccin y retroceso ante obstculos.
141
En nuestro caso particular, hemos simplificado el prototipo usando un control conectado
directamente al carrito. Para esto, hemos debido retirar el volco y conectar los cables del
control remoto que nos permita tener el control de los motores.

Pueden usarse controles inalmbricos pero esto va ms all del alcance de este diseo.




Figura 5.24 Conexin del control remoto al circuito de control de los motores



Los pasos para la programacin y el grabado de la PIC, son los mismos de los ejemplos
anteriores, por lo que no sern explicados.

8.3.1 Cdigo fuente del programa que controla los motores CC

/*
Programa para controlar dos motores DC
con la PIC 16F84A

142
El objetivo es hacer mover un carro

* Para controlar el Carro se usa el puerto B donde
los ultimos 4 Bits definen las acciones del carro.
Bit3 Bit2 Bit1 Bit0
Bit3 y Bit2 Indican El giro Bit3 Izquierda y Bit2 Derecha
Bit1 y Bit0 Indican el Avance Bit1 Atras, Bit0 Adelante
* Adicionalmente se tienen dos censores. Uno en el Frente
y el otro en el lado del carro.

*/
#include <pic.h>
#include <pic1684.h>

// Configuracion (Oscilador de Cristal, Watch Dog desactivado
__CONFIG(HS & WDTDIS & PWRTEN );

// Formula para escribir o leer un bit del puerto
#define PORTBIT(adr, bit) ((unsigned)(&adr)*8+(bit))

// Bits de Entrada
static bit btnSWDefenza @ PORTBIT(PORTA, 0); // Bit CERO del
puerto A
static bit btnSWLado @ PORTBIT(PORTA, 1); // Bit UNO del
puerto B

/* ---------------------------------------------------------
Rutinas de retardos asumiendo reloj de 4MHz
*/

/*
retardo en MicroSegundos
*/
#define delay_us(x) {unsigned char cnt; cnt = (x)/(3)|1; while( --cnt
!=0) continue; }
/*
retardo en MiliSegundo
*/
void delay_ms( unsigned char cnt)
{
unsigned char i;
do
{
i = 4;
do{ delay_us(250);} while( i--);
} while( cnt--);
}
/*
retardo en Segundo
*/
void delay_s( unsigned char cnt)
{
unsigned char i;
do
143
{
i = 4;
do{ delay_ms(250);} while( i--);
} while( cnt--);
}

/* ---------------------------------------------------------
Programa Principal
*/

main(void)
{
TRISA = 255; // Se configura el Puerto A de entrada
TRISB = 0; // Se configura el Puerto B de salida
PORTB = 0; // Se pone en 0 todos los bits del puerto B

// ciclo infinito
for(;;) {
delay_ms( 100 );
// si se choca por el frente
if( btnSWDefenza == 1 )
{
// IDv^
PORTB = 0b00001010;//Izquierda - Atras
delay_ms(255);
delay_ms(255);
PORTB = 0b00000101;//Derecha - Adelante
delay_ms(255);
delay_ms(255);
PORTB = 0b00000000;
}
// si no esta pegado al muro
else if( btnSWLado == 0 )
{
PORTB = 0b00001001;//Izquierda - Adelante
delay_ms( 250 );
PORTB = 0b00001000;//Izquierda
}
// Si esta pegado al muro y frente despejado
else
{
PORTB = 0b00000001;//Avanza
delay_ms( 150 );
PORTB = 0b00000000;
}
} // fin cliclo infinito
}// fin programa

Você também pode gostar