jueves, 22 de mayo de 2008

Competición de velocidad

Nuestra última aportación a esta práctica ha sido una mejora para que la hormiga camine más rápida y tenga opción de ganar en la prueba de velocidad.

Lamentablemente olvidamos grabar un vídeo, pero no cronometrarla: Tardó aproximadamente 18 segundos en recorrer un metro.
Como es lógico esta prueba debe hacerse sin la placa que contiene la circuitería del receptor de infrarrojos, puesto que en ese caso, el peso de ésta haría ralentizar el movimiento.

miércoles, 14 de mayo de 2008

Boya móvil

Otro vídeo de como se orienta la hormiga. En este además podemos apreciar que, incluso moviendo la boya, la hormiga se va reorientando hacia ella.

lunes, 12 de mayo de 2008

Hormiguita no hay camino, se hace camino al andar

Al fin vemos la luz al final del túnel. La hormiga ya es capaz de orientarse debidamente hacia el emisor de infrarrojos, situado a una distancia aproximada de 1.70 m. Y no sólo si éste está de frente, sino también si está de espaldas a la "cabeza" de la hormiga.
A continuación explico el funcionamiento básico:
La hormiga lleva incorporada en el extremo inferior de la "cabeza" el sensor capaz de detectar un haz de luz infrarroja. La circuitería está preparada para que la detección sea de una onda cuadrada de frecuencia 38Khz. Dicha circuitería estima el nivel de señal recibido y entrega un "1" al Coldfire en caso de recepción y "0" en caso de no recepción.
El software tiene programado una interrupción cada 100ms que comprueba si en el pin establecido del puerto de entrada recibe un "1" o no. En caso afirmativo, configura el sistema motriz de la hormiga con un índice de giro en función de la posición del servo de rotación del brazo en el instante de la recepción.
  • Este proceso se realiza sin cálculos matemáticos: un estímulo (recepción), una respuesta (orientación). Este sistema tiene un inconveniente que estamos tratando de solucionar. Funciona muy bien para las distancias largas, pero falla en las distancias cortas. A poca distancia del emisor, aumenta mucho la frecuencia con que se recibe "1" y por tanto la hormiga no para de recibir información sobre cambios del índice de giro. Esto produce en la hormiga una sensación de "no saber qué hacer" que se traduce en "cada pata va a su aire". Se reduce mucho la velocidad pero (ventaja) al final acaba llegando justamente al emisor. Este sistema es el que se ha utilizado en el vídeo.
    Se hace camino al andar porque nunca deja de reorientarse. A medida que anda, rastrea.

    Una fácil solución a esto podría ser programarlo para que cuando detecte una posición central, simplemente camine recto, deshabilite las interrupciones y menos líos. Dos inconvenientes tiene esto:
    1. No llega exactamente a la boya (puede llegar a tener un error de más de medio metro)
    2. Pierde la funcionalidad de "seguir al emisor". Es decir, que el emisor se pueda mover y la hormiga va siguiéndole. Nos gustaría mantener esta libertad a modo de mejora.

  • El sistema alternativo es tomar varias muestras (3 por ejemplo) y hacer la media de las tres para tomar la decisión de orientarse. Este sistema es ventajoso en cuanto a que los movimientos de la hormiga son más "limpios", mantiene la velocidad más o menos constante, funciona bien a distancias cortas pero hay situaciones en las que no funciona del todo bien. La explicación que se nos ocurre es la siguiente: Cuando la hormiga está girando (para dar la vuelta al principio por ejemplo), las posiciones de referencia para reorientarse, que son las de la rotación del brazo, están desvirtuadas porque no se está teniendo en cuenta que la hormiga está girando, por lo que si se toman varias medidas y se hace la media, puede ser que camine hacia un lugar en el que para nada está el emisor.
    Sin embargo este sistema experimentalmente funcionaba bastante bien, aunque fallaba en la mitad de las situaciones probadas.
    Tampoco hemos podido profundizar mucho en esta manera porque hemos tenido problemas al monitorizar lo que hace el programa con las posiciones recibidas. La información que nos aparece en pantalla en incoherente y no es la que esperamos desde luego. Aún no conocemos las razones.

