martes, 29 de abril de 2008

Mando de la Wii en Linux

Cierto ser humano se enteró hace poco de que uno de los mandos de la Wii (el conocido como Wiimote) se puede utilizar en el PC como si de un ratón o joystick se tratara, ya que se comunica mediante la norma Bluetooth, estándar a más no poder. Al susodicho ser humano le faltó tiempo para entrar en eBay y adquirir uno de ellos por 46$, que al cambio actual son unos 30€.


Esta mañana lo ha recibido y por la tarde he estado trasteando un poco con él y con mi Linux.

Lo primero que he hecho ha sido comprobar que se veía a través del bluetooth. Después de mirar por Internet he averiguado que presionando a la vez los botones '1' y '2' el cacharrito se vuelve visible durante unos segundos, durante los cuales parpadean los cuatro LEDs azules que tiene en la parte de abajo. Se puede ver con el comando:

$ hcitool scan
Scanning...
     00:1E:35:E3:62:B5        Nintendo RVL-CNT-01

Lo siguiente es hacer "algo" con él. Busco y encuentro la página del proyecto WiiLi, en la que hay mucha información útil. Me descargo CWiid, que es una librería para Linux que permite hacer programas que usen el mando. Hay que compilarla, y como es habitual los pasos a dar son:

./configure
make
sudo make install

El primero lo tengo que ejecutar varias veces y tras cada una de ellas instalar alguna otra librería necesaria para que se pueda compilar esta (por ejemplo, las de bluetooth o las del interfaz gráfico GTK). Cuando están todas, el ./configure termina bien y el resto de pasos se ejecutan correctamente. Las librerias se instalan en /usr/local/lib y los programas de ejemplo en /usr/local/bin. Entre ellos están:

  • wmdemo, que muestra en un menú en modo texto varias opciones que permiten encender y apagar los LEDs del mando, el vibrador, mostrar los botones pulsados, y por supuesto los valores de aceleración en los 3 ejes que hacen tan especial a este mando.
  • Otro programa de prueba es wmgui, que hace lo mismo que el anterior, pero en modo gráfico, mostrando toda la información anterior en una ventana más amigable, y utilizando barras para los datos del acelerómetro.
  • Por último, con wminput podemos utilizar el mando para controlar nuestro PC. Antes de ello hay que cargar un módulo para que funcione algo llamado uinput simplemente ejecutando el comando modprobe uinput, ya que si no aparece un error nada más ejecutar el programita. Después de esto, se puede mover el puntero del ratón moviendo el mando hacia los lados o arriba/abajo, y apretar los botones izquierdo/derecho con los del mando ('A' y 'B'). Cuesta un poco hacerse con el control, pero el resultado es muy curioso.


Todos estos programas nada más lanzarlos lo primero que hacen es mostrar un mensaje en el que indica que hay que mantener apretados los botones 1 y 2 del mando para que lo descubra. Tras unos segundos comienzan a funcionar sin que haya que hacer nada más para que lo detecte.

La última prueba que he hecho ha sido bajarme el Tetriis. Las piezas se mueven con los cursores que tiene el mando, y para rotarlas hay que girarlo tanto como queramos que se mueva la pieza. Es decir, si queremos que gire 90 grados a la izquierda deberemos hacer eso mismo con el mando. Un poco raro de jugar, ya que al sacudir el mando lo que se espera que pase es que se muevan las piezas en lugar de girarse.


En fin, un cacharro curioso. No se me ocurren aplicaciones prácticas salvo usarlo para jugar (que al fin y al cabo es para lo que está pensado) o como mando a distancia, aunque para esto hay otras alternativas más convencionales (y menos geeks claro :-)

lunes, 21 de abril de 2008

Disquetera USB

Por una razón que ahora no viene al caso (bueno, en realidad sí que podría venir pero ya lo contaré otro día) he tenido que generar un disquete de arranque a partir de un fichero imagen. Como mi portátil no trae disquetera, he tomado prestada una del trabajo para poder hacerlo.

