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