Yago, un robotillo libre basado en AVR

— [ edit | raw ] migrated from node/538
Os presento un robotillo que estoy haciendo en mis ratos libres. Se trata de un bicho basado en un micro AVR (en concreto usa un AT90USB1287) y que dispone de varios sensores como infrarojos, sensor PIR, ultrasonidos, etc… Tanto el software como el hardware que desarrolle para este proyecto será libre, y además todo (incluidos los diseños de PCBs) está hecho con software 100% libre.

Mi intención es ir publicando todo lo que vaya haciendo referente a él por aquí, para que a quien le interese pueda meter mano y, ¿por qué no? dar ideas. En cuanto el repo público de ARCO haya sido migrado, haré disponible el código fuente y los esquemas electrónicos.

Introducción

Pues eso. Yago, como he decidido que se llame la criatura (bueno, lo decidieron en consenso unos amigos durante una larga noche) utilizará un microcontrolador de la casa ATMEL. El micro elegido es un AT90USB1287. En principio iba a haber utilizado uno de sus hermanos mayores y mas antiguo, pero un amigo al que le estoy haciendo un proyecto basado en éste micro, me regaló una pequeña placa de desarrollo y decidí utilizarla (¡¡gracias Pandro!! ;-)). Bueno, pues toda la información que querais del micro, la podeis consultar del datasheet del micro. La plaquita de desarrollo en la que me estoy basando se llama USBKEY y se puede conseguir a través de digikey.

¿Qué va a tener?

Bueno, pues en principio y como es de suponer, el cacharro en sí puede tener lo que nos dé la gana que tenga. Yo en mi caso he comprado un par de sensores de infrarrojos, un detector de sonido, un medidor de distancias ultrasónico, un sensor PIR, un par de bumpers delanteros, un servo para posicionar los ultrasonidos…. Vamos, que lo que queramos.

La estructura es metálica, la he hecho con un juego de esos copias de mecano que me costó 9€ en una juguetería. Imaginación al poder (y lo digo yo que se me da fatal la mecánica ;-)). Para el tema de la tracción, después de haber probado con motorreductoras, he decido usar unos motores FUTABA S3003 trucados. Tranquilos que ya os diré donde compré cada cosa y las manipulaciones que hice.

Con respecto a la electrónica, aparte del AT90USBKEY, en cuyo datasheet se puede ver el esquema electrónico, utilizo otra tarjeta como extensión de periféricos que diseñé enteramente con software libre. Ésta tarjeta dispone de 16 entradas TTL, 12 salidas TTL y 4 de potencia, una memoria I2C y un reloj calendario en tiempo real. ¿Qué por qué poner estas dos cosas si pueden parecer tonterias para un microbot? muy fácil, porque quise, mas para trastear :-P

Bueno, pues de momento, para ir abriendo boca, ya os he contado un poco cuales son mis intenciones. Espero que os gusten y que alguno se anime aunque sea a ir leyendo lo que hago. Por lo pronto, os dejo alguna que otra fotillo para que lo vayais viendo….

Una vista del lateral trasero…

Y un primer plano del sensor PIR trasero y los infrarrojos…

Software libre, copyleft y canon digital

— [ edit | raw ] migrated from node/536

A través del blog de David Bravo he sabido de un artítulo de El País, que describe de un modo bastante acertado cómo es el mundo en la ‘era de Internet’ (al menos eso me parece a mi).

Reconfigurando el XPORT "al vuelo"

— [ edit | raw ] migrated from node/537
Siguiendo mis experimentos con el XPORT de Lantronix he descubierto cómo obtener la configuración de este dispositivo, modificarla y aplicársela después. Aquí comento un poco los resultados obtenidos.

INTRODUCCIÓN

En una entrada anterior de mi blog referente al XPORT, comenté un poco ciertas características de este dispositivo y como configurarlo para realizar conexiones activas y pasivas por TCP y envío y recepción de datagramas UDP además de como entrar en su Modo monitor. Esto último permite hacer ciertas operaciones de diagnóstico, como ya comenté en su momento. Aquí las que nos interesan son la obtención de la configuración para su posterior modificación y reconfiguración de la unidad.

