sábado, 22 de enero de 2011

Watson, el superordenador de IBM más listo del mundo gana los encuentros previos de Jeopardy

He leido en http://sinapsis-aom.blogspot.com/2011/01/watson-el-superordenador-de-ibm-mas.html  el artículo que título a esta entrada y la verdad que es deprimente si albergamos la esperanza de ver algún día una inteligencia artificial, el sistema creado por IBM no reconoce ni el lenguaje hablado y el ordenador es una auténtica bestia:


  • 10 racks servidores POWER7 750
  • ejecutando el sistema operativo Linux
  • con 15 terabytes de RAM y 2,880 nucleos (cores) de procesador
  • hasta 80 teraflops (80.000.000.000.000 operaciones por segundo)
¿Que podemos hacer nosotros con un sistema móvil como el que estamos construyendo?, aunque el nuestro tiene un enlace WIFI de alta velocidad que nos permite que el tratamiento de la información que recogen los sensores sean tratados en el PC (o una red de PC's si el programa podemos hacerlos distribuido). 
No se que actitud tomar, si deprimirme o pensar que pueda existir algún paradigma sobre la inteligencia y la programación que permita simplificar los programas y ejecutarlos en una máquina menos potente. 
Alan Turing en su artículo Maquinaria, computadora e inteligencia ("Mind" vol. LIX n. 236, 1950) donde se pregunta s¿pueden pensar las máquinas?, hace una estimación de  que capacidad de almacenamiento deberá tener un ordenador para jugar el juego de la imitación, este juego consiste en la interacción a través de un terminal entre dos humanos o entre un humano y un ordenador, si el humano no es capaz de distinguir si está hablando con un humano o con un ordenador se puede suponer que el ordenador es capaz de pensar, este es el famoso test de Turing.

 Pues bien el Sr Turing estimaba que con una capacidad de memoria de 10^7 bits y sin necesidad de aumentar la velocidad del procesador y los programas adecuados se podría superar la prueba. 10^7 bits son aproximadamente 10^6 bytes = 1 MByte, ¡Solamente 1 MByte de memoria!, aunque Alan Turing  se equivocara en un factor de 1000 tendríamos un capacidad de 1 GByte, hay que aclarar que esta capacidad se refiere a la que ocuparía el programa, si turing estuviera en lo cierto deberíamos ser capaces de tener un sistema inteligente en cualquier PC  que se vende actualmente, el ordenador de IBM tiene 15 Terabytes de RAM = 15.000 GBytes = 15.000.000 MBytes es decir 15 millones de veces la estimación original de Turing.

   Me gustaría pensar que Alan Turing tenía razón aunque se equivocara en varios ordenes de magnitud y podamos implementar algunos algoritmos "inteligentes" en el robot sin necesidad de semejante bestia.

   Recomiendo a los interesados la lectura del artículo de sinapsis.

La placa de sensores

Aunque el sonar, la cámara, la brújula ..., son sensores, esta placa que hemos llamado de sensores nos permite conectar bumpers, sensores de infrarrojos IR, y todo tipo de sensor cuyo funcionamiento sea del tipo ON/OFF - CONECTADO/DESCONECTADO. La placa de la fotografía permite conectar hasta seis de estos sensores, el número está limitado por el IC 4010 que dispone de 6 inversores triger-smith.


   Como puede verse en la imagen los conectores proporcionan alimentación a los sensores que lo necesiten, como pueden ser los IR. Los dos conectores ocupados son los CNY70 del sigue-linea.

   Esta placa es de las primeras que hicimos, se ve que esta hecha a una cara y hemos necesitado 3 puentes para completarla.




   Actualmente hemos terminado el diseño de una nueva que nos permitirá conectar hasta 12 sensores ya que tiene 2 chip 4010. Simplemente hemos duplicado el circuito, situando 8 sensores en un conector y 4 en otro.

Podemos rodear ahora el robot con bumpers que detecten cuando ha chocado con algo y añadir sensores IR de proximidad 20-30 cm para distancias cortas y probablemente nos sobren entradas que se reservarán para futuras ampliaciones.

Este diseño lo enviaremos a custompcb, y en cuento lo recibamos pondré una imagen de la nueva placa.

lunes, 10 de enero de 2011

Cables y conectores.

   El problema: En un sistema como un robot donde disponemos de una variedad grande de sensores y actuadores todos conectados a la fuente de potencia y a la CPU, podemos encontrarnos fácilmente con 7-8 placas diferentes, lo que significa que tendremos 7-8 conexiones a la CPU y las mismas a la fuente de potencia. Si estos cables fueran específicos para cada una de las placas tendríamos muchos tipos de cables, habría que construir cada uno a medida y la posibilidad de equivocarnos de cable sería muy grande, además, en caso de fallo de un cable tendríamos que construirlo específicamente con la consiguiente pedida de tiempo y parada del robot.
Los cables deben ser iguales y tener una posición de conexión única para evitar conexiones erróneas y averías, esto es especialmente importante con los conectores de alimentación.

   En nuestro robot, todos las conexiones a la CPU de las placas de sensores o actuares son los mismos, es la placa del sensor/actuador la que se adapta al conector y no al contrario. Esto facilita la construcción de los cables y en caso de sospechar que un cable no está en bien lo cambiamos rápidamente y fácilmente por otro.


   Los cables que conectan la fuente de potencia con las placas también son todos iguales y evitan equivocaciones de cambio de polaridad que provocan cortocircuitos y la consiguiente avería y si aplicamos la ley de Murphy el componente que se estropea es el más caro de todos los que están conectados, "ya nos ha pasado".



   Tenemos tres excepciones en nuestro robot, el cable de alimentación de los motores (12V), debido a la potencia que pueden llegar a consumir hemos construido un cable específico con un conector de potencia diferente al resto, y el router-wifi que necesitamos un cable que en un extremo tenga una banana de alimentación y por lo tanto el cable debe ser diferente por necesidad.

  Y los cables ethernet que conectan la CPU XMOS  y la camara ip con el router wifi.
   En las placas de los sensores/actuadores solamente se conectan los bits que se van a usar, el resto se deja sin conectar.

martes, 4 de enero de 2011

Control de Potencia

     En esta entrada hablaré del control de potencia ("Motores y servos"), hemos diseñado una placa que nos proporciona la capacidad de controlar hasta 4 motores de corriente continua y 2 servos, además hemos instalado un chip ULM20003 que nos permite 7 salidas de alta corriente hasta 500 mA, se puede sustituir este chip por otros equivalente que suministran más corriente aún, con el podemos controlar por ejemplo: servos (hasta 7) u otros dispositivos.

En la imagen podemos ver la placa:



    He cometido un error al editar la foto, se dice que son (8) driver de corriente cuando en realidad son 7.

    Los chips utilizados para controlar los motores son el L293B que permiten un consumo de hasta 1 A y tienen integrados los diodos de protección contra las corrientes inducidas que producen los motores de cc.

    Los motores se pueden alimentar a 12V y 6V para ello dispone de dos jumper sobre la placa (rojo y azul).

   Los servos se alimentan a 6V.

   A continuación el esquema:



  Todas estas tensiones son suministradas por la fuente de alimentación que comentamos en la anterior entrada.

  La complejidad de la placa nos ha obligado a hacerla a doble cara, la placa tiene alrededor de 51 agujeros pasantes de la cara superior a la inferior ya que no disponemos de la tecnología para hacer la metalización de los agujeros, hemos llegado a la conclusión que no merece la pena el trabajo de hacerla y lo mejor es encargarla a alguna empresa especializada como custompcb.

  Esta placa no permite la conexión de los encoders de los motores, por lo que hemos rediseñado la placa y hemos incluido estos conectores, además hemos sustituido el chip L293B por el 298 que permite motores de más potencia, además en el nuevo diseño podemos controlar 4 servos y 2 motores de cc. (no vemos la necesidad de más motores). Se ha suprimido también la posibilidad de alimentar los motores con 6V o 12V mediante jumpers, aunque sumistrando 6V en la entrada de 12V conseguimos el mismo efecto.
   Hemos aprovechado la ocasión para compactar el tamaño y hemos suprimido el driver de corriente que lo incluiremos en la placa de sensores y por supuesto hemos encargado la construcción a custompcb.

   En la imagen vemos una placa de motores sin montar, por supuesto es a doble cara y no le cabe un componente más, estamos montado una para verificar que el diseño es correcto:



   En este diseño se han incluido los diodos de protección ya que el L298 no los incorpora, además el conector de los encoders es específico de nuestros motores, esto es una limitación si en alguna ocasión queremos cambiarlos, entonces deberíamos hacer una pequeña placa adaptadora de la salida de los nuevos encoders a estos. Perdemos flexibilidad pero ganamos en integración, simplicidad y espacio.

La placa dispone además de dos conectores con los cuales podemos monitorizar la corriente que se le suministra a los motores (es una característica que tiene el L298) que por el momento no usaremos.


   En la próxima entrada hablaré de los conectores, su normalización y su importancia.

   Actualización(10/01/2011): Ya hemos montado la nueva placa de motores: