lunes, 31 de enero de 2011

Quadrotors

Hay un grupo de trabajo en la universidad de Pensilvania que trabaja en la programación de robots, es el  GRASP Lab. Aquí van algunos de sus logros en video:





domingo, 30 de enero de 2011

Arduino documental

En su día ya me hice eco del proyecto sobre un documental de Arduino. Pues bien, finalmente el documental dió a luz hará unas semanas.
Aquí está:

Arduino The Documentary (2010) Spanish HD from gnd on Vimeo.

Hasta pronto.

sábado, 29 de enero de 2011

Steve Jobs

Estas últimas semanas se ha hecho pública los problemas graves de salud de Steven Jobs, que le han obligado a dejar Apple.
Nunca es un mal momento para escuchar su discurso en Stanford:

Hasta pronto.

viernes, 28 de enero de 2011

IBM centenario

Uno de los mejores videos que he visto últimamente. A raíz del centenario de IMB, se ha hecho este documental. Es una serie de testimonios sobre la historia de IBM por algunos notables empleados:

La música es de Philip Glass.
Hasta pronto.

jueves, 27 de enero de 2011

Photoduino

Ya vimos en un anterior post aplicaciones de hardware libre para el mundo de la fotografía. Pues bien, descubrí hace unos días el proyecto photoduino. Es un shield de Arduino diseñado para controlar el disparo de la cámara fotográfica a partir de sensores de sonido, de impacto, barrera óptica, barrera laser...
Además tiene un display y unos botones para configurar la funcionalidad. Muy completo y con un vídeo muy didáctico.

A primera vista, parece un trabajo estupendo. 
Hasta pronto.

viernes, 14 de enero de 2011

Arduino Xbee SparkFun shield

Sparkfun ha sacado un shield de Arduino para Xbee que intenta implementar algunas mejoras con respecto al shield oficial de Arduino diseñado y comercializado por Libelium.

Puntos a destacar:
- Hay una gran zona de prototipaje, donde se pueden montar los circuitos de sensores, que serán muestreados por el micro de Arduino y después transmitidos por el módulo Xbee
- Con un switch (no con jumpers como el shield de Libelium) se puede conmutar entre una comunicación con la uart del micro de arduino o dos pines digitales donde se puede implementar una soft-UART. De esta segunda forma, tal como hemos explicado en un anterior post, se puede programar arduino sin necesidad de manipular el shield, y podemos configurar el módulo xbee mediante una terminal en el PC.
- Se añaden doble raster (doble footprint) para cada linea del conector de Arduino, permitiendo poder acceder a todas las señales.
- Se protege con un diodo la señal DIN del módulo. Recuerdo que las señales de control de Arduino van a 5V y el módulo está alimentado a 3.3V.
- Hay LEDs de estado del modulo Xbee para DOUT, DIN, RSSI, ASSOC, Power.
- Hay varios ejemplos de aplicaciones para programar remotamente un arduino a través de Xbee. Todas esas aplicaciones, entre las que se encuentra una de sparkfun, utilizan una comunicación directa del módulo Xbee con el PC. Utilizan la señal de RTS para resetear el equipo remoto. Para más detalles, aquí y aquí. Este shield incorpora el circuito que la aplicación de spark fun presenta, dejando la posibilidad de conectar en serie la señal DIO3 con un condensador y la señal de Reset del micro, con la intención de activar el reset de Arduino en caso de haber un flanco en DIO3.

Todos los componentes son SMD, cosa que abarata la producción. De hecho para evitarse cualquier proceso de soldadura que no sea SMD, no montan los conectores al Arduino, ya que eso les obligaría a montar un componente through-hole y encarecería el producto unos céntimos...

El diseño es presentado con licencia CC BY-SA 3.0

Hasta pronto.

miércoles, 12 de enero de 2011

Arduino Xbee SoftwareSerial

Tal como comenté en un anterior post, el shield Xbee de Libelium tiene el problema de no poder trazar la comunicación que estamos haciendo con el módulo xbee a través del puerto USB y por tanto, a un terminal del PC.