OBTENCIÓN DE LA CONFIGURACIÓN

Bueno, para obtener la configuración de la unidad lo primero que tenemos que hacer es entrar en Modo Monitor. Una vez que hemos entrado en dicho modo, pedimos la configuración al dispositivo a través del comando GC:
Welcome to minicom 2.2

OPCIONES: I18n
Compilado en Jan  7 2007, 18:00:43.
Port /dev/ttyUSB0

                 Presione CTRL-A Z para obtener ayuda sobre teclas especiales

AT S7=45 S0=0 L1 V1 X4 &c1 E1 Q0
OK
*** NodeSet 2.0 ***
0>GC
:20000010000005000000002D00000000000000004C0200001127204EC0A8000AD600000062
:20002010000080000000000000000000000000000000000000000000000000000000000030
:200040104C0200001227000000000000C00000000000000000000000000000000000000049
:1800601000000000000000000000000000000000000000000000000078
:00000001FF
0>

Con esto tenemos la configuración actual del XPORT. Lo que nos ha devuelto es un archivo en formato INTEL HEX. Bueno, para el caso de las conexiones TCP, la dirección de las conexiones activas se encuentra a partir de la dirección 0x18: en nuestro caso podemos ver que la información aquí guardada es C0A8000A. Esto se corresponde con la IP 192.168.0.10. Para el caso del puerto remoto, la información referente se encuentra a partir de la dirección 0x16. Observamos que es 204E, que corresponde con el puerto 20000 usando little endian. Bueno, para cambiar la IP y el puerto tan solo tenemos que modificar la información en estas direcciones (sin olvidar actualizar el último byte de la línea correspondiente al Checksum), enviar el nuevo archivo al xport y reiniciar.

RECONFIGURACIÓN DE LA UNIDAD

Bueno, pues vamos a reconfigurar "al vuelo" el XPORT para asignarle la dirección <192.168.0.20:20150>. Para ello cogemos el arhivo anterior y sustuimos la primera línea por la siguiente:
:20000010000005000000002D00000000000000004C0200001127B64EC0A80014D6000000C2
Después volvemos al modo monitor y con el comando SC enviamos el archivo enterito:

Welcome to minicom 2.2

OPCIONES: I18n
Compilado en Jan  7 2007, 18:00:43.
Port /dev/ttyUSB0

                 Presione CTRL-A Z para obtener ayuda sobre teclas especiales

AT S7=45 S0=0 L1 V1 X4 &c1 E1 Q0
OK
*** NodeSet 2.0 ***
0>GC
:20000010000005000000002D00000000000000004C0200001127B64EA1432614D600000020
:20002010000080000000000000000000000000000000000000000000000000000000000030
:200040104C0200001227000000000000C00000000000000000000000000000000000000049
:1800601000000000000000000000000000000000000000000000000078
:00000001FF
0>SC
0>RS
NO CARRIER
Una vez que se invoca al comando SC se queda en espera de recibir el archivo de configuración. Cuando se le envía (En la captura mostrada no ha habido eco), responde con 0> para indicar que ha sido guardado correctamente. Para finalizar se reinicia la unidad con el comando RS. El XPORT tarda unos 10 segundos en reiniciar y acto seguido informa de que está disponible con el mensaje NO CARRIER. Si volvemos a leer la configuración del XPORT:
0>RS
NO CARRIER
*** NodeSet 2.0 ***
0>GC
:20000010000005000000002D00000000000000004C0200001127B64EA1432614D600000020
:20002010000080000000000000000000000000000000000000000000000000000000000030
:200040104C0200001227000000000000C00000000000000000000000000000000000000049
:1800601000000000000000000000000000000000000000000000000078
:00000001FF
0>
podremos ver los cambios ya aplicados.

Migración de repositorios subversion

