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 encenderán y apagarán de izquierda a derecha y cuando se encienda el último LED de la derecha se devuelven encendiéndose y apagándose 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:

PIC con ULN.pdf

Embed Size (px)

Citation preview

  • 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 #include

    // 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 #include

    // 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 #include

    // 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