Una posible solución para ello es implementar una soft-UART con dos pines del micro. De forma que la UART del micro esté enteramente dedicada a la comunicación con el PC, y la soft-UART sea la que se comunique con el módulo xbee.

El objetivo de este post es explicar cómo se implementa esto.

Para empezar, necesitamos descargarnos la última versión de la librería de SoftwareSerial. Es la librería con la que implementaremos la UART soft en el micro de Arduino. La podeís encontrar aquí. Tenéis que instalaros esta librería en el directorio de librerías del IDE de Arduino, borrando (haciendo un backup previamente) el directorio Softwareserial que encontréis.

Para probarlo necesitamos:
- Arduino + Xbee shield Libelium, lo llamo Emisor
- Arduino + Xbee shield Libelium, lo llamo Receptor
Grabamos el Emisor con una aplicación sencilla que se limite a enviar por la UART al modulo xbee, dos caracteres H y L con una pausa de 1 segundo entre envíos.
 void setup()


{
Serial.begin(9600);
}
void loop()
{
Serial.print('H');
delay(1000);
Serial.print('L');
delay(1000);
}
En el Receptor, antes de nada vamos a hacer un cambio en el hardware. Queremos comunicarnos a través de dos pines configurados del micro como puerto serie (en el ejemplo serán los pines DIO2 y DIO3 de Arduino) con el modulo xbee, de forma que la uart del micro sea sólo de comunicación con el USB.


Adecuando el programa de arduino para ello, podremos ver lo que el micro recibe de xbee y lo que le enviamos al xbee, y también podremos programar el micro, sin necesidad de quitar y poner jumpers (cosa que es un poco engorroso).

Vamos a puentear las señales de comunicación serie de la uart del micro de arduino con la uart del módulo xbee. Quitamos, por supuesto, los jumpers, y puenteamos DIO2 con DIN del xbee (cable rojo foto), y DIO3 con DOUT de Xbee (cable negro foto). La siguiente mediocre foto ilustra el cambio:



El Receptor lo grabamos con una aplicación que implemente la uart soft, la implementación software de una uart en los pines 2 y 3.

//libreria softwareSerial.h se puede encontrar en: http://arduiniana.org/2011/01/newsoftserial-11-beta/
#include < SoftwareSerial.h >

SoftwareSerial XbeeSerial(3, 2);

const int ledPin = 13; // pin del LED

int incomingByte; // variable para los datos serie de entrada

void setup() {
          Serial.begin(9600); //conexion al PC
          Serial.println("Xbee Software Serial Test!");
          XbeeSerial.begin(9600); //conexion al Xbee shield
          // inicializa pin LED como salida
         pinMode(ledPin, OUTPUT);
         }

void loop()
{
         if (XbeeSerial.available()) {
         // leer el byte más antiguo del buffer serie
         incomingByte = XbeeSerial.read();
         // Si es H (ASCII 72), enciende el LED:
         if (incomingByte == 'H') {
               digitalWrite(ledPin, HIGH);
         }
         if (incomingByte == 'L') {
              digitalWrite(ledPin, LOW);
         }
        Serial.print((char)incomingByte); //envia dato de Xbee a PC
        }
        if (Serial.available()) {
             XbeeSerial.print((char)Serial.read()); //envia dato de PC a Xbee
        }
}



Si abrís un terminal en el equipo Receptor deberiáis ver como Arduino traza el mensaje enviado por el Emisor y cambia el estado del LED según el mensaje recibido.

Hasta pronto.

domingo, 9 de enero de 2011

Arduino Xbee Libelium shield

La implementación de comunicación radio con Arduino más común, y seguramente la más sencilla de implementar, se hace con módulos Xbee de la empresa Digi International.
Estos módulos permiten establecer muy fácilmente una comunicación serie wireless. Es muy sencillo de configurar a través de comandos AP, y también hay una aplicación gratuita de configuración en la web, X-CTU.

El "shield oficial" de Arduino lo diseñó una empresa aragonesa llamada Libelium, dedicada, entre otras cosas, al diseño y comercialización de módulos de comunicación wireless con diferentes tecnologías.
Algunos puntos sobre el shield Xbee de Libelium:

