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:

viernes, 28 de septiembre de 2007

Webcam bajo linux

Como es de esperar , la visión de nuestro robot se hará mediante una camara web que captura el entorno para que más tarde sea player quien procese dicha imagen.


Para hacer las pruebas he cogido la mía, una logitech un poco reventada. He estado buscando por inet y he encontrado dos drivers distintos: el spca5xx y el gspca. La verdad es que no se aun la diferencia entre ambos. En un principio entendí que el spca5xx era mas moderno y lo instalé. Más tarde lei en otra pagina web que era al revés y entonces instalé el gspca. El caso es que ahora conviven los dos en mi lenny, por ahora sin problemas.

La forma de instalar spca5xx fue esta:

#apt-get install spca5xx-source

Se nos instalara en /usr/src, por tanto vamos a esa ruta, y lo descomprimos:

laos:/home/usuario# cd /usr/src/
laos:/usr/src# ls spca5xx-source.tar.bz2
laos:/usr/src# unp spca5xx-source.tar.bz2
modules/ modules/spca5xx/
modules/spca5xx/debian/
modules/spca5xx/debian/rules
modules/spca5xx/debian/control.modules.in
modules/spca5xx/debian/control
modules/spca5xx/debian/compat
modules/spca5xx/debian/copyright
modules/spca5xx/debian/changelog
modules/spca5xx/cutlog.py
modules/spca5xx/LICENSE
modules/spca5xx/CHANGELOG
modules/spca5xx/INSTALL
modules/spca5xx/drivers/
modules/spca5xx/drivers/usb/
modules/spca5xx/drivers/usb/spca500_init.h
modules/spca5xx/drivers/usb/spcaCompat.h
modules/spca5xx/drivers/usb/spca5xx.h
modules/spca5xx/drivers/usb/pac207.h
modules/spca5xx/drivers/usb/spcausb.h
modules/spca5xx/drivers/usb/sonix.h
modules/spca5xx/drivers/usb/tas5130c.h
modules/spca5xx/drivers/usb/cxlib.h
modules/spca5xx/drivers/usb/spca508_init.h
modules/spca5xx/drivers/usb/sp5xxfw2.h
modules/spca5xx/drivers/usb/spcadecoder.c
modules/spca5xx/drivers/usb/pb0330.h
modules/spca5xx/drivers/usb/cs2102.h
modules/spca5xx/drivers/usb/dummy_cam.h
modules/spca5xx/drivers/usb/spcadecoder.h
modules/spca5xx/drivers/usb/pas106b.h
modules/spca5xx/drivers/usb/cx11646.h
modules/spca5xx/drivers/usb/sn9cxxx.h
modules/spca5xx/drivers/usb/hdcs2020.h
modules/spca5xx/drivers/usb/spcagamma.h
modules/spca5xx/drivers/usb/hv7131b.h
modules/spca5xx/drivers/usb/hv7131c.h
modules/spca5xx/drivers/usb/spca500.dat
modules/spca5xx/drivers/usb/jpeg_header.h
modules/spca5xx/drivers/usb/spca501.dat
modules/spca5xx/drivers/usb/icm105a.h
modules/spca5xx/drivers/usb/spca501_init.h
modules/spca5xx/drivers/usb/jpeg_qtables.h
modules/spca5xx/drivers/usb/spca505.dat
modules/spca5xx/drivers/usb/spca505_init.h
modules/spca5xx/drivers/usb/spca508.dat
modules/spca5xx/drivers/usb/et61xx51.h
modules/spca5xx/drivers/usb/ov7630c.h
modules/spca5xx/drivers/usb/tv8532.h
modules/spca5xx/drivers/usb/zc3xx.h
modules/spca5xx/drivers/usb/spca506.h
modules/spca5xx/drivers/usb/spca561.h
modules/spca5xx/drivers/usb/mr97311.h
modules/spca5xx/drivers/usb/spca5xx.c
modules/spca5xx/drivers/usb/sp5xxfw2.dat
modules/spca5xx/README-TV8532
modules/spca5xx/README-SONIX
modules/spca5xx/Makefile
modules/spca5xx/README-KERNEL-UPTO-2.6.16
modules/spca5xx/RGB-YUV%2fmodule-setting
modules/spca5xx/README

Ahora lo tendremos en la carpeta modules, vamos a élla y lo compilamos:
laos:/usr/src# cd modules/spca5xx/

instalar el source del kernel:
laos:/usr/src/modules/spca5xx# apt-get install linux-source-2.6.21
laos:/usr/src/modules/spca5xx# apt-get install linux-tree-2.6.21
laos:/usr/src/modules/spca5xx# apt-get install linux-headers-2.6.21-2-all-i386

