[2ª Práctica] Introducción a la Placa Pic Bot Alumnos: Leonardo Lanchas Rolando y Laia Pérez Ríos Asignatura: DSBM Curso Académico: 2008/2009 Universidad: ULPGC- Facultad de Ingeniería Informática Índice 1. Objetivos ………………………………………pág. 2 2. Planteamiento de la práctica…………pág. 3 3. Procedimiento …………………………….. pág. 4 4. Resultados y Problemas ………………. pág. 6 5. Conclusiones ………………………………. pág. 8 6. Anexo ………………………………………… pág. 9 Leonardo Lanchas Rolando y Laia Pérez Ríos 1 1.Objetivos Esta segunda práctica de la asignatura Diseño de Sistemas Basados en Microprocesador tiene como objetivo que el alumnado se familiarice con el uso de la placa Pic Bot (Controladora MSX84), de manera que sea capaz de programarla y se adquieran los conocimientos básicos de la misma. Asimismo el alumno adquirirá las destrezas necesarias para manejar los sensores CNY70, que son capaces de reflejar distintas longitudes de onda. Y finalmente, también se pretende que el alumno aprenda a manejar los Motores DC, ya que sus aplicaciones son bastante útiles para lo que esta práctica pretende llevar a cabo. Leonardo Lanchas Rolando y Laia Pérez Ríos 2 2. Planteamiento de la práctica Tal y como se ha comentado en el apartado anterior en esta práctica se va a hacer uso de la placa Pic Bot. Análogamente a la práctica anterior, se seguirá programando el Pic pero esta vez, añadiendo las peculiaridades de la controladora MSX84. El cometido de la práctica es montar un robot con capacidad para desplazarse a lo largo de una línea blanca. De esta manera, el robot deberá recorrer el camino propuesto sin problema alguno, tanto en tramos rectos como curvos. Leonardo Lanchas Rolando y Laia Pérez Ríos 3 3. Realización de la práctica En primer lugar se procedió a estudiar el manual de la placa Pic Bot, para adquirir los conocimientos básicos sobre la misma y poder llevar a cabo la realización de la práctica de una forma óptima. De esta manera, se estudiaron las características generales de la placa así como su funcionamiento básico. Por otro lado, se llevó a cabo el estudio de los sensores de luz, ya que serán los encargados de seguir la línea que marcará el circuito que deberá seguir el robot. Una vez estudiados los sensores, se procedió a analizar el funcionamiento de los motores ya que son los encargados de habilitar el movimiento del robot. Se llevó a cabo un estudio exhaustivo de las combinaciones de bits necesarias para determinar los movimientos correspondientes. La tabla siguiente muestra la codificación de bits del puerto B y el movimiento correspondiente. Parada Adelante izq_adelante ( giro a la derecha ) der_adelante ( giro a la izquierda ) 00000000 00001101 00001111 00001100 A continuación se procedió a manejar los sensores de luz. El comportamiento es bastante simple –para más información ver el manual de la placa indicado en la bibliografía-. De esta manera, se programó el pic para que el robot fuera capaz de seguir la línea blanca. Se trata de una línea blanca debido a que el color del suelo del laboratorio es negro, y de esta manera es más sencillo que detecte la línea. Leonardo Lanchas Rolando y Laia Pérez Ríos 4 Al disponer de dos sensores de luz la tarea de programación del PIC resultó más fácil de implementar. Una vez hecho, se comenzó a realizar una serie de pruebas para comprobar la validez del código escrito. Dichas pruebas, se detallan en el apartado siguiente de esta memoria así como los problemas surgidos y sus soluciones. Leonardo Lanchas Rolando y Laia Pérez Ríos 5 4. Resultados y Problemas Tal y como se comentó en el apartado anterior, se estudió el manual de la placa así como las características de los motores DC, obteniendo así los códigos que el puerto B del Pic debía tener para un correcto funcionamiento de los motores así como para realizar los movimientos deseados. Para poder probar el funcionamiento de los motores, fue preciso colocar el switch en la posición correcta para que pudiera recibir corriente de una fuente de alimentación externa. Una vez puesto en marcha, se comprobó que los movimientos que realizaba no eran los debidos, produciéndose incongruencias entre el manual de la placa y el sentido de giro de las ruedas del robot. Esto era debido a que una rueda estaba colocada en un sentido y la otra en sentido contrario. Como consecuencia, en el código implementado, se tuvo que cambiar los valores del puerto de B teniendo en cuenta este detalle. Una vez modificados, el robot realizaba los movimientos descritos correctamente, siendo capaz de ir hacia adelante, hacia atrás, a la izquierda y a la derecha. Cuando ya se tenía el código completo del robot, se procedió a verificar que efectivamente funcionaba. En primer lugar esto no ocurría así, ya que había ocasiones en las que no detectaba bien la línea y realizaba un movimiento erróneo. Asimismo, otro inconveniente que imposibilitaba al robot a realizar un trazado correcto del circuito, era el ancho de la cinta que describía el circuito. Debido a ello, se optó por cambiar el ancho y poner una línea más estrecha. Con esta nueva anchura de la cinta, se procedió a cambiar el código de manera que se tuviera en cuenta que la línea se encontraba en medio de ambos sensores. En esta ocasión, el robot realizaba un trazado correcto en los tramos rectos, presentado comportamientos distintos en los tramos curvos. Tras una serie de pruebas se comprobó que era debido a que los sensores se encontraban muy próximos entre sí y muy cercanos al suelo. De esta manera, se cambió la disposición de los mismos, alejándolos un poco y elevándolos un poco con respecto al suelo. Una vez realizada dicha modificación, el robot se vio capaz de recorrer el circuito, tanto en los tramos rectos como en los curvos y en ambos sentidos. Leonardo Lanchas Rolando y Laia Pérez Ríos 6 Leonardo Lanchas Rolando y Laia Pérez Ríos 7 5. Conclusiones En primer lugar, cabe destacar que antes de proceder a realizar cualquier práctica es conveniente documentarse adecuadamente sobre el material del que se dispone, con el objetivo de adquirir los conocimientos necesarios para llevar la práctica a cabo. Por otro lado, el uso de sensores no es muy complejo pero adquieren un comportamiento distinto es función de la posición que presenten y la distancia con respecto al suelo, ya que según ésta reflejan distintas longitudes de onda y las interpreta de maneras diferentes, pudiendo incluso no realizar su cometido. Por lo que a los motores respecta, cabe decir que su comportamiento es bastante sencillo y no presenta ninguna implicación, salvo tener en cuenta la posición y sentido en el que están dispuestos con el fin de codificar el movimiento correctamente. Cabe destacar que hay que tener presente que se está programando a bajo nivel y por tanto se debe hacer un uso adecuado y aprovechar al máximo los recursos de los que se dispone. Por último, cabe destacar las facilidades que presenta el PIC para interactuar con la placa Pic Bot, ya que el comportamiento es el mismo y no presenta ninguna diferencia en cuanto a términos de programación. Leonardo Lanchas Rolando y Laia Pérez Ríos 8 6.Anexo ;Código sin librería ; programa inicio List p=16F84A include "P16f84A.INC" ORG 00 goto Inicio ORG 05 Inicio ; GLOBAL Configuracion clrf PORTA bsf STATUS,RP0 clrf PORTA ; Desactiva latch de salida de PORTA ; Selecciona página 1 ; Puerto B como salida movlw 0xFF movwf PORTB bcf STATUS,RP0 ; Puerto B como entrada ; Selecciona pÁgina 0 btfss PORTB, 0 goto der_adelante ; si me desvío a la izq, ; vamos a la dcha btfss PORTB, 1 goto izq_adelante ; si me desvío a la dcha ; vamos a la izq Bucle adelante movlw b'00001101' movwf PORTA goto Bucle izq_adelante movlw b'00001111' movwf PORTA goto Bucle ; giro a la dcha der_adelante movlw b'00001100' movwf PORTA goto Bucle END ; giro a la dcha ;Código con librería ;Archivo principal que hace uso de la librería ; programa inicio List p=16F84A include <P16f84A.INC> include "coche.INC"; ; Tipo de procesador ; Definiciones de registros internos principal CODE 00h GOTO Comienzo Leonardo Lanchas Rolando y Laia Pérez Ríos 9 MAIN CODE Comienzo call Inicio Bucle call SENSOR_IZQ btfsc sensorIzq, 0 goto derecha ; si me desvío a la izq, ; vamos a la dcha call SENSOR_DER btfsc sensorDer, 0 goto izquierda ; si me desvío a la dcha ; vamos a la izq Adelante movfw adelante movwf movimiento call MOVER goto Bucle izquierda movfw movwf call goto derecha movfw movwf call goto END ; giro a la dcha izq_adelante movimiento MOVER Bucle ; giro a la dcha der_adelante movimiento MOVER Bucle ; Código de la librería List p=16F84A include "P16f84A.INC" ; Tipo de procesador ; Definiciones de registros internos UDATA parada adelante RES 1 GLOBAL parada RES 1 GLOBAL adelante izq_adelante RES 1 GLOBAL izq_adelante der_adelante RES 1 GLOBAL der_adelante movimiento RES 1 GLOBAL movimiento sensorIzq RES 1 GLOBAL sensorIzq Leonardo Lanchas Rolando y Laia Pérez Ríos 10 sensorDer RES 1 GLOBAL sensorDer LiberiaCoche CODE Inicio GLOBAL Inicio clrf PORTA bsf STATUS,RP0 clrf PORTA ; Desactiva latch de salida de PORTA ; Selecciona página 1 ; Puerto A como salida movlw 0xFF movwf PORTB bcf STATUS,RP0 ; Puerto B como entrada ; Selecciona pÁgina 0 ;Inicializacion de las variables clrf parada clrf movimiento ; por defecto está parado movlw b'00001101' movwf adelante movlw b'00001111' movwf izq_adelante movlw b'00001100' movwf der_adelante return SENSOR_IZQ GLOBAL SENSOR_IZQ btfss PORTB, 0 goto uno ; blanco goto cero ; negro uno movlw 1 ; blanc0 goto izq cero movlw 0 izq ; negro movwf sensorIzq return SENSOR_DER GLOBAL SENSOR_DER btfss PORTB, 1 goto uno1 goto cero1 ; si esta a Uno es negro uno1 movlw 1 goto der ; blanc0 movlw 0 ; negro cero1 der movwf sensorDer Leonardo Lanchas Rolando y Laia Pérez Ríos 11 return MOVER GLOBAL MOVER movfw movimiento movwf PORTA return END ;Manual de librería y definiciones necesarias ; ; * Inicio : Rutina empleada para configurar el puerto A ( para mover los motores ) como salida y el B como entrada ( lectura de los sensores ). También inicializa los movimientos de los motores: parada( motor parado ), adelante( avance ), izq_adelante ( giro hacia la derecha ), der_adelante( giro hacia la izq. ) DEBE SER LA PRIMERA RUTINA QUE SE EJECUTE ; ; * MOVER : rutina que mueve el coche. ; ; * movimiento : variable donde se carga el movimiento que se desea efectuar ( parada, adelante, izq_adelante o der_adelante ). A continuación de cargar el movimiento que se quiere ejecutar, se llama a la rutina MOVER. ; * SENSOR_IZQ : Evalúa los datos procesados por el sensor izquierdo y devuelve 0 si el color de lo que "ve" es negro y 1 en caso contrario. ; * sensorIzq : varible donde SENSOR_IZQ devuelve el resultado : 1, o, 0 ; ; ; * SENSOR_DER : funciona de la misma manera que SENSOR_IZQ, con la única diferencia de que evalúa el sensor derecho. ; * sensorDer o, 0. : varible donde SENSOR_IZQ devuelve el resultado : 1, ;inicializacion EXTERN Inicio ; moviemientos EXTERN parada EXTERN adelante EXTERN izq_adelante EXTERN der_adelante ; valores de los sensores EXTERN sensorIzq EXTERN sensorDer EXTERN movimiento ; funciones EXTERN MOVER EXTERN SENSOR_IZQ EXTERN SENSOR_DER Leonardo Lanchas Rolando y Laia Pérez Ríos 12