oferta

viernes, 11 de enero de 2013

PWM: MODULACION ANCHO PULSO

El PWM (Pulse Width Modulation) o modulación en ancho del pulso, tiene muchas aplicaciones, por ejemplo para atenuar la iluminación de un led, la iluminación del BACKLIGHT de un LCD, para variar la velocidad de un motor DC, que es lo que veremos en este caso.


El presente proyecto es un variador de velocidad de un motor DC pequeño que se alimenta a 5 voltios, pero podemos usar un motor mas grande alimentando con su  correspondiente voltaje en el mosfet, su funcionamiento es de la siguiente manera:
Al momento de alimentar el circuito, el motor parte desde una velocidad media, es decir (Velocidad=125), al presionar el pulsador conectado en Rb6 del puerto B se incrementa la variable en múltiplo de 25 y se incrementara la velocidad  del motor,  si seguimos presionando el pulsador  subira en mas multiplos de 25 hasta una velocidad = 250 elcual sera su velocidad maxima. Entonces para disminuir tenemos que presionar Rb7 el cual hace que disminuya la velocidad del motor hasta llegar a (velociada=25) que es la minima velocidad

jueves, 3 de enero de 2013

MATRIZ DE LEDS 7X5

Esta práctica consiste en formar un hombrecito saludando, una vez familiarizado será muy sencillo ir implementando más displays del mismo tipo,emplearemos una matriz de 7x5 que significa que tendremos 7 filas ABCDEFG y 5 columnas 1,2,3,4,5 . Si nos fijamos en la matriz de leds de 7x5 vemos que las columnas controlan o activan las filas,esto quiere decir que para encender un led de las filas primero tiene que estar activada la columna correspondiente, cada columna controla 7 leds correspondientes al puerto B de los cuales nosotros decidimos que leds se prenden o  que leds esten apagados.
Por ejemplo para activar o encender  el led central (D3) de la matriz tengo primero que activar la columna 3 mediante el pic por el puerto A lo siguiente (00100) y luego mandar por las filas del puerto B lo siguiente (0001000). Los bits que no se usan (B7) no interesan en este caso esten en 1 o 0.
 La idea para usar una matriz es la multiplexacion, para esto activamos una columna de la matriz por ejemplo la columna 1 que esta controlado,mediante un transistor conectado en el puerto A pin A6 y enviamos los leds que se quieran visualizar o encender del puerto B desde  B0 hasta B6.
Luego activamos la columna2 mediante el pic por el puerto A pin  A3, y enviamos los leds que se quieran visualizar o encender del puerto B desde  B0 hasta B6, y asi sucesivamente. El programa a realizar, debe multiplexar los leds de forma que se encienda como la secuencia 1, permanece 100 milisegundos y cambia a la secuencia 2, luego a la secuencia 3, y finalmente a la secuencia 4, para luego volver a repetir toda la secuencia desde el principio. Como resultado observaremos un hombrecito que agita los brazos.


Es muy importante considerar el tiempo de multiplexaje, ya que no se debe sobrepasar un total de 20 mls, por ejemplo si utilizamos 2 displays 7x5, debemos bajar el tiempo de pauses a 2 milisegundos para también tener un total de 20 mls. El enlace del archivo Hex. click aqui:
http://www.4shared.com/file/t0lsTNil/matrizhombrecito.html
El codigo fuente esta en picbasicpro y lo publico en mi pagina: http://www.proyectoselectronicoos.blogspot.com/

martes, 9 de octubre de 2012

ASCENSOR CON MOTOR PASO A PASO

Este proyecto es un ascensor de 4 niveles pero usando un motor PAP unipolar con lo cual nos ahorraremos de instalar en la maqueta de 4 finales de carrera que iban conectados en cada nivel.
Solo necesitaremos 4 pulsadores uno por cada nivel, un motor PAP unipolar de mediana potencia y su driver que puede ser un ULN2803 y si necesitaramos mayor potencia emplearemos transistores TIP41.
Con  el motor paso a paso podemos hacerlo contar los pasos que girara en un sentido u otro, sabiendo la distancia entre cada nivel o piso haremos el programa para que solo gire determinados pasos, eso si la maqueta del ascensor debe ser de igual distancia para cada piso o nivel.
El esquema para el ascensor es el mismo que hice para ascensor con motor DC pero sin finales de carrera y los pulsadores son normalmente cerrados y van conectados a tierra.


Habiendo hecho la introduccion solo queda a ponernos a trabajar :)   El pic16f84a solo lo pongo por que el esquema original estaba con este pic, pero podemos usar el pic16f628a con el cual  ya no necesitaremos usar el cristal de 4 Mhz.
EL PROGRAMA
Bien suponiendo que tienen una maqueta de  ascensor de 4 pisos, cada piso separado por una distancia igual con respecto al siguiente piso, es decir la distancia del piso1 al piso2 es igual a la distancia del piso2 con respecto al piso3,de igual forma del piso3 al piso4, esto es importante la separacion entre pisos sea igual por que emplearemos un motor paso a paso unipolar y solo 4 pulsadores.
Por ejemplo suponiendo que la cabina del ascensor este en el piso1 y deseamos que suba al piso2, entonces haremos que el motor PAP gire una vuelta, ahora si queremos ir del piso1 al piso3 hacemos que el motor PAP gire 2 vueltas, piso1 al piso4 haremos que el motor PAP gire 3 vueltas. De igual forma si queremos que la cabina baje por ejemplo del piso4 al piso3 el motor PAP girara una vuelta pero en sentido contrario, del piso4 al 2 el motor PAP girara 2 vueltas en sentido contrario. Es por eso que es importante la construccion de la maqueta en forma simetrica con respecto a cada piso.
Este es el link para descargar el programa en HEX.

http://www.4shared.com/file/i7ADg8Qz/ascensor4PAP.html

He considerado para cada piso 2 vueltas y 1/4 maso menos y el diametro del eje de mi motor paso a paso es de 2 cm. En mi mini maqueta de  ascensor he dividido  para el primer piso recorre 18 cm, para el segundo piso 36m y para el tercer piso 54cm. En total he dividido 54cm en tres pisos, uno para cada piso.
La ventaja de este metodo de usar solo pulsadores esque puedo obtener ascensores con mas niveles, por ejemplo si uso el pic16f877 que tiene 5 puertos puedo llegar hacer un ascensor de 30 pisos :)
Aqui pongo minimaqueta de ascensor de pruebas, eso si mas bien no soy bueno para  hacer maquetas. tratare de subir un video en funcionamiento en youtube.
Los pulsadores de llamada son normalmente cerrados, y ya saben los electronicos que antes de conectar el motor paso a paso unipolar se coloca un driver ULN2803.







sábado, 18 de junio de 2011

PIC con LCD 4bit

Para tener mas  pines libres de salida de un pic es preferible usar la interfaz al LCD con 4 bits, en este ejemplo usamos el puerto B con los 4 bits mas altos(RB4-RB7) conectados a los pines mas altos (D4-D7)del  LCD, de igual forma pongo todo el programa completo sin uso librerias.
;*******************************************

; 4 BIT LCD CON PIC16F84A
; RB7-RB4 = DB7-DB4 ; E=RB3 ; RW= RB2 ; RS=RB1
;*******************************************
list p=PIC16F84A
include "p16f84a.inc"
BIT_E          EQU 3
BIT_RW      EQU 2
BIT_RS       EQU 1
TEMP          EQU 0x020
reg1             EQU 0x021
reg2             EQU 0x022

org 0h
goto START

INITPIC                                  ;Configuracion de puertos
            bsf STATUS,RP0        ; vamos bank 1
           movlw b'00000000'
           movwf TRISB              ;puerto b salida
           bcf STATUS,RP0        ; vamos bank 0
          clrf PORTB
          return

