lunes, 14 de abril de 2008

Avances en hardware y en software

Al final, después de muchas horas intentando que funcionase el receptor integrado de Sharp sin ningún éxito, hemos montado uno paso a paso. Este receptor consiste en un fotodiodo BPW41 en la base de un transistor(BC107C) que nos convierte la corriente proporcionada por el fotodiodo(que es proporcional a la luz incidente en el fotodiodo)a tensión. A la salida del transistor, tenemos un filtro paso bajo con frecuencia de corte de apróximadamente 2KHz que nos elimina las interferencias de los fluorescentes(a 100Hz).
A la salida, tenemos un amplificador de ganancia 50 que se nos ha quedado un poco escaso. Por ello, tendremos que cambiar las resistencias para aumentar la ganancia para lograr algunos metros más.
Detrás del amplificador, tenemos un detector de envolvente que y un filtro paso alto para eliminar la componente continua introducida por el detector de envolvente.
Por último, tenemos un comparador de nivel para conseguir una señal interpretable como un 1 lógico. Un led a la salida nos indica si recibimos señal o no.
Con este montaje, tenemos a la salida una señal de 3.5V(que se interpreta como 5V)y hemos conseguido una distancia de entre 1.5m y 2m. De todos modos, aumentaremos la ganancia del amplificador para aumentar los metros.
En cuanto a la programación de la hormiga,hemos logrado que la hormiga después de orientarse vuelva a orientarse hasta que estemos enfilados al emisor y se deshabilite la búsqueda. Para ello, hemos corregido un fallo que teníamos en el código: queríamos guardar el dato de la posición del servo del brazo en una variable apuntada por un puntero y nos habíamos equivocado en la sintaxis utilizada para guardarlo. En vez de guardarlo, habíamos dado a ese puntero la dirección de ese dato.

En conclusión, ya hemos conseguido que la hormiga se ponga en dirección al emisor y, en cuestiones hardware, el emisor y el receptor de infrarrojos.

domingo, 13 de abril de 2008

Configuración software

Tras mucho debatir sobre qué implementación era mejor: interrumpir cada vez que el receptor de infrarrojos detecte señal (flanco) o interrumpir periódicamente y mapear el puerto de entrada donde el receptor está conectado; finalmente nos decidimos por la segunda por dos razones:
- Podría ser que el receptor detectara señal en una posición en la que no está realmente el emisor, pero detecta señal debido al ángulo de emisión del emisor. Cómo la interrupción se produciría cuando éste empieza a detectar, seguramente la hormiga se orientaría a una posición incorrecta.
- Con el segundo método, tomamos varias muestras en el tiempo y finalmente la hormiga se orienta a una posición media de ellas.

Y una vez decidido... ¡ a programarlo !
Programamos pues el Timer 2 para que interrumpa cada 50 ms. Vale, nos hemos pasado. Lo cambiaremos a 200ms. En cada interrumpción se llama a la rutina que se encarga de verificar si en el pin 4 del puerto de entrada hay nivel alto. Si hay nivel alto es que el receptor está detectando algo. Guardamos la posición del servo del brazo en un array. Cuando se hayan alcanzado un número de muestras establecdio (establecemos que sean 3), se calcula la media de ellas y se establece un grado de giro en función de este valor.
Problema: Vale, se programa un giro, pero si no se hace nada más, la hormiga siempre estará andando con ese giro y por tanto no se alcanzará la meta.
Solución: No pasa nada. Como esto se está ejecutando por siempre, se repetirá el ciclo y la hormiga se volverá a reorientar con otro ángulo de giro, hasta que detecte al emisor en una posición más o menos en línea recta, momento en el cual se pone a caminar en línea recta.

Pero a la hora de probarlo...
Parece que el sistema funciona. Cuando se detecta un valor alto en el puerto se guardan las posiciones y al alcanzar 3 muestras la hormiga se orienta. Pero no funciona como es debido ya que por causas aún desconocidas siempre se orienta igual y luego no se re-orienta. Continuaremos experimentando...

lunes, 7 de abril de 2008

Hardware III