En Linux hay muchos y variados comandos para manejar disquetes de 3,5'' pero tienen un problema: Están pensados para unidades fijas (p.e. dispositivo /dev/fd0) y no funcionan bien (o no lo hacen en absoluto) con unidades USB. La razón es la forma en que tiene de trabajar con las unidades de disquete: Como todos los dispositivos, tiene asociado un fichero en el directorio /dev, siendo el que más frecuentemente se usa el famoso /dev/fd0 para referirse a la "unidad A:". Pero además existen otros llamados /dev/fd0H1440, /dev/fdH02880, etc. para especificar que el disquete tiene capacidad de 1,44 o 2,88 MB.

Las disqueteras USB se detectan como dispositivos SCSI (en mi caso /dev/sdb) y las utilidades típicas (como fdformat) necesitan tener acceso a esos otros ficheros con las capacidades posibles del soporte para saber cómo ha de tratarlo al formatearlo.

La única solución que he encontrado ha sido utilizar un programa especialmente preparado para manejar unidades USB, que increiblemente no viene en los repositorios oficiales de las distribuciones habituales. Se llama ufiformat y de su página se pueden descargar tanto los fuentes como binarios y paquetes RPMs.

Una vez instalado su uso es muy simple. Basta con ejecutar:

ufiformat

así sin parámetros, y él solito encontrará la disquetera que tengamos conectada y dará formato al disco según su capacidad máxima. Si somos poco atrevidos con eso de la detección automática podemos especificar el dispositivo si nos quedamos más tranquilos con ello:

ufiformat /dev/sdb

miércoles, 13 de febrero de 2008

Configuración de un NAP bluetooth (II)

Este post es una ampliación de otro anterior en el que se explicaba cómo configurar un punto de acceso bluetooth (NAP) en Linux. Con ello se conseguía una forma básica de conectar una PDA a Internet, pero tiene el inconveniente de que no sirve si se quieren conectar al mismo tiempo varios dispositivos.

A continuación resumiré todos los pasos que hay que seguir para configurar un NAP que permite la conexión de varios dispositivos simultáneamente. Están hechos pensando en Debian/Ubuntu Linux, en otras distribuciones se hará de forma parecida aunque posiblemente algún fichero esté en otro sitio.

1) Instalar utilidades de bluetooth y de ethernet bridging:

$ sudo aptitude install bluez-utils
$ sudo aptitude install bridge-utils


2) Asegurarse de que se detecta el adaptador bluetooth en el ordenador:

$ hcitool dev
Devices:
hci0 00:03:7A:EE:B6:76


3) Editar /etc/bluetooth/hcid.conf y modificar las siguientes líneas para que queden así:

# Default PIN code for incoming connections
# (Aquí ponemos el PIN que queramos).
passkey "1234";

# Default link mode
# none - no specific policy
# accept - always accept incoming connections
# master - become master on incoming connections,
# deny role switch on outgoing connections
lm accept,master;


4) Si no existe ya, crear un interfaz puente Ethernet de nombre pan0, con el siguiente comando:

# brctl addbr pan0

Para asegurarnos de que se ha creado podemos ejecutar:

$ brctl show
bridge name bridge id STP enabled interfaces
pan0 8000.000000000000 no


5) El interfaz pan0 se puede configurar como cualquier otro, en /etc/network/interfaces, por ejemplo así:

auto pan0
iface pan0 inet static
address 192.168.2.1
netmask 255.255.255.0
gateway 192.168.0.1


6) Editar /etc/default/bluetooth y modificar las siguientes líneas para que queden así:

BLUETOOTH_ENABLED = 1
PAND_ENABLED = 1
PAND_OPTIONS=" --listen --role NAP --devup /etc/bluetooth/pan/dev-up"
SDPTOOL_OPTIONS="add NAP"


7) Crear el fichero /etc/bluetooth/pan/dev-up con el siguiente contenido:

#!/bin/sh
ifup pan0
brctl addif pan0 $1
ifconfig $1 0.0.0.0

No olvidarse de darle permisos de ejecución. Este script se invocará cada vez que se conecte al ordenador un dispositivo. Cuando esto sucede se crea automáticamente un interfaz de red llamado bnep0 (o bnep1, bnep2... si se conectan otros después). El script anterior lo que hace es añadir el recien creado interfaz al puente pan0 del que hemos hablado antes y se asegura de que está levantado.