INITLCD                                 ;inicializar LCD
              MOVLW 0xFE
              CALL retardo1
              MOVLW B'00111000'
              MOVWF PORTB
              BCF PORTB,BIT_E
              MOVLW 0x0A               ;retardo 5ms
              CALL retardo1
              MOVLW B'00111000'
              MOVWF PORTB
              BCF PORTB,BIT_E
              MOVLW 0x02
              CALL retardo1
              MOVLW B'00111000'
              MOVWF PORTB
              BCF PORTB,BIT_E
             CALL LCDBUSY
              MOVLW B'00101000'
              MOVWF PORTB
              BCF PORTB,BIT_E
             CALL LCDBUSY
             MOVLW B'00101000'
              MOVWF PORTB
              BCF PORTB,BIT_E
              MOVLW B'10001000'
              MOVWF PORTB
              BCF PORTB,BIT_E
              CALL LCDBUSY
              MOVLW B'00001000'
              MOVWF PORTB
              BCF PORTB,BIT_E
              MOVLW B'11111000'
              MOVWF PORTB
             BCF PORTB,BIT_E
              CALL LCDBUSY
              MOVLW B'00001000'
              MOVWF PORTB
              BCF PORTB,BIT_E
              MOVLW B'00011000'
              MOVWF PORTB
             BCF PORTB,BIT_E
             CALL LCDBUSY
             MOVLW B'00001000'
             MOVWF PORTB
             BCF PORTB,BIT_E
             MOVLW B'01101000'
             MOVWF PORTB
             BCF PORTB,BIT_E
             RETURN
LCDBUSY
             BSF STATUS,RP0
             MOVLW B'11110000'
             MOVWF TRISB
             BCF STATUS,RP0
             BSF PORTB,BIT_RW
             BCF PORTB,BIT_RS
             BSF PORTB,BIT_E
             MOVF PORTB,W
            BCF PORTB,BIT_E
            BSF PORTB,BIT_RW
            BCF PORTB,BIT_RS
            BSF PORTB,BIT_E
            NOP
            BCF PORTB,BIT_E
            ANDLW 0x80
            BTFSS STATUS,Z
           GOTO LCDBUSY
            BCF PORTB,BIT_RW
            BSF STATUS,RP0
            MOVLW 0x000
            MOVWF TRISB
            BCF STATUS,RP0
             RETURN

LINE2       
          MOVLW B'11001000'
          MOVWF PORTB
          BCF PORTB,BIT_E
          MOVLW B'00001000'
          MOVWF PORTB
          BCF PORTB,BIT_E
          RETURN

LCDWRITE
           MOVWF TEMP
           CALL LCDBUSY
           MOVF TEMP,W
            ANDLW B'11110000'
            IORLW B'00001010'
            MOVWF PORTB
            BCF PORTB,BIT_E
            SWAPF TEMP,W
           ANDLW B'11110000'
            IORLW B'00001010'
            MOVWF PORTB
           BCF PORTB,BIT_E
           RETURN
DEMORA                    ;retardo 500uS con xt 4MHz

            MOVLW D'165'
            MOVWF reg1
DEMORA1
            DECFSZ reg1, F
            GOTO DEMORA1
            RETURN
retardo1
            MOVLW D'255'
            MOVWF reg2
DEMORA2
            CALL DEMORA
            DECFSZ reg2, F
            GOTO DEMORA2
            RETURN

START
CALL INITPIC               ;inicializar PIC
CALL INITLCD              ;inicializar LCD
inicio
               call retardo1
               MOVLW D'80'              ;P
               CALL LCDWRITE
               MOVLW D'82'              ;R
               CALL LCDWRITE
               MOVLW D'79'              ;O
               CALL LCDWRITE
               MOVLW D'89'              ;Y
               CALL LCDWRITE
               MOVLW D'69'              ;E
              CALL LCDWRITE
              MOVLW D'67'               ;C
              CALL LCDWRITE
              MOVLW D'84'               ;T
              CALL LCDWRITE
              MOVLW D'79'               ;O
              CALL LCDWRITE
              MOVLW D'83'              ;S
             CALL LCDWRITE
              MOVLW D'32'              ;espacio en blanco
              CALL LCDWRITE
               MOVLW D'50'             ;2
               CALL LCDWRITE
               MOVLW D'48'             ;0
               CALL LCDWRITE
               MOVLW D'49'             ;1
               CALL LCDWRITE
              MOVLW D'49'              ;1
              CALL LCDWRITE
              MOVLW D'32'              ;espacio en blanco
              CALL LCDWRITE
              SLEEP
               END

