miércoles, 31 de octubre de 2007

Problemas con el proyecto

Como habéis podido comprobar llevo un tiempo sin escribir nada. Puede parecer que haya desertado el proyecto como un cobarde, jejej. No es el caso, por lo menos por el momento. Pero si que he sufrido una serie de contratiempos.

Os comento que llevo soldado de la placa que controlará los motores, el conector rs-232, el max232 (cambio de niveles) y el pic16f876. He estado programando algunas rutinas para comprobar que la trasmisión serie funciona. En estas rutinas he conseguido que el pic mande datos al PC y viceversa.
Aunque no se que pasa que a veces pierdo datos, no se si es por el oscilador o por algo.

También comentaros que he pasado de programar en ensamblador a hacerlo en C. He encontrado una herramienta llamada PICC que es un compilador de C para los PIC. Creo que este paso puede acortarme las tareas de programación, como así ha sido.

Bueno paso a comentar los contratiempos. El problema que tengo es que antes de soldar toda la movida lo tenia en dos placas distintas (placas experimentales de esas blancas que no hace falta soldar) y muy tonto de mi cuando fui a conectar la alimentación le metí 12V donde iban 5V. El efecto fue casi inmediato ya olia a quemado y salió una pequeña nube de humo. A pesar de los signos evidentes de "petada" el chip seguia funcionando, pero era solo un espejismo, porque cuando fui a grabarlo de nuevo comprobé que habia muerto.

Como vivo en alicante y esto es lo mas parecido al tercer mundo hablando tecnológicamente pues me ha costado dios y ayuda encontrar un PIC16f876. Vamos que estaba rellenedo un pedido a una tienda de valencia cuando por fin encontré una en Alicante de la cual no me da la gana poner su nombre y darle publicidad.

El tema es que ayer por fin pude probar las rutinas para el puerto serie y parece que medio funcionaban, solo medio porque aun me hacen extraños, pero como la alimentación la tengo con dos cables en un movimiento me saltó una chispa y creo que creé un cortocircuito, por lo que ahora no va nada. ¿es posible que sea el 7805? lo que tengo claro es que el 16f876 no es ya que he comprobado que funcione y grabe y todas esas movidas.

El resumen es que por unas cosas o otras no estoy consiguiendo avanzar al ritmo que tenia previsto y el que seria idóneo para la finalización de la practica. Es posible que empiece a mirar alguna placa hecha para gestion de motores y sobretodo los precios, aunque me congratularia mucho mas poder terminarla yo con mis propias manos. A ver si alguien se anima y me escribe algun consejo o algun animo, porque hoy estoy encendidisimo jejejej.

jueves, 18 de octubre de 2007

Diagrama electronico drivers motores (II)

He tenido que rectificar el diagrama electrónico del driver de motores de nuestro robot. En el anterior están mal enganchadas las patillas de comunicación del pic con el puerto serie. Anteriormente su colocación ha sido arbitraria y después me he dado cuenta que tienen que enchufarse obligatoriamente a los pines RC6 para el Tx y RC7 para el Rx.

El problema reside en que el puerto C ya lo tenia ocupado con el control de los motores, ya que los pines de PWM también están en dicho puerto. Por lo que no me cabe las dos cosas en el mismo puerto.

Para cada motor gestionado por el L293 van dos señales que le indican la dirección que debe de tomar (positivo y negativo) o (negativo y positivo), pero nunca (negativo y negativo) o (positivo y positivo) ya que el motor no se moveria. Como una señal es siempre la contraria que la otra podemos insertar un negador que nos lo haga automáticamente. El negador es el 7404 como se muestra en la imagen:

Gracias al negador conseguimos ahorrarnos 2 patillas, por lo que podemos usar la usart del PIC y el control de los motores con el mismo puerto. Dejando otros puertos para futuras ampliaciones del robot rabotron. Sobretodo el puerto B.

El esquema queda de la siguiente forma:

viernes, 12 de octubre de 2007

Probando el MAX232

Una vez diseñada la placa para el driver de motores para nuestro robot, solo tenemos que empezar a soldarla tal como se ha indicado en el esquema anterior.

El primer paso es el del max232 (en nuestro caso el st232). El MAX232 es un circuito integrado que convierte los niveles de las líneas de un puerto serie RS232 a niveles TTL y viceversa. Esto nos es imprescindible para la comunicación entre el microcontrolador (pic16f876) y el ordenador (rs232).