8) En el fichero /etc/init.d/bluetooth buscar la parte donde pone start) y justo después de donde pone start_pan || true añadir una línea como esta:

start_rfcomm || true
start_pan || true
(sleep 5; run_sdptool || true) &
log_end_msg 0

Que lo que hace es esperar 5 segundos antes de lanzar el servidor SDP (el que anuncia los servicios ofrecidos por el bluetooth). El "&" del final lo lanza como tarea de fondo, para que el arranque no se ralentice mientras pasan los cinco segundos.

9) Por último, para que el PC haga de router:

$ sudo echo "1" > /proc/sys/net/ipv4/ip_forward
$ sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE


Se supone que la PDA tiene una dirección IP estática en la misma red que la que se ha configurado para el interfaz pan0. Se podría poner también que fuera dinámica configurando en el PC un servidor DHCP para esa red, que es bastante sencillo.

Si todo funciona como debería cada vez que se conecte un dispositivo bluetooth al PC deberá aparecer un interface de red llamado bnepX. Al hacer un ifconfig veremos que no tiene IP asignada en el PC, pero responderá a un ping si se lo hacemos a la dirección estática que le hubieramos configurado

Cosas que pueden fallar

  • Al intentar conectar desde la PDA al PC no ofrece ningún servicio bluetooth: No se ha configurado bien SDP. Revisar el parámetro SDPTOOL_OPTIONS y que se ha cambiado /etc/init.d/bluetooth como se decía en el apartado 8.
    Se puede añadir el servicio a mano ejecutando sdptool add nap.
    Deberá responder con el mensaje "NAP service registered", de lo contrario significará, que algo está pasando con ese servicio que no funciona bien...

  • El servicio de Network Access Point se ve, pero cuando se intenta conectar falla. Puede ser por muchas cosas. Asegurarse de que:

    • Existe el interface pan0 y tiene configurada una IP: ifconfig pan0
      pan0 Link encap:Ethernet direcciónHW 00:03:7a:ee:b6:76
      inet dirección:192.168.2.1 Difusión:192.168.2.255 Máscara:255.255.255.0
      ARRIBA DIFUSIÓN CORRIENDO MULTICAST MTU:1500 Métrica:1
      RX packets:16 errors:0 dropped:0 overruns:0 frame:0
      TX packets:19 errors:0 dropped:0 overruns:0 carrier:0
      colisiones:0 txqueuelen:0
      RX bytes:796 (796.0 B) TX bytes:2565 (2.5 KB)

    • Está creado el puente ethernet y en él está el interface pan0: brctl show
      bridge name bridge id STP enabled interfaces
      pan0 8000.00037aeeb676 no

    • Está ejecutándose el demonio pand: ps -ef | grep pand

      root 26317 1 0 Jun04 ? 00:00:00 /usr/bin/pand --devup /etc/bluetooth/pan/dev-up --listen --role NAP

      Si no está corriendo podemos lanzarlo a mano desde la línea de comandos con los parámetros de arriba. Si al hacerlo sigue sin lanzarse miraremos el log /var/log/syslog y es probable que encontremos algún mensaje como:

      Bind failed. Address already in use(98)

      Puede ser debido a que haya alguna otra utilidad de bluetooth pululando en el sistema. En alguna ocasión que me ha pasado eso mirando los procesos había dos llamados así:

      root 16844 16839 0 20:52 ? 00:00:00 /usr/lib/bluetooth/bluetoothd-service-input
      root 16845 16839 0 20:52 ? 00:00:00 /usr/lib/bluetooth/bluetoothd-service-network

      Tras matarlos pude lanzar el demonio pand.

    Si falla alguna de estas tres cosas se puede probar a reiniciar el servicio de bluetooth entero (/etc/init.d/bluetooth restart) o a descargar y volver a cargar el driver del dispositivo bluetooth que tengamos (puede variar según el hardware).

miércoles, 30 de enero de 2008

La varita del Photoshop

A raíz de leer por N-ésima vez en un blog cualquiera las razones por las que los usuarios de a pie no se pasan de Windows a Linux, me he acordado de una anécdota de uno de mis usuarios con el Photoshop. Fue una conversación parecida a esta:

- Hola, soy ChicaListaIngeniera. ¿Me puedes instalar el Photoshop en mi ordenador?
- Mmmh, va a ser que no, porque solo tenemos dos licencias y ya están instaladas. ¿Para que lo quieres?
- Es que estoy retocando una foto de un ensayo del laboratorio y en el fotosop hay una herramienta, que es como una varita, que sirve para seleccionar el contorno de lo que sale en la foto.
- Pues podemos hacer dos cosas. O te instalo otro programa que tenga algo parecido a la varita (como el Gimp) y que sea gratis, o si no vas a usarlo mucho y es para esa cosa puntual, te instalo una versión de evaluación de 30 días del Photoshop.
- Ufff, pues ponme el fotosop que como ya se como se hace así mejor.

Así que me bajo de la web de Adobe una versión de evaluación (¡unos 100 Mb!) y se la instalo. Después de eso al cabo de unas semanas volvió a llamar con la misma cantinela, le había caducado el Photoshop. Entre tanto, ya habíamos buscado una alternativa y sin darle opciones le instalamos sí-o-sí el Paint.NET, que está muy bien, es gratuito, y tiene la varita de marras que se llama magic wand.

Y volviendo a lo de por qué los usuarios no se cambian a Linux, dos moralejas de esta historia:
  • Si ya conocen una cosa y se han acostumbrado a ella, es difícil hacerles cambiar, no importa el dinero que cueste (unos 900€) o que solo utilicen el 1% de sus posibilidades.
  • Es difícil hacerles cambiar salvo causa mayor. Y en este caso la causa mayor fui yo (o mi compañero, no recuerdo), que nos negamos en redondo y en cuadrado a volver a instalar una versión de evaluación para que al cabo de otro mes volviera a llamar con la misma historia.

viernes, 25 de enero de 2008

Robot limpiador RoboMaxx

Desde hace un par de meses tengo un robot limpiador llamado RoboMaxx. Funciona de la siguiente manera: Al dejarlo en el suelo de la habitación comienza a moverse siguiendo una trayectoria ligeramente curvilínea y mientras lo hace un cepillo giratorio que tiene debajo barre el suelo por donde va pasando. El polvo que recoge se guarda en un compartimento que tiene próximo al cepillo y que se puede extraer para vaciarlo y lavarlo si hiciera falta.

En la parte delantera tiene una especie de parachoques con un par de "cuernos". Cuando cualquiera de estos choca con algo (un mueble, una pared) el robot da marcha atrás, hace un giro en sentido y ángulo aleatorios y continúa con su tarea. Si la habitación es grande y no encuentra ningún obstáculo en su camino, de vez en cuando hace también el giro y cambia de trayectoria. De esta manera, al final recorrerá la mayor parte de la habitación dejándola libre de polvo y partículas. Hay que decir que a parte del parachoques no tiene ningún otro tipo de sensor, así que habrá que tener cuidado dónde se deja limpiando porque si hay alguna escalera se caerá por ella sin remedio.

En este vídeo lo podéis ver en acción:




El robot sigue funcionando hasta que se le agota la batería o lo apagamos nosotros (no tiene indicador de carga). Su autonomía es de algo menos de dos horas, y después hay que recargarlo durante aproximádamente cuatro. Como curiosidad, las baterías con de plomo-acido, como las de los coches, aunque más pequeñas y de 6 voltios.

¿Y qué tal limpia? Bueno, no hace milagros, solo barre y no entra bien en las esquinas y recovecos pequeños, así que si el suelo se ensucia con algo que no sea polvo o migas de pan (líquidos, cosas pegajosas) o la habitación tiene muchos obstáculos, la limpieza no será perfecta. Aun así, sí que se nota que hay menos suciedad cuando se pasa la escoba tradicional; es un complemento, no un sustituto.

¿Dónde lo venden? Yo lo compré por 57€ en La Trastienda Digital, pero he mirado ahora y he visto que ya no está, hay otro pero es más caro. No se si será posible encontrarlo en algún otro sitio o habrán dejado de fabricarlo. De ser así sería una pena, es una buena alternativa barata al Roomba.