El archivo HeX. probado y comprobado lo pueden bajar de este enlace:
http://www.4shared.com/file/SBnq3pu0/lcd4bit.html


miércoles, 1 de junio de 2011

LCD con pic16f84a

Haremos el programa para controlar  un LCD con un pic16f84a con 8 lineas de datos, pondremos el programa completo para no confundir al lector  con las librerias que tendria que convertirlas en archivo de tipo .INC


list p=16f84                                       ;Procesador PIC16f84
#include "pic16f84"

DATO_A equ 0xc                               ;Registro del dato A
DATO_B equ 0xd                               ;Registro del dato B
RESUL equ 0xe                                   ;Registro de resultados
TEMPO1 equ 0xf                                 ;Registro temporal 1
TEMPO2 equ 0x10                              ;Registro temporal 2
OFFSET equ 0x11                               ;Variable de desplazamientos de mensajes
Digito EQU 1Fh                                   ;Cursor para leer la tabla de datos.

ORG 00h                                             ;Direccion del Vector de RESET
GOTO INICIO                                   ;Comienza el programa
ORG 05h                                             ;detras del Vector Interrupcion

;-------CONFIGURACION LCD-----------
LCD_E          BSF PORTA,2          ;Activa señal E
                     NOP                          ;Espera 1uS
                     BCF PORTA,2          ;Desactiva señal E
                     RETURN
LCD_BUSY  BSF PORTA,1          ;Pone el LCD en modo lectura
                      BSF STATUS,5        ;Selecciona el Banco 1
                      MOVLW 0xFF
                      MOVWF TRISB       ;Puerta B actua de entrada
                      BCF STATUS,5        ;Selecciona el Banco 0
                      BSF PORTA,2          ;Activa el LCD (Señal E)
                      NOP
L_BUSY       BTFSC PORTB,7     ;Chequea el bit BUSY
                     GOTO L_BUSY       ;Est a "1" (Ocupado)
                     BCF PORTA,2         ;Desactiva el LCD (Se¤al E)
                     BSF STATUS,5        ;Selecciona el Banco 1
                     CLRF TRISB            ;Puerta B actua como salida
                     BCF STATUS,5        ;Selecciona el Banco 0
                     BCF PORTA,1          ;Pone el LCD en modo escritura
                     RETURN

LCD_REG  BCF PORTA,0          ;Desactiva RS (Modo instruccion)
                   MOVWF PORTB      ;Saca el codigo de instruccion
                   CALL LCD_BUSY    ;Espera a que se libere el LCD
                   GOTO LCD_E           ;Genera pulso en señal E
LCD_DATOS BCF PORTA,0     ;Desactiva RS (Modo instrucci¢n)
                   MOVWF PORTB      ;Valor ASCII a sacar por RB
                   CALL LCD_BUSY    ;Espera a que se libere el LCD
                   BSF PORTA,0            ;Activa RS (Modo dato)
                   GOTO LCD_E           ;Genera pulso en señal E
LCD_INI   MOVLW b'00111000'
                  CALL LCD_REG       ;Codigo de instruccion
                  CALL DELAY_5MS  ;Temporiza 5 mS.
                  MOVLW b'00111000'
                  CALL LCD_REG        ;Codigo de instruccion
                  CALL DELAY_5MS   ;Temporiza 5 mS.
                  MOVLW b'00111000'
                  CALL LCD_REG        ;Codigo de instruccion
                  CALL DELAY_5MS   ;Temporiza 5 mS.
                  RETURN