Ya hemos conseguido que el emisor emita a la potencia que necesitamos pero el receptor nos sigue sin funcionar...
Para conseguir que el aprovechar al máximo las propiedades del led emisor estamos emitiendo a 100mA de corriente media de pico.Para ello, tenemos que emitir 200mA durante el ciclo activo lo que implica poner una resistencia en el emisor del transistor de 10 ohmios y el diodo emisor de luz en el colector. Para polarizar correctamente la base, hemos puesto dos inversores trigger-schmitt seguidos de modo que regeneremos la señal(y tengamos la señal entre 0 y 5V) sin negar su lógica.
Tras los dos inversores, hemos colocado un diodo 1N4148 de modo que baje la tensión a una tensión admisible para la base del transistor(~0.7V)Eso más el pequeño efecto de carga del transistor hace que el transistor quede polarizado perfectamente.
Además, en la hoja de especificaciones del fabricante del IS1U60 encontramos un receptor estándar que colocado a 20cm del transmisor debe proporcionar a su salida una tensión de 40mVpp. Esto asegura que el IS1U60 va a poder cumplir las especificaciones para nuestro transmisor.

En nuestro caso, a la salida del receptor estándar tenemos 50mVpp aproximadamente situando al transmisor a unos 25/30 cm del receptor estándar.
A pesar de todo ésto, el IS1U60 se mantiene a nivel alto haya o no haya infrarrojos a su alrededor...Ahora trabajamos para intentar solucionarlo.

sábado, 5 de abril de 2008

Video de lo que llevamos hasta ahora

Hardware II

Ahora hemos cambiado el amplificador de transconductancia por el transistor 2N2222 que puede proporcionar hasta 800mA y disipa poca potencia.
El montaje consta de el diodo más una resistencia en el colector y está alimentado por 5V en el colector.
Con ésto hemos conseguido que el diodo emita pero no con la suficiente potencia debido a que el receptor no lo capta a no ser que esté muy cerca del diodo emisor. Ahora estamos trabajando para solucionarlo...

Hardware

Como hardware de nuestro sistema necesitamos un emisor y un receptor de infrarrojos. Como receptor hemos utilizado uno integrado, el IS1U60 de Sharp que está diseñado para recibir una onda cuadrada de ciclo de trabajo del 50% a 38KHz. Por ello, hemos creado un emisor de infrarrojos que emita a 38KHz. En un primer momento, el emisor consta de un oscilador(555) en configuración multivibrador astable que crea una onda cuadrada a 76KHz(explicado posteriormente), como necesitamos que el ciclo de trabajo sea del 50% y eso no se puede conseguir con el 555 hemos utilizado un flip-flop JK que hemos montado en configuración Toggle. El flip-flop tipo Toggle en cada flanco de subida pone un nivel alto o bajo (se alterna), de modo que la frecuencia se divide entre 2(motivo por el cual hemos creado la onda a 76KHz)
A la salida de este montaje tenemos entonces una onda cuadrada con ciclo de trabajo del 50% y a 38KHz. Ahora queremos convertir esa tensión en corriente para excitar al diodo emisor de luz infrarroja(CQY89) y, para ello, utilizamos un amplificador de transconductancia aterrizado... pero fue un error debido a que el amplificador no era capaz de proporcionar los 100mA de pico que necesitamos para que el diodo emita en sus mejores condiciones.
Por ello, necesitamos cambiar el último módulo por un transistor que pueda proporcionar más de 100mA. Por ej. el 2N2222

martes, 1 de abril de 2008

Incorporamos el brazo robótico al robot

Hemos integrado el brazo robótico en la hormiga. Para ello, primero intentamos ampliar la funcionalidad del programa proporcionado por Félix pero sin ningún resultado. Los servos no respondían bien a las posiciones relativas que les indicabamos en el programa. Por ello, hemos tenido que hacer una clase aparte que rija el movimiento del brazo.
Hemos implementado el movimiento del brazo de modo que sólo se mueva el servo que realiza el movimiento giratorio que es el que va a hacer el barrido en busca de la boya infrarroja.