Se comunica con el micro de Arduino a través de las mismas lineas de la UART del micro. A través de unos jumpers se puede configurar el shield para:
  • comunicar el módulo xbee con el micro de Arduino, en la serigrafía la posición está marcada como XBEE
  • comunicar el módulo xbee con el USB hacia el PC. Para ello hay que extraer físicamente el micro del Arduino. La posición de los jumpers está marcada en serigrafría como USB.
Quizás este sea el gran "inconveniente" de este shield, la imposibilidad de establecer una comunicación USB-micro-xbee a través de un terminal. Para poder grabar Arduino con el shield puesto, es necesario extraer los jumpers, de forma que el módulo xbee no interrumpa la comunicación serie del PC al micro de Arduino.
En un siguiente post explicaré una de las posibles opciones para solventar esto.

El módulo Xbee se alimenta a 3.3V, las señales de comunicación vienen a 5V, para adaptar la señal serie de entrada (DIN) se pone un divisor de tensión.

En los zócalos de conexión de los módulos Xbee, se pueden montar los módulo xbee (serie 1) y xbee-pro (serie 2). Las diferencias entre los dos módulos podeís consultarlas aquí.

La tensión de alimentación la coge de los 5V que vienen de Arduino. Es un regulador lineal MC33269D-3.3. El consumo del módulo xbee (serie 1) es bajo, alrededor de 50mA. Tenemos un consumo mucho más alto con el módulo xbee-pro, hasta 215 mA.

El conector ICSP, que es conector que se utiliza en Arduino para hacer la programación de su bootloader, está conectado al shield, pero no sería necesario. Se utiliza para llevar la alimentación (5V) y el reset. Estas señales se podrían haber llevado a través de los conectores laterales. Sospecho que se montó ese conector (incrementado por tanto el coste del producto) por una cuestión de fijación mecánica, le da rigidez a la conexión del Arduino y shield.

El pulsador de reset sólo resetea el micro de Arduino, no es el reset del modulo Xbee.

Los componentes tiene doble footprint, SMD y through-hole. Esto puede crear cierta confusión a primera vista del esquemático, donde no están indicados los componentes que no se montan.


La señal del módulo xbee /CTS - DIO7 se lleva a través de un transistor a la señal de reset del micro de Arduino. Supongo que se hizo así, para permitir poder resetear remotamente un Arduino, hacer correr por tanto su bootloader  y pasarle a través del módulo Xbee una nueva aplicación. Es decir, programar por wireless el Arduino. Curiosamente, no he visto ningún ejemplo, en ningún foro, que implemente esta funcionalidad. Sí que he visto ejemplos con otros shields de xbee, pero ninguno con el shield de Libelium. Si alguien ha implementado o conoce algun ejemplo para realizar la programación remota de un Arduino con el shield de Libelium, por favor, que me lo haga llegar.


Hasta pronto.

sábado, 1 de enero de 2011

Arduino Ethernet shield y TelnetClient

Como primera aplicación con el shield "oficial" de Arduino, voy a comentar uno de los ejemplos básico que el IDE de programación de Arduino te proporciona, es el sketch TelnetClient.
Con este programa podemos acceder al ordenador donde esté alojado el servidor Telnet, crear y modificar sus ficheros. Estoy convencido que se os ocurrirá alguna aplicación en la que esto os resulte útil.
Sin más demora, voy a describir, paso a paso, lo que hay que hacer para probarlo con el sistema operativo Windows. 
Básicamente tenemos tres piezas en este juego:
  1. Arduino con el shield de Ethernet
  2. PC al que conectamos el puerto USB de Arduino. Lo llamo PCArduino
  3. PC donde corre el servidor telnet. Lo llamo PCTelnet
No se me ocurre ninguna razón por la que PCArduino pueda ser PCTelnet, pero me parece más divertido sin son distintos, a mí me da una mejor idea de la verdadera función de la aplicación, el control remoto de un PC a través de Ethernet.

Configuración de Arduino
Una vez hayamos conectado el shield Ethernet en Arduino, el puerto USB al PCArduino y arrancado el IDE de programación, debemos seleccionar el sketch TelnetClient:

Tomamos nota del COM al que se conecta Arduino, después necesitaremos esa información para abrir una sesión con hypeterminal.


Modificación sketch
Este sketch consta de tres partes, una primera de inicialización de variables globales, una función de setup, y por último, una función de loop.
  • Variables globales. En este sketch las variables globales son:
    • MAC y la IP que le queremos dar a Arduino. En los últimos shields de Ethernet se indica la MAC en una pegatina. En cuanto a la IP, teniendo en cuenta que nos vamos a comunicar dentro de la intranet de nuestra casa, elegimos una que sepamos que no utilizamos en ninguno de los PCs que tenemos. Yo, por defecto, pongo 192.168.1.177.
    • IP del PCTelnet, en el que corre el servidor Telnet y donde queremos conectarnos a través de Arduino. Para saber la IP de ese ordenador ya sabéis: linea de comando DOS y ejecutamos ipconfig. En mi caso 192.168.1.35
    • Puerto del servidor telnet. Normalmente es el puerto 23.
  • Función de setup.  
    • Inicializa la conexión a Ethernet y el puerto serie a 9600bps.
    • Se ejecuta la conexión al servidor telnet
  • Función loop
    • Traza por el puerto serie todo lo que recibe del servidor y viceversa
    • Detecta si el cliente telnet se mantiene conectado, en caso de no estarlo, saca el mensaje de desconexión.
Así pues, sólo tenemos que modificar el programa con los datos de las variables globales.  En mi caso:
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = { 
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {
  192,168,1,177 };
// Enter the IP address of the server you're connecting to:
byte server[] = {
  192,168,1,35 };
// Initialize the Ethernet client library
// with the IP address and port of the server
// that you want to connect to (port 23 is default for telnet;
// if you're using Processing's ChatServer, use  port 10002):
Client client(server, 23);
Una vez lo hayamos hecho, compilamos el programa y lo bajamos a Arduino.

Servidor Telnet
¿Tenemos disponible un servidor Telnet en el PCTelnet al que queremos conectarnos?. En mi caso no era así, por lo que me bajé el servidor Telnet KpyM. Dudo que sea el mejor, sencillamente fue el primero que encontré.
El servidor  telnet nos exige tener un usuario y un password para Windows. Si no lo tenéis, tendréis que crearlo, ¿cómo?: Panel de control > Cuentas de usuario.
Telnet dejó de utilizarse a través de la red, a nivel profesional, porque es un protocolo muy primitivo, sin ninguna seguridad, los nombres de usuario y los passwords van por la red en caracteres, sin ningún tipo de codificación. Para nuestro propósito está bien, ya que hacemos una conexión punto a punto, pero desde luego, esta conexión a través de Internet no es segura.
No os olvidéis de abrir el puerto 23 en el PCTelnet. Para hacer esto: Propiedades de conexión de área local > Opciones avanzadas > Configuración > Excepciones > Agregar Puerto ... > Nombre: telnet / Numero puerto: 23 / TCP.

KpyM crea una aplicación para configurar el servidor telnet, no es necesario modificar nada, en todo caso, en caso de tener algun problema, echadle un vistazo, ejecutad la opción start service para comprobar que el servidor está efectivamente corriendo.

Sesión hypeterminal
Una vez hemos conectado con el cable de Ethernet el shield con el PCTelnet, abrimos una sesión de hypeterminal del PCArduino con el COM de Arduino, en mi caso COM4, con 9600bps:

Si todo es correcto, al abrir la sesión de hypeterminal, Arduino intenta conectarse con el servidor telnet alojado en el PCTelnet. Las siguientes pantallas son las que obtenemos en el hypeterminal:

Una vez hayamos introducido el usuario y el password para Windows, accederemos al PC remotamente. Podemos controlar el PCTelnet a través de la sesión hypeterminal del PCArduino.


Hasta pronto.