LCD_PORT   BSF STATUS,5              ;Selecciona el banco 1 de datos
                      CLRF TRISB                   ;RB se programa como salida
                       MOVLW b'00011000'   ;RA4, RA3 son entradas
                       MOVWF TRISA            ;el resto como salidas
                       BCF STATUS,5             ;Selecciona el banco 0 de datos
                       BCF PORTA,0               ;Desactiva RS del modulo LCD
                       BCF PORTA,2               ;Desactiva E del modulo LCD
DELAY_5MS  movlw 0x1a                   ;retardo de 5ms
                        movwf DATO_B
                        clrf DATO_A
                        DELAY_1 decfsz DATO_A,1
                        goto DELAY_1
                        decfsz DATO_B,1
                        goto DELAY_1
                        return

;----PROGRAMA PRINCIPAL------

INICIO CLRF Digito                        ;Pone a 0 la variable digito
             CALL LCD_PORT              Puertos en modo LCD
             BCF PORTA,0                    ;Desactiva RS del modulo LCD
             BCF PORTA,2                    ;Desactiva E del modulo LCD
START CALL LCD_INI                  ;Inicia LCD (CFG puertos...)
START_1 MOVLW b'00000001'    ;Borrar LCD y Home
             CALL LCD_REG
             MOVLW b'00000110' ;
             CALL LCD_REG
             MOVLW b'00001100'         ;LCD On, cursor Off,Parpadeo Off
             CALL LCD_REG
             MOVLW 0x80                     ;Direccion caracter
             CALL LCD_REG
REPETIR MOVF Digito,w                ;W=Digito
             CALL DATO_1                  ;Coge el caracter
             IORLW 0                            ;Compara
             BTFSC STATUS,2              ;Es el ultimo?
             GOTO acabar                      ;Si
             CALL LCD_DATOS          ;Visualiza caracter
             INCF Digito,f                      ;Incrementa numero de Digito
            GOTO REPETIR                 ;Vuelve a escribir
            acabar nop
            goto acabar                           ;Buclee infinito

DATO_1 ADDWF PCL,1
RETLW 'p'
RETLW 'r'
RETLW 'o'
RETLW 'y'
RETLW 'e'
RETLW 'c'
RETLW 't'
RETLW 'o'
RETLW 's'
RETLW ' '
RETLW '2'
RETLW '0'
RETLW '1'
RETLW '1'
RETLW 0x00
END
Aqui esta el archivo HEX. probado , lo bajan del siguiente link:
http://www.4shared.com/file/37iqavfh/lcd.html


 

sábado, 7 de mayo de 2011

CONTADOR CON PULSADOR

Bien esta vez haremos un contador de 0 a 9 mediante un pulsador en Ra0 que cada vez que es pulsado incrementara la cuenta en el contador en forma binaria y mostrado  por el puerto B, usando un decodificador 7447 convertiremos este conteo de binario a decimal, si la cuenta llega a 9 se reiniciara el conteo.
Esto mismo se puede hacer sin usar el 7447 usando las famosas tablas del pic, pero queria hacerlo de esta forma para entender el algoritmo de programacion, en una proxima publicacion haremos el contador sin 7447.




;EL PROGRAMA

list p=16f84

status    equ 0x03
trisb      equ 0x86
portb    equ 0x06
trisa      equ 0x85
porta    equ 0x05
reg1     equ 0x0C ; Estos 3 registros los utilizaré
reg2     equ 0x0D ; para hacer el retardo
reg3     equ 0x0E

org 0x00                                 ;inicio del programa
bsf status,5                              ;vamos al banco1
clrf trisb                                   ;portb es salida
movlw b'00000001'                ;Ra0 es entrada
movwf trisa
bcf status,5                             ;regresamos al banco0
inicio clrf portb
        repite btfss porta,0          ;presiono pulsador Rao?
       goto $-1                         ;si no regresa atras
       call rebote                       ;llama antirebote
       incf portb,1                     ;incrementa el conteo mas 1