Trataremos ahora de encontrar la mejor solución y mejorarla en la medida de lo posible.
De momento este vídeo en el que se demuestra que la hormiga llega, que no es poco.

Making of...

Aquí van algunas fotos del laborioso trabajo de montaje del receptor de infrarrojos y la circuitería asociada en la hormiga. Con mucha maña y alguna que otra chapucilla...



martes, 6 de mayo de 2008

Integración del receptor en la hormiga.

Para integrar el receptor en la hormiga, hemos metido la placa en el interior de la hormiga como podemos ver en la siguiente imagen:


Además, el receptor (BPW41) más el tubo los hemos integrado en una placa de tiras muy pequeña y mediante unos cables llevamos las bornas del receptor a la placa y lo hemos colocado en el extremo del brazo. Lo podemos ver en la siguiente fotografía:


Para alimentar la placa del interior de la hormiga, hemos optado por poner una alimentación independiente debido a que si la cogemos de los servos introducen mucho ruido y en la controladora tenemos 8V y nosotros necesitamos 5V y -5V. La masa del circuito es la masa común de la controladora.
Lo hemos probado y tiene una distancia de 1.5m aproximadamente de recepción.


Podemos ver como funciona en el vídeo posterior:






El problema que tenemos actualmente es la poca distancia de recepción y que cuando lleva mucho rato los servos pierden fuerza y se queda parada como "tiritando". Trabajaremos para solucionarlo.
Todos los vídeos que llevamos están disponibles en
http://es.youtube.com/hormigaLsed08

Avances en hardware

Ante la imposibilidad de fijar un comparador de nivel que nos diese un valor de 5V a todas las distancias asi que sustituimos el módulo del comparador de nivel por dos inversores de histéresis seguidos pa no negar la lógica de las señales. Estos inversores de histéresis como ya sabemos si tenemos una señal por debajo de 3.3V o 2.7V(depende de si es TTL o CMOS) la pone a 0V y si está por encima la lleva a 5V.
El problema que teníamos es que el receptor tiene un ángulo de recepción de +/-65º y es demasiado para que la hormiga se oriente correctamente y llegue a su destino. Para ello, hemos integrado un tubo de plástico negro que nos reduce muchísimo el ángulo de recepción haciéndolo muy pequeño.
Podemos ver como funciona con el tubo en el siguiente vídeo:



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.


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.

La hormiga ya anda

Primer día de laboratorio y primera toma de contacto con nuestro principal instrumento: la hormiga. Hormiga por decir algo porque más bien parece una araña o, como se verá más adelante con la incorporación de un brazo robótico, un escorpión.

Hemos centrado el trabajo en familiarizarnos con el entorno de trabajo: fuentes de alimentación, coldfire, entorno de desarrollo... Nuestro primeros problemas aparecen en lo respecticvo a la alimentación. La hormiga que nos han proporcionado en el departamento está configurara para que la alimentación de las controladoras de servos y de los propios servos sea común. Esto plantea un problema ya que los servos consumen bastante potencia y deja a las controladoras sin apenas alimentación para su correcto funcionamiento. Esto se nota en que al "encender" la araña, los LEDs que indican la alimentación de las controladoras parpadean y éstas se resetean continuamente.
Decidimos pues, alimentar controladora y servos de forma independiente. De este modo la araña ya tiene suficiente fuerza para mover sus aparatosas patas. El programa que controla el movimiento de nuestra araña nos es facilitado gracias a que Felix Mencías y Alberto Hijosa desarrollaron en su día un completo tutorial al respecto. Cargamos pues el programa en el Coldfire y observamos que nuestra hormiga no camina como debería, sino que se tuerce. Este problema ya nos lo esperábamos ya que el programa que estos dos becarios desarrollaron estaba orientado a una versión anterior de la hormiga. Luego el fabricante decidió evolucionar la hormiga a araña e introducir un cambio fundamental respecto a la versión anterior. Esta modificación afecta a los servos dedicados al movimiento vertical de las patas derechas. Éstos están colocados a la inversa que en su predecesora, por lo que hubo que alterar el código para invertir estos movimientos.

Su trabajó costó localizar qué servos en concreto había que modificar pero finalmente se logró el objetivo del día. La araña ya es capaz de caminar y girar en todos los sentidos.