E2 - G5

Anuncio
PONTIFICIA UNIVERSIDAD CATÓLICA DE CHILE
ESCUELA DE INGENIERÍA
DEPARTAMENTO CIENCIAS DE LA COMPUTACIÓN
PROFESOR: JOSÉ TOMÁS ETEROVIC
IIC 2342 – ARQUITECTURA DE COMPUTADORES
SEGUNDO SEMESTRE DE 2009
ENTREGA 2
MODELOS 3-D
GRUPO 5
Integrantes:
Juan José Andreu
Luis Alberto Cruz
Sebastián Fuenzalida
Felipe Gaete
José Ignacio Prieto
Stefan Ulbrich
Santiago, Lunes 5 de Octubre de 2009
Descripción del proyecto
Nuestro proyecto consiste en un scanner 3D de objetos el cual podrá capturar un
objeto y entregárselo al PC para visualizarlo. La idea principal es automatizar todo el
proceso de captura del objeto mediante el uso del PIC combinado con sensores y motores
específicos (los motores estarán conectados al PIC mediante un H-Drive). Para la rotación
del objeto utilizaremos un servomotor para hacerlo girar en X° (X dependerá de la
precisión que obtengamos), de esta manera podemos capturar de manera eficiente las
caras del objeto. Luego para barrer el objeto de manera vertical con un laser lineal
horizontal, utilizaremos otro servomotor que haga subir y bajar el laser. Adicionalmente
para detectar la altura del objeto, utilizaremos cinco fotodiodos receptores ubicados de
manera frontal al laser que se moverán conjuntamente con éste, para así al momento de
hacer contacto con el haz de luz, interrumpa la detección de altura y almacene el valor.
Por un tema de seguridad y para una mejor calidad de captura, todo lo descrito irá dentro
de una caja oscura que contará con un sensor de contacto en su puerta, para verificar su
total sellado. Por último, mediante una cámara web conectada al PIC, el cual hará de
bypass al computador, capturaremos y entregaremos al computador los datos obtenidos
para así finalmente procesar y modelar el objeto.
2
Esquema del proyecto
Aquí podemos apreciar un esquema de nuestro proyecto desde distintos ángulos:
Nota: Tanto el PIC, el H-Drive
Drive y las compuertas lógicas no se muestran en este diagrama
por simplicidad y serán explicadas en el siguiente ítem.
3
Explicación del modelo lógico-digital
Tal como explicamos anteriormente, nuestro sistema está conformado por un PIC,
un H-Drive, dos servomotores, fotodiodos receptores y compuertas lógicas. A
continuación especificaremos las conexiones entre ellas.
Por el puerto del PIC RA0 entra la señal de los cinco fotodiodos receptores, la cual
únicamente va a ser activada cuando el haz del laser llegue a todos, para así marcar el alto
del objeto para interrumpir el escaneo. El puerto RA1 va a recibir la señal que marca si la
puerta de la caja oscura está abierta o cerrada mediante un pulsador, de esta manera
cuando la puerta esté cerrada, el interruptor deja pasar el voltaje marcando que se puede
escanear. Luego, esta información es procesada por el PIC definiendo los limites de
escaneo y dando comienzo a este. De esta forma el PIC entrega cuatro bits (RB4 al RB7)
que determinarán el movimiento de los motores y dos bits (RB2 y RB3) que activarán los
enables del H-Drive. De los cuatro bits, dos pertenecen a cada motor. A cada una de las
compuertas AND llega los datos del PIC que controlan los motores y junto con ellas llegan
las salidas PWM del PIC, las cuales corresponden a CCP1 y CCP2. De esta manera se
determinará cuando deben llegar las señales al H-Drive, controlado por el AND.
El H-Drive finalmente recibe las señales procesadas y ejecuta el comando en los motores
respectivos. Para nuestro proyecto utilizaremos el H-Drive L293NE, el cual es capaz de
manejar 2 motores, en ambas direcciones. La conexión está de acuerdo al datasheet
correspondiente para motores bidireccionales.
4
VCC1 es el voltaje que necesita el TTL para funcionar (5V), es decir, es el mismo voltaje
que el aplicado al PIC (V). VCC2 es un voltaje auxiliar para alimentar el motor. Como
máximo soporta 36v. Luego de pasar por el H-Drive, llega una corriente al motor y este
produce el movimiento.
La salida RB1 y RB0 del PIC, son las encargadas de activar el laser y la cámara web
respectivamente.
Para recibir y enviar los datos obtenidos en la cámara web, haremos un bypass a través
del PIC, debido a la gran complejidad que presenta el manejo directo de los datos por
éste. Este bypass luego enviará los datos al PC para así modelar el objeto escaneado.
5
Diagrama de conexión
6
Código modificado de la ayudantía
;se ocupa el puerto b en vez del puerto d
; 3 niveles de parpadeo
list p=16f877a ; Tipo dispositivo
include <P16F877A.inc> ; Para que reconozca los registros
ORG H'00'
GOTO PARTIDA ; Ubicación de partida
ORG H'04'
GOTO INT ; Ubicación de interrupciones
; Variables a almacenar, registros
; de propósito general en el banco 0
LED EQU H'20' ; Led de uso actual
POT1 EQU H'21' ; Vin
POT2 EQU H'22' ; LED
LEVEL EQU H'23' ; Nivel de corte
LEVEL2 EQU H'27' ; Nivel de corte
CONT EQU H'24' ; Contador de overflows del timer
DIST EQU H'26' ; Valor del Vin aceptable, entre 0 y 127
PARTIDA
BCF STATUS,RP1
BSF STATUS,RP0
; Me cambio al banco 1
;Configuración de Puertos (Output = 0 , Input = 1)
MOVLW B'11111000'; RB0 , RB1, RB2 como outputs para leds
MOVWF TRISB
MOVLW H'FF' ; Todos los canales de A como input
MOVWF TRISA
MOVLW H'FF' ; Todos los canales de C como input (Vamos a usar RC2 para el
switch)
MOVWF TRISC
BCF STATUS,RP0
7
BCF STATUS,RP1
; Vuelvo al Banco 0
CLRF CONT
CLRF LED
CLRF LEVEL
CLRF LEVEL2
CLRF POT1
CLRF POT2
CLRF DIST
;INTERRUPCIONES
MOVLW B'11000000'
MOVWF INTCON
; Interrupciones Globales y Periféricas
BCF STATUS,RP1
BSF STATUS,RP0
; BANCO 1
MOVLW B'00000001'
MOVWF PIE1
; Activo la interrupción Timer1 Overflow
; Aquí se puede usar la interrupción del USART, etc.
BCF STATUS,RP0
BCF STATUS,RP1
; BANCO 0
;CONFIGURACION TIMER 1
CLRF TMR1L
CLRF TMR1H ; Borro registros TMR1
MOVLW B'00000000' ; Uso de clock interno, prescaler 1:4, Timer1 OFF
MOVWF T1CON
;CONFIGURACION ADC
BCF STATUS,RP1
BSF STATUS,RP0
;BANCO 1
MOVLW B'01000000' ; Justificado Izquierdo FOSC/2 Todos análogos
MOVWF ADCON1
BCF STATUS,RP0
BCF STATUS,RP1
;BANCO 0
MOVLW B'01000000' ;FOSC/8, CH0 por ahora, ADC=OFF
8
MOVWF ADCON0
MOVLW D'42'
MOVWF LEVEL
MOVLW D'84'
MOVWF LEVEL2
LOOP
; Leo los valores de los potenciómetros
CALL LEER_CH0
CALL UBICAR ; Veo en qué lado de "level" estoy
BTFSC STATUS,C
CALL UBICAR2
CALL LEER_CH1
BTFSC PORTC,2 ; Si RC2 está en 1, parpadea
CALL BLINK
BTFSS PORTC,2 ; Si RC2 está en 0, lo prendo
CALL LED_ON
GOTO LOOP
; Vuelvo a hacer lo anterior
UBICAR
BCF STATUS,C ; Me aseguro de bajar el flag
MOVF DIST,0 ; Vin formateado
SUBWF LEVEL2,0 ; (LEVEL) - (W) = (W)
BTFSS STATUS,C ; Según el resultado, activo el led correspondiente
CALL LED_HIGH ; Si no hubo carry, DIST > LEVEL, si es igual se queda en LOW
RETURN
UBICAR2
ADDWF DIST,0
BCF STATUS,C ; Me aseguro de bajar el flag
MOVF DIST,0 ; Vin formateado
SUBWF LEVEL,0 ; (LEVEL) - (W) = (W)
BTFSS STATUS,C ; Según el resultado, activo el led correspondiente
CALL LED_MEDIUM ; Si no hubo carry, DIST > LEVEL, si es igual se queda en LOW
BTFSC STATUS,C
CALL LED_LOW
9
RETURN
IS_HIGH
CALL LED_HIGH ; Si no hubo carry, DIST > LEVEL2, si es igual se queda en LOW
RETURN
IS_MEDIUM
CALL LED_MEDIUM; DIST < LEVEL
RETURN
LED_HIGH ; RD2
MOVLW B'00000100'
MOVWF LED
BCF STATUS,C
RETURN
LED_MEDIUM ; RD1, NUEVO VALOR INTERMEDIO
MOVLW B'00000010'
MOVWF LED
BCF STATUS,C
RETURN
LED_LOW ; RD0
MOVLW B'00000001'
MOVWF LED
BSF STATUS,C
RETURN
LED_ON
MOVLW B'00000000' ; Uso de clock interno, prescaler 1:4, Timer1 OFF
MOVWF T1CON
MOVF LED,0
MOVWF PORTB
RETURN
BLINK
MOVLW B'00000001' ; Uso de clock interno, prescaler 1:1 (tercer y cuarto bit),
Timer1 ON
MOVWF T1CON
MOVF CONT,0
; CONT en W
XORWF POT2,0
; Comparo CONT con POT2, si son iguales (Z=1), cambio el
estado del LED
BTFSC STATUS,Z
CALL CAMBIA_LED
10
BCF STATUS,Z
RETURN
INT
BCF INTCON,GIE
;APAGO INTERRUPCIONES
BTFSC PIR1,TMR1IF ; Si la interrupción es por TMR1 overflow, voy al método
CALL CONTAR
; Aquí se pueden agregar otras interrupciones
BSF INTCON,GIE ;REACTIVO INTERRUPCIONES
RETURN
CONTAR
BCF PIR1,TMR1IF ; Bajo el flag de la interrupción
MOVLW H'EE'
MOVWF TMR1H
MOVLW H'00'
MOVWF TMR1L ; El tiempo de parpadeo dependerá del valor de TMR1H + TMR1L
INCF CONT,1
; Incremento el contador
RETURN
CAMBIA_LED
BCF STATUS,Z
CLRF CONT
MOVF PORTB,0
BTFSC STATUS,Z
CALL PRENDE_LED
BTFSS STATUS,Z
CALL APAGA_LED
RETURN
PRENDE_LED
MOVF LED,0
MOVWF PORTB
BSF STATUS,Z
RETURN
APAGA_LED
BCF PORTB,0
BCF PORTB,1
BCF PORTB,2
BCF STATUS,Z
RETURN
11
LEER_CH0 ; Revisa en qué lado estoy
MOVLW B'01000001' ; Me cambio a CH0
MOVWF ADCON0
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
;BCF ADCON0,CHS0
BSF ADCON0,GO ; Le digo GO
PAUSA0
BTFSC ADCON0,GO
GOTO PAUSA0
MOVF ADRESH,0
MOVWF POT1
; Si está en Clear, movemos el dato
;MOVLW H'00'
;MOVWF ADRESH
BCF STATUS,C
BCF STATUS,DC
BCF STATUS,Z
RRF POT1,1 ; Máximo 127
BCF STATUS,C
MOVF POT1,0
12
MOVWF DIST
RETURN
LEER_CH1 ; Blink
MOVLW B'01001001' ; Me cambio a CH1
MOVWF ADCON0
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
;BSF ADCON0,CHS0
BSF ADCON0,GO ; Le digo GO
PAUSA1
BTFSC ADCON0,GO
GOTO PAUSA1
MOVF ADRESH,0
MOVWF POT2
; Si está en Clear, movemos el dato
;MOVLW H'00'
;MOVWF ADRESH
RETURN
END
13
Descargar