;comparacion del conteo=9
   MOVF portb,0
   XORLW B'1010'               ;pregunta si conteo=9
   BTFSC status,2                 ;aqui ve la respuesta
   goto inicio                          ;si es asi vuelve a inicio
   btfsc porta,0                      ;solto el pulsador?
   goto $-1                            ;si no regresa atras
   goto repite

rebote  movlw 10              ; Aquí se cargan los registros
            movwf reg1           ; reg1, reg2 y reg3
            tres movlw 10        ; respectivamente
            movwf reg2
  dos    movlw 10
           movwf reg3
  uno   decfsz reg3,1            ; Aquí se comienza a decrementar
          goto uno                    ; Cuando reg3 llegue a 0
          decfsz reg2,1             ; le quitare 1 a reg2
          goto dos                    ; cuando reg2 llegue a 0
          reg1,1                       ; le quitare 1 a reg1
          goto tres                    ; cuando reg1 llegue a 0
          return                         ; regresare al lugar
          end
Aqui tienen el archivo HEX. comprobado y lo pueden bajar del siguiente link:
http://www.4shared.com/file/nCXiviU8/contador.html

sábado, 26 de marzo de 2011

BRAZO ROBOTICO A CONTROL REMOTO

Usando un control remoto para Television marca SONY y aprovechando un software hecho de control remoto sony para pic16f84a , haremos el control de un brazo robotico de 6 o mas grados de libertad.
Primero la construccion del brazo robotico, esto mas que todo es ingenio de uno , puede hacerse usando material reciclado de computadoras, impresoras, poleas , engranajes, servomotores, etc.

Sugiero la construccion de este brazo, debemos tener en cuenta que la armazon no pese tanto para no forzar a los servomotores que iran en cada articulacion, por ejemplo la mica puede ser un buen material liviano y resistente, los servomotores si no los consiguen en reciclaje se los pueden comprar de la marca FUTABA y seran 6:

Este segundo brazo para su construccion se necesita un poco mas de ingenio pero al final dara mas satifaccion al que lo construya o copien en algo la idea de su hechura
servomotor1: para cerrar y abrir la pinza
servomotor2: para rotacion de la muñeca
servomotor3: para rotacion del codo
servomotor4: para rotacion de el antebrazo
servomotor5 : para rotacion de el hombro
servomotor6 : para rotacion de la base
Aqui hay un detalle de la pinza hecho con engranajes reciclados de impresoras y un servo que los acciona, repito esto de hacer la construccion del brazo es ingenio de cada uno mas que todo


EL PROGRAMA PARA CONTROL REMOTO Y SU CIRCUITO
En el circuito mostrado tenemos 12 salidas del pic16f84 desde Rb0 hasta Rb7 y Ra0 hasta Ra3, estas salidas corresponden a un numero o canal del control remoto SONY de un televisor, tomamos un par de salidas por ejemplo Rb0 y Rb1 para el  servomotor1 , Rb2y Rb3 para el servomotor2 y asi sucesivamente, con el control remoto con cada numero o canal podemos activar cada salida del pic16f84a, esto es con el mismo numero o canal del control remoto apagamos o activamos su salida correspondiente.

Esto lo aprovechamos para controlar un servo, logicamente que antes de conectarlo al servo lo tenemos que conectar a un puente H a base transistores o  a base relays. Como son 12 salidas tomamos 2 salidas para cada servomotor.
El fotoreceptor de 3 terminales es un demodulador y amplificador es el TS0P21, TS0P23 lo pueden comprar  o utilizar uno usado de los que tienen los televisores a colores.

Bien como dije este programa no es mio , sus creditos a quien lo hizo, lo probe y funciona perfectamente lo pueden bajar  el HEX y fuente en ASM del siguiente link:

http://www.4shared.com/file/Ta1tCvfp/Sony.html
http://www.4shared.com/file/qF6QYgRK/Sony.html