Del puerto serie solo necesitamos los pines TX y RX. TX es la señal de transmisión de datos, RX es la de recepción (RTS y CTS se utilizan para establecer el protocolo para el envío y recepción de los datos). Para la comunicación con nuestro robot vamos a utilizar lo que vulgarmente llamamos “modem nulo”. Es decir, que tan solo vamos a tener en consideración las señales de RX (recepción) y la de TX (trasmisión) para realizar la comunicación.


Por ultimo podemos ver el video como indicando que el funcionamiento es correcto:

-12V/-9V --> 5V
12V/9V --> 0V
y viceversa


martes, 9 de octubre de 2007

Reconociendo colores: ¿Por que HSV (HBS) y no RGB?

Una vez conseguido capturar imágenes con Linux para nuestro robot, tenemos que pasar a examinar dichas imágenes para así conseguir el objetivo deseado: que rabotron reconozca a nuestra “víctima” mediante visión (webcam). En los inicios el modelo de color empleado fue el conocido RGB (Red, Green, Blue), en este modelo al representarse cada color como una tupla de tres elementos, en nuestro caso lógicamente colores: rojo, verde y azul, esto acarrea un problema a la hora de reconocer un color, en un ambiente de luminosidad variado un color puede tener varios tonos, por ejemplo, podemos tener un amarillo, amarillo oscuro o un amarillo claro (todo dependiendo del nivel de luz que incida sobre nuestro objeto y la webcam que usemos para la captura):

Por lo tanto para reconocer un mismo color con distintas intensidades se nos plantea el problema de tener que crear un filtro de rangos a la hora de localizarlo.