— [ edit | raw ] migrated from node/535

Esta receta explica cuales son las herramientas básicas de administración útiles para migración de repositorios

Montar un repositorio estándar de paquetes Debian

— [ edit | raw ] migrated from node/534

Ya vimos como montar un repositorio trivial de paquetes Debian. Ahora vamos a hacer un repositorio general de paquetes, algo más avanzado y general que lo anterior pero se basa en la misma filosofía.

Lantronix XPORT

— [ edit | raw ] migrated from node/532
El XPort de Lantronix es un dispositivo que permite conectar cualquier cacharrito con puerto serie a una ethernet. Permite la creación de conexiones TCP activas y pasivas y el envio y recepción de datagramas UDP. Por aquí iré explicando un poco los resultados de las pruebas que vaya haciendo con él. Hoy de momento, el tema de las conexiones.

Conexiones TCP

Veamos, según el datasheet y el manual de usuario del XPORT, éste permite conexiones entrantes desde cualquier IP a un puerto determinado, denominado Local Port. A su vez, al XPORT se le pueden programar una IP y puerto al que realizar las conexiones por defecto: Remote host y Remote Port. Las opciones para la creacion de conexiones activas (conexiones creadas por el XPORT) son las siguientes:
  • No active startup: No genera conexión activa en ningún caso
  • With any character: Si no existe ninguna conexión activa y se recibe un caracter cualquiera por el puerto serie, el XPORT intenta abrir una conexión con la IP y puerto configurados por defecto y una vez abierta dicha conexión, envia los caracteres que reciba por el puerto serie
  • With DTR active: Igual que el caso anterior, pero si la línea DRT no se encuentra activa, no intenta abrir conexión
  • With a Specific start character: Sólo intenta conectar cuando recibe un caracter específico por el puerto serie. Por defecto, si el usuario no especifica otro, el caracter de inicio de conexión es un retorno de carro
  • Manual connection: Intenta abrir la conexión a una IP y puerto cualquiera que puede ser especificado a través del puerto serie
  • Modem mode: Permite utilizar comandos AT a través del puerto serie para gestionar las conexiones.

Conexiones activas en Modo Manual

La forma básica de indicar al XPORT a qué IP y puerto conectar utilizando el modo manual es enviar a través del puerto serie comandos que empiecen por el caracter "c", por ejemplo
c192.168.0.10/20000
hará que el XPORT intente conectar al puerto 20000 de la máquina 192.168.0.10 Si la opción Connect Response se encuetra en Char Response, en el momento en el que se establezca la conexión el XPORT responderá con el caracter "C" a través del puerto serie. Si no se puede establecer conexión, responderá con una "N". Cuando se cierra una conexión activa, el XPORT responde enviando el caracter "D". Con el comando
c0.0.0.0/0
se entra en el modo monitor. Desde aquí, se pueden hacer varias cosas, como leer la configuración actual del XPORT, su IP, MAC, o cambiar dicha configuración a través del puerto serie.

Conexiones activas en modo Modem

El XPORT tiene varias opciones distintas a la hora de emular un DCE tipo módem y pueden elegirse a través de la opción Modem mode. Éstas opciones son las que siguen:
  • Without echo: El módem no enviará respuesta alguna a los comandos que se le envien.
  • Data Echo & Modem Response: Aquí el módem envía a través del puerto serie tanto un eco del comando recibido como la respuesta generada por dicho comando. A su vez, esta opción tiene dos subtipos:
    • Full Verbose: Las respuestas se dan en forma de cadena ASCII.
    • Numeric Response: Las respuestas se dan en forma de código numérico.
  • Modem Response only: Es exactamente igual que la opción anterior, con la diferencia de que sólo se envía la respuesta de los comandos ejecutados sin eco alguno de los comandos.

Comandos AT mas importantes

Los comandos que mas importancia pueden tener para la gestión de la conexión son los siguientes:
  • ATDTx.x.x.x,pppp: Se utiliza para abrir una conexión TCP a la dirección <x.x.x.x:pppp>.
  • ATH: Cierra la conexión activa en ese instante.
  • +++: Es la secuencia de escape por defecto. Si durante una conexión se envía dicha secuencia y se espera 1 segundo sin enviar mas datos (siempre hablando desde el DTE al DCE), los siguientes caracteres que se envíen precedidos de un retorno de carro se entenderán como un comando AT.
. La mejor manera de ver todo ésto es con un ejemplo:
Welcome to minicom 2.2

OPCIONES: I18n
Compilado en Jan  7 2007, 18:00:43.
Port /dev/ttyUSB0

                 Presione CTRL-A Z para obtener ayuda sobre teclas especiales

AT S7=45 S0=0 L1 V1 X4 &c1 E1 Q0
OK
ATDT192.168.0.1,20001
NO CARRIER
ATDT192.168.0.1,20000
CONNECT

OK
ATH
OK
RING 192.168.0.10
CONNECT
hola

NO CARRIER
En éste ejemplo, el primer OK después de la inicialización realizada por minicom indica que el XPORT está funcionando y listo para recibir comandos AT. Seguidamente intentamos crear una conexión a la dirección <192.168.0.1:20001>, pero el XPORT nos responde con "NO CARRIER" debido a que no hay nadie escuchando en esa dirección. Lo volvemos a intentar otra vez, en esta ocasión en la dirección <192.168.0.1:20000>. Ahora si ha habido suerte, por lo que el XPORT nos responde con "CONNECT". A continuación se ve una línea en blanco y seguidamente una confirmación ("OK"). Esto ha sido porque hemos introducido la secuencia de escape "+++". El minicom estaba configurado si echo, por eso no se puede ver, pero el XPORT, transcurrido un segundo, devolvió "OK" indicando que ha recibido e interpretado la secuencia de escape y se encuentra preparado para recibir un comando AT. El comando que enviamos es "ATH", con lo que cerramos la conexión. Podemos ver que nos responde con un "OK" indicando que el comando ha sido procesado y por lo tanto la conexión se encuentra ya cerrada. Finalmente, somos nosotros los que conectamos remotamente con el XPORT, desde la IP 192.168.0.10. Se puede observar que el XPORT informa de ello con la cadena "RING 192.168.0.10". Una vez que se ha establecido la conexión, envía "CONNECT" para indicarlo. Finalmente, al cerrar la conexión remotamente, el XPORT devuelve "NO CARRIER", con lo que sabemos que la conexión se ha cerrado.

Datagramas UDP

En lo referente a Datagramas UDP la cosa cambia bastante, ya que no se tiene tanta libertad para elegir dirección destino como con TCP. Básicamente, podemos recibir datagramas UDP desde cualquier sitio sin ningún tipo de problemas (obvio), pero a la hora de enviar datagramas UDP, éstos solo pueden enviarse a la dirección configurada dentro del XPORT o a una lista de direcciones también configurada dentro del propio XPORT. De cualquier modo, aún tengo que realizar mas pruebas a éste respecto....

Nota

Es importante remarcar que los comandos introducidos en el XPORT acaban todos con el caracter 0x0d (CR) al igual que las respuestas que envía el XPORT. La única excepción que he encontrado, se produce cuando se hacen conexiones activas: La respuesta tan solo es un caracter ASCII (el "1" de conexión efectuada o el "3" de error en la conexión). Todo esto lo digo refiriéndome al modo "Numeric Response only"

Creación de Plugins para Freevo

— [ edit | raw ] migrated from node/533

En esta recetilla cuento los pasos que he seguido para crear un pequeño plugin para Freevo, con el que poder lanzar el juego Stepmania. Como tengo la intención de incorporar más juegos al menú de Freevo, he intentado no hacer el plugin demasiado específico.

Soporte para AT90USB1287 y otros AVR nuevos con GCC

— [ edit | raw ] migrated from node/530
Cómo compilar e instalar GCC para tener soporte para el AT90USB1287 y algunos micros AVR nuevos

Introducción

Algunos micros muy nuevos de ATMEL, como pueden ser el AT90USB1287, muy parecido en prestaciones al ATMEGA128 pero con soporte para USB parece ser que no están soportados en la toolchain para ésta familia de micros. Ésta receta explica como compilar dicha toolchain para poder usar éste micro y algunos mas en nuestros proyectos.

Qué necesitamos

Para compilar necesitaremos lo siguiente: El código fuente de GCC lo podemos descargar del repositorio subversion. Para ello:
javieralso@Gezel:~/avr-toolchain/gcc$ svn co svn://gcc.gnu.org/svn/gcc/trunk source
Con esto tendremos los fuentes de GCC dentro del directorio gcc/source. Una vez que hemos descargado y descomprimido todo el código que necesitamos, procedemos a la compilación e instalación.

Compilando e instalando

La compilación e instalación de la toolchain debe de hacerse en un orden concreto, ya que unas herramientas necesitan a otras para poder compilarse. En concreto, el orden de instalación es el que se describe a continuación.

Compilación e instalación de binutils-avr

Lo primero que necesitamos es binutils-avr. Para compilarlo entramos en el directorio en el que descomprimimos los fuentes y procedemos:
javieralso@Gezel:~/avr-toolchain/binutils-2.17$ ./configure --target=avr
Después, de que todo haya ido bien y se hayan creado los makefiles, compilamos:
javieralso@Gezel:~/avr-toolchain/binutils-2.17$ make
Y para terminar, instalamos:
javieralso@Gezel:~/avr-toolchain/binutils-2.17$ sudo make install

Compilación e instalación de avr-gcc

Ahora viene lo mas largo y pesado, y lo que mas probabilidades tiene de fallar, compilar gcc para dar soporte a los micros avr. Dentro del directorio en el que tenemos el subdirectorio con los fuentes (gcc en nuestro caso), creamos otro subdirectorio, por ejemplo build. Éste subdirectorio lo necesitaremos porque no podemos compilar gcc en el mismo directorio en el que están los fuentes. Una vez que tengamos el subdirectorio, entramos en él y ejecutamos el script de configuración ubicado en el directorio de los fuentes desde él:
javieralso@Gezel:~/avr-toolchain/gcc$ mkdir build
javieralso@Gezel:~/avr-toolchain/gcc$ cd build
javieralso@Gezel:~/avr-toolchain/gcc/build$ ../source/configure --target=avr --enable-languages=c --disable-libssp
y si todo ha ido bien, ya se puede compilar:
javieralso@Gezel:~/avr-toolchain/gcc/build$ make
Una vez que ha acabado la compilación y todo ha ido bien, ya solo queda la instalación:
javieralso@Gezel:~/avr-toolchain/gcc/build$ sudo make install

Compilación e instalación de avr-libc

El útimo paso que queda por dar es compilar e instalar las librerías cruzadas. Se hace lo mismo que en los casos anteriores:
javieralso@Gezel:~/avr-toolchain/avr-libc-1.4.5$ ./configure --build=`./config.guess` --host=avr --target=avr
a continuación se compila
javieralso@Gezel:~/avr-toolchain/avr-libc-1.4.5$ make
y finalmente se instala
javieralso@Gezel:~/avr-toolchain/avr-libc-1.4.5$ sudo make install
y a partir de éste momento ya tendremos la toolchain lista para utilizar. Ale, a disfrutarla ;-)

Sacando el jugo a las tarjetas Atheros (madwifi)

— [ edit | raw ] migrated from node/531
Si alguno es un afortunado poseedor de una tarjeta wifi con chipset Atheros (que es el que viene usando Cisco) debéis saber que todo un mundo de diversión inalámbrica está a vuestro alcance ;-)

GNU Emacs: Elegir el encoding

— [ edit | raw ] migrated from node/529

Cómo configurar el encoding de un fichero en emacs.