otros paquetes necesarios:
laos:/usr/src/modules/spca5xx# apt-get install gcc

make
make install
laos:/usr/src/modules/spca5xx# lsmod |grep spca5xx
spca5xx 658224 1
videodev 25952 2
spca5xx usbcore 123272 5 spca5xx,usbhid,ehci_hcd,uhci_hcd


Con esto ya conseguí que se viera la cámara perfectamente. Luego más tarde por un problema con una cámara intenté instalar el otro driver, el gspca. De la siguiente manera:

laos:/home/usuario# apt-get install module-assistant
laos:/home/usuario# apt-get install gspca-source
laos:/home/usuario# m-a prepare (abreviatura de module-assistant)
laos:/home/usuario# m-a a-i gspca
laos:/home/usuario# modprobe gspca
laos:/home/usuario# lsmod |grep spca5xx
spca5xx 658224 0
videodev 25952 3
gspca,zc0301,spca5xx usbcore 123272 9 gspca,usbhid,zc0301,snd_usb_audio,snd_usb_lib,spca5xx,ehci_hcd,uhci_hcd

Podemos ver como ahora carga los dos drivers y sigue yendo igual. Para probarla podeis usar cualquier programa que use la webcam o usad el camorama:

apt-get install camorama
camorama

Os pego una imagen de mi propio sistema operativo.

cámara funcionando.

sábado, 1 de septiembre de 2007

Mi proyecto

Como todo en la vida, las cosas tienen un principio, un desarrollo y un final. Mi carrera universitaria no iba a ser menos, a si es que me encuentro casi al final del trayecto. Para terminar necesito hacer el proyecto de fin de carrera. Para esto cuento con la inestimable ayuda de mi compañero de andadas (por lo menos en los ultimos 3 años), mi amigo victor.

Como Victor le da relativamente igual el proyecto a realizar, he decidido elegir yo por él. Quizás esto sea bastante peligroso, ya que es muy probable que nos metamos en un verdadero berengenal. Pero bueno creo que hemos salido de situaciones peores, o sea que esto no nos da miedo y seguro que sale adelante (Intento convencerme a mi mismo).

La idea es hacer un robot. Vaya tela ¿no?. La verdad es que hace tiempo hice uno bastante sencillo que se trataba de un sigue-lineas. Con un PIC 16F84 y unos cuantos sensores infrarrojos de corto alcance (CNY70) conseguí terminarlo y la verdad es que funcionaba bastante bien. Pero te das cuenta que no tiene muchas posibilidades un microcontrolador para crear un robot "semi-inteligente". La segunda toma de contacto queria que fuera con una fpga pero eso fue tan desastroso que ni lo cuento.Lo que pasa es que como los ingenieros, o los informaticos, o simplemente yo, siempre queremos superarnos he seguido investigando. Y creo que ya se el berengenal que voy a hacer.

La idea es crear un robot "inteligente". Lo de inteligente no se refiere a que sea einstein, ni nada parecido, me conformo con que tenga alguna conducta inteligente. En un principio lo hablé con un profesor de la universidad y pactamos algo tan simple como seguir a una persona dada. Ese es el objetivo aunque me gustaria sobrepasarlo.

El problema tiene dos partes diferenciadas, por un lado el montaje del robot (mecanicamente y electronicamnente) y por otro lado la programacion del mismo y la instauracion de inteligencia artificial. Lo que me lleva a no poder hablar solo con un departamento, sino que tendré que ir pidiendo ayuda de al menos dos. Aunque el departamento encargado seguramente será el de inteligencia artificial.

En la parte del montaje tengo un amigo que trabaja con metacrilato, por lo que en plan de retales creo que podré montarlo, aunque aun me queda hacer el diseño. Pero la verdad es que llevo un lio con que motores ponerle y como gestionarlos. Supongo que unos motores paso a paso para medir los cm que avanza y la gestion haré alguna placa. Por otro lado pondré una camara web para la vision del robot. ¿Qué camara? Aun no se. por ahora uso una logitech bastante antigua, aunque he leido que la websphere de logitech va bien.

Por el lado del software la idea es meterle un portatil entero con player/stage instalado que sea el que gestione todo y que interactue con el hardware. La verdad es que nunca he usado player/stage pero estoy viendo que no es dificil y da posibilidades. Creo que la IA se la daré a mi compi Victor y yo me dedicaré al montage y a la electronica.

No se como saldrá esto. Espero que dios reparta suerte y espero vuestros comentarios tambien.