Para solucionar este pequeña pega consideramos mas conveniente usar el modelo HSV (Hue, Saturation, Value) ( también conocido como HBS (Hue, Saturation, Brightness), en este modelo cada color esta representado por una tonalidad, una saturación y un brillo:

Por lo tanto a la hora de localizar un color en concreto nos bastará saber su tonalidad para saber si podría ser el color buscado en la imagen que recibe nuestro robot.

Por tanto para el reconocimiento de nuestra “victima” usaremos el modelo de color HSV.



Diagrama electrónico drivers motores

Vamos a comentar brevemente el diseño de lo que a posteriori será el circuito impreso de nuestro driver de motores.

La comunicación con el pc (con player/stage) se efectuará mediante el puerto serie, usando los pines 2 y 3 que son los de Tx(trasmision) y el Rx (recepcion) y el pin 5 de tierra. Los niveles del puerto serie (-12V para un 1 lógico y 12V para un 0 cero lógico) no coinciden con los que necesita el microcontrolador (5V para un 1 lógico y 0V para un 0 cero lógico). Por ello vamos a utilizar un max232 que es el encargado de convertir los niveles de las líneas de un puerto serie a niveles TTL y viceversa.

Una vez que tenemos trasformadas las tensiones conectamos con el microcontrolador, como ya hemos comentado anteriormente será un PIC16F876. Este microcontrolador es el encargado de recibir las ordenes del pc (cabeza pensante del robot) y manejar los motores.

Para manejar los motores (ya que vamos a usar motores de corriente continua) utilizamos un L293 que basicamente es un circuito puente en h. Las entradas metemos la direccion en que giran los motores y la interrupcion para dejar que giren o pararlos. El circuito se alimenta con 5v pero dejaremos pasar 12 v que son lo que alimentan a los motores (usamos motores dc de 12 v).


Con esto podemos crear nuestro diagrama electrónico para el driver de motores que despues soldaremos en una placa. El diagrama queda de la siguiente manera:


Podriamos haber puesto un inversor (un 7400) para no tener que replicar algunas salidas del pic16f876 con el l293. Pero no se como voy a ir de espacio en la placa y como me sobran pines en el microcontrolador voya gestionarlo por "software", espero no equivocarme.

martes, 2 de octubre de 2007

Modulacion de ancho de pulso (PWM)

Entrando en materia, tenemos que tener presente como vamos a utilizar los motores para el movimiento de nuestro robot. Las variables que nos va a pasar el player/stage a los motores serán la velocidad lineal y la velocidad angular. Con estas dos variables el robot debe de poder moverse de un lado a otro con distintas velocidades.

La primera solucion para ello era utilizar motores paso a paso, ya que con ello podemos seleccionar los pasos que den los mismos tanto haccia adelante y hacia atras. Consultando con un pas de la universidad de alicante me acondejó que no lo hiciera así, ya que son motores muy bruscos y no muy recomendables para el movimiento de un robot, aunque si para la posición de algo.

A si es que he preferido meterme con el "tinglao" de motores de corriente continua (motores dc), es podible que eso sea lo que necesita nuestro robot. El problema reside es que para realizar los giros, un motor debe de ir a distinta velocidad que el otro. Para hacer esto recurrimos al pwm (pulse width modulation) modulacion del ancho del pulso.

PWM es una técnica en la que se modifica el ciclo de trabajo de una señal periódica. De esta manera conseguimos que trabaje mas o menos tiempo un motor. El microcontrolador trabajará por nivel alto, cuanto mas tiempo este en nivel alto más velocidad:

Para usar esto necesitamos un microcontrolador de gama media (no lo mas baratos), el elegido en nuestro caso es el del robot (pic 16f876) con dos salidas moduladas con pwm.

Para probarlo nhemos creado un programita que aumenta el % de nivel alto hasta el 100% y despues disminuye poco a poco hasta el 0% y así indefinidamente. El codigo del microcontrolador para esta tarea lo programamos de la siguiente manera:

;Includes
LIST P=16f876
RADIX HEX
INCLUDE "P16F876.INC"

;Configuracion quitar
; __CONFIG _PWRTE_ON & _WDT_OFF & _HS_OSC & _LVP_OFF


cont1 equ 0x0E ; Numero de ticks a esperar
cont2 equ 0x0F ; Numero de ticks a esperar
cont3 equ 0x10 ; Numero de ticks a esperar

ORG 0x00

GOTO INICIO

ORG 0x05

; Initialisierung
INICIO

; Preparacion del PWM
; Predivisor 16:1 y Timer2 on
BSF T2CON, T2CKPS1 ; Preescalador 16:1
BSF T2CON, TMR2ON ; Activa el Timer2


; Frecuencia a 1,22 KHz
BSF STATUS, RP0 ;Cambio al banco 1
MOVLW D'255' ;255 en decimal
MOVWF PR2 ;1.22 kHz
BCF STATUS, RP0 ;Cambio al banco 0


; Ponemos la potencia al 50%
MOVLW D'127' ;127 en decimal
MOVWF CCPR1L ;50%

; RC2/CCP1 salida
BSF STATUS, RP0 ;Banco 1
BCF TRISC, 2 ;RC2 salida
BCF STATUS, RP0 ;Volvemos al Banco 0

; Inicializamos el modo PWM de CCP1
CLRF CCP1CON ;Limpiamos reg CCP1
BSF CCP1CON, CCP1M3 ;CCP1 en modo pwm 11XX
BSF CCP1CON, CCP1M2

;Aumento

AUMENTO
CALL RETARDO
INCFSZ CCPR1L,1 ;Incrementamos uno
GOTO AUMENTO ;Va aumentando
GOTO DECREMENTA ;Toca decrementar

;decrementa
DECREMENTA
CALL RETARDO
DECFSZ CCPR1L,1 ;Decrementamos uno
GOTO DECREMENTA ;Va decrementando
GOTO AUMENTO ;Toca aumentar


;************************************************************
;* Rutina de espera.
;* ENTRADA:
;* -W: Numero de ticks a esperar. Cada tick es de 10ms
;************************************************************

RETARDO
movlw D'2'
movwf cont3
CICLO3 movlw D'20'
movwf cont2
CICLO2 movlw D'33'
movwf cont1
CICLO decfsz cont1,1
goto CICLO
decfsz cont2,1
goto CICLO2
decfsz cont3,1
goto CICLO3


RETURN ; Si, terminar


; FIN
end

A continuación podemos ver un video de la ejecucion del programa. La prueba se hace con un led. Cuanto mas pwm el led se ilumina mas y cuando vamos bajando vemos como el led disminuye su iluminacion hasta apagarse y luego al reves. Además podemos contemplar los voltages como aumenta y disminuye acorde con el led: