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.


miércoles, 5 de marzo de 2008

Algunos problemillas

En nuestra siguiente sesión de laboratorio nos proponemos incorporar a la araña un brazo robótico que nos servirá para colocarle el sensor infrarrojo y así poder realizar barridos en busca de la señal proveniente del faro.

En el laboratorio conseguimos otra araña, distinta a la que habíamos probado el día anterior, que ya tenía montado el brazo robótico así que nos parece una buena idea utilizar esta en lugar de montar un brazo en la otra. Pero antes hemos tenido que corregir algunos problemas que nos han surgido:
- El primero de ellos es que algunas piezas encargadas de trasmitir el movimiento del servo a la pata de la araña se han salido de sus tuercas. Para solucionarlo hemos tenido que quitar algunas piezas para poder situarlas de nuevo correctamente.
- El segundo hace referencia a la controladora de servos, mostrada en la imagen:


Para nuestra aplicación utilizamos 15 servos (12 para las patas y 3 del brazo). El problema reside en el slot 2 de la controladora segunda no funciona correctamente como hemos podido comprobar. Esto tiene fácil solución: no usarlo. Pero este servo era utilizado por el programa para enviarle información del movimiento de una pata, por lo que hemos tenido que modificar el código para que ese movimiento sea enviado al servo 8 de la controladora 2 (en el cual conectamos el que antes estaba conectado al 2).
- Otro problema que nos sorprendió en un principio es que al ejecutar el programa, una pata se colocaba de inicio en una posición que no correspondía (a priori) con la que el programa le transmitía (la posición media: 127). Como pudimos comprobar, el fallo no era del programa, ni del servo, ni de la comunicación. En realidad estaban ocurriendo dos cosas que trataremos de explicar lo más sencillamente posible. Para entenderlo, diré que se solucionó corrigiendo (destornillador en mano) la posición incorrecta de la pata. Es decir, como esta pata debía estar situada en el medio (porque así lo indicaba el programa) y no lo estaba, pues la desatornillamos y la fijamos en la posición media real. De esta forma al iniciar el programa ahora sí están todas situadas en la posición media. El siguiente experimento nos saca de dudas sobre lo que estaba ocurriendo. Al conectar la alimentación de la araña, la controladora manda a sus servos una posición inicial que tiene preprogramada. En principio esta dirección es la 127 (posición media). Pues bien, al hacer esto, la pata conflictiva aparece unos 45º desplazada respecto de su posición media, lo que nos hace pensar que la posición inicial que la controladora envía no debe de ser la 127. El programa sin embargo sí envía la 127 y la pata se coloca bien en su posición media.
Deducimos entonces que el problema era en realidad dos: la posición media del servo y posición media real no coincidían y que la controladora no envía la posición inicial 127, sino otra. Esto no es en realidad problemático para nuestra aplicación.

Tras haber solucionado estos problemas, conectamos los servos del brazo a los que nos quedan libres en la controladora. Nos quedan libres sólo tres, puesto que uno no funciona.