Otros sitios...

Búsqueda

Antispam

Bluetooth en Windows

July 29th, 2007 by Jorge Machin

A diferencia de Linux, los controladores de Bluetooth en Windows no son libres y el sistema operativo no los incluye. Cuando se compra un adaptador USB Bluetooth, el mismo hardware viene acampañado con un disco compacto con el software necesario. El primero que compré decía que era un KY-BT100 de Integrated System Solution Corp e incluía el programa BlueSoleil 1.6 de la compañía IVT Corporation.

BlueSoleil
BlueSoleil 1.6 de IVT Corporation

BlueSoleil es un programa muy completo, que permite:

- Transmitir archivos, mensajes, fotos con celulares con palms u otras computadoras.
- Conectar impresoras, dispositivos como mandos de juegos, ratones e incluso usar el celular o la palm como ratón.
- Compartir la salida a internet con otros dispositivos.

Desafortunadamente los miedos que expresaba en el post de Bluetooth en Linux aumentaron al darme cuenta que no podía actualizar la versión 1.6 de 2004 (que no funciona en Windows Vista) a la actual porque la dirección BD del adaptador es inválida. Por lo tanto, no tengo ningún soporte, ni respaldo a futuro porque los señores de IVT Corporation consideran que la compañía que fabrica el adaptador se está pirateando el software; pero tampoco te quieren vender la versión actual.

Para evitarme problemas, mejor compré otro de la marca Zonet; el cual incluye la licencia de uso de la versión 2.6.08, la cual funciona perfectamente en Windows XP y en Windows Vista.

Control Wii Remote

Para sorpresa de muchos de los amantes de los videojuegos de PC, el control Wii Remote (Wiimote para los cuates) se comunica siguiendo fielmente el estándar para dispositivos de interfase humana de Bluetooth, por lo que los hackers no tardaron en desarrollar los programas accesorios para buscar la misma experiencia de usuario de los juegos de Nintendo en nuestras computadoras caseras (No es muy recomendable hacerlo en las del trabajo).


Jugando Half Life 2 con el controll Wiimote

El programa que hace la magia se llama GlovePIE y fue desarrollado para emular el comportamiento del teclado, ratón y joystick desde dispositivos que no tienen esa funcionalidad; de hecho, originalmente fue concebido para darle soporte a un guante de realidad virtual llamado Essential Reality P5 Glove. GlovePie se apoya en el stack de Bluetooth de Microsoft y en un programa emulador de joystick llamado Paralel Port Joystick o PPJoy que debe de estar instalado previamente.

Para dirigir el movimiento del wiimote al joystick virtual, al ratón y al teclado, se debe escribir en GlovePie, un pequeño script en un lenguaje similar al Basic. Por ejemplo, el siguiente script me sirvió para el juego de Half Life 2 de Valve:

key.w = wiimote.Up
key.s = wiimote.Down
key.a = wiimote.Left
key.d = wiimote.Right
PPJoy.Digital4 = Wiimote.A
PPJoy.Digital5 = Wiimote.B
PPJoy.Digital9 = wiimote.One
PPJoy.Digital10 = wiimote.Two

PPJoy.Analog0 = -(wiimote.RawForceX + 6) / 20
PPJoy.Analog1 = (wiimote.RawForceZ - 3) / 15

key.q = Wiimote.Minus
key.escape = Wiimote.Home
key.f = Wiimote.Plus

mouse.LeftButton = Wiimote.B
Wiimote.Rumble = Wiimote.B
mouse.RightButton = Wiimote.A

Conclusiones

Hasta el momento de hacer este experimento, nunca he jugado con una consola Wii, por lo que no puedo certificar que la experiencia sea la misma. Algunos comentarios en sitios de conocedores dicen que el stack de bluetooth de Microsoft no soporta toda la funcionalidad que tiene el wiimote y a mi me falta la barra sensora de los leds infrarojos para usar la función de señalamiento (aunque construir una parece muy simple). Sin embargo, funciona bien y es realmente divertido jugar con el control.

Posteado en Videojuegos, Windows | 9 Comentarios »

Bluetooth en Linux

July 28th, 2007 by Jorge Machin

Actualmente, muchos dispositivos personales como palms y celulares incluyen entre sus funcionalidades el poder interconectarse por medio de la tecnología inalámbrica Bluetooth. Afortunadamente, hay muy pocas cosas de que preocuparse, porque al menosd desde Fedora 7 tiene soporte completo de bluetooth por medio de la pila de protocolos para Linux Bluez.

Como utilizo un servidor Dell para trabajar con Linux, este no incluía alguna interfaz Bluetooth de fábrica; por lo que la solución más sencilla y económica para agregarle esta capacidad fue comprar un adaptador USB Bluetooth.

Una vez enchufado (sin necesidad de reiniciar la máquina), se puede revisar su presencia con el siguiente comando:

[root@linux renato]# /sbin/lsusb

Bus 002 Device 001: ID 0000:0000 
Bus 005 Device 001: ID 0000:0000 
Bus 004 Device 001: ID 0000:0000 
Bus 003 Device 002: ID 1131:1001 Integrated System Solution Corp. KY-BT100 Bluetooth Adapter
Bus 003 Device 001: ID 0000:0000 
Bus 001 Device 004: ID 045e:0084 Microsoft Corp.
Bus 001 Device 005: ID 413c:2003 Dell Computer Corp.
Bus 001 Device 001: ID 0000:0000

Utilerías de línea de comando:

El paquete bluez-utils contiene todas las herramientas que necesitamos para obtener o configurar nuestros dispositivos bluetooth. Algunas de ellas son:

- hciconfig
- hcitool
- hciattach
- hcid
- l2ping

hciconfig

Este comando se utiliza para configurar y obtener información de los adaptadores Bluetooth que tenemos conectados (obviamente, por lo general es uno). Para obtener la información de nuestro adaptador hacemos lo siguiente:

/usr/sbin/hciconfig -a

hci0:   Type: USB
        BD Address: 11:11:11:11:11:11 ACL MTU: 678:8 SCO MTU: 48:10
        UP RUNNING PSCAN ISCAN
        RX bytes:1987 acl:0 sco:0 events:57 errors:0
        TX bytes:723 acl:0 sco:0 commands:52 errors:0
        Features: 0xbf 0xfe 0x8d 0x78 0x08 0x18 0x00 0x00
        Packet type: DM1 DM3 DM5 DH1 DH3 DH5 HV1 HV2 HV3
        Link policy: RSWITCH HOLD SNIFF PARK
        Link mode: SLAVE ACCEPT
        Name: 'Linux home'
        Class: 0x120104
        Service Classes: Networking, Object Transfer
        Device Class: Computer, Desktop workstation
        HCI Ver: 1.2 (0x2) HCI Rev: 0x1fe LMP Ver: 1.2 (0x2) LMP Subver: 0x1fe
        Manufacturer: Integrated System Solution Corp. (57)

Desafortunadamente, desde aquí pude ver que no es muy recomendable el adaptador que compré porque de fábrica le programaron una dirección BD inválida a todos sus adaptadores Bluetooth: 11:11:11:11:11:11. Esto es realmente raro porque la compañía china que lo produjo si aparece registrada ante la IEEE y desafortunado porque se supone que esa dirección es única y puede haber conflictos si se usan dos o más de estos dispositivos al mismo tiempo. Aunque el adaptador funciona correctamente, algo en mi interior me dice que compré un producto pirata o que fue retirado del mercado por esa razón.

En http://standards.ieee.org/regauth/oui/index.shtml se puede consultar el identificador OUI en la base de datos de la IEEE, el cual se utiliza en las primeras tres cifras de la dirección BD. Curiosamente los identificadores de mi celular y del wiimote si aparecen, pero no así la de mi palm. ¡Benditas estandarizaciones!

hcitool

Siguiendo con cosas menos tristes, el comando para encontrar dispositivos Bluetooth a nuestro alredor es:

[renato@linux renato]# hcitool scan
Scanning ...
        XX:XX:XX:XX:XX:XX       Palm Jorge Machin
        XX:XX:XX:XX:XX:XX       Telefono Jorge Machin
        XX:XX:XX:XX:XX:XX       Nintendo RVL-CNT-01

Applets de gnome:

próximamente

Wii Remote en Linux:

Para poder usar el control remoto de la consola de juegos wii de Nintendo (aka wiimote), se puede usar un script de python llamado WMD (Wiiwanna Motte Dammiit!) desarrollado por Francois A. Bradet y amigos. El funcionamiento consiste esencialmente en direccionar los comandos del wiimote al teclado y al ratón para poderlo usar en los juegos existentes en Linux.

Prerequisitos

Para poderlo instalar, es necesario tener los siguientes programas previamente instalados:

- Las librerias de desarrollo de BlueZ

yum install bluez-libs-devel

- Librería pybluez para python

wget http://org.csail.mit.edu/pybluez/release/pybluez-src-0.14.tar.gz
tar -xvzf pybluez-0.14.tar.gz
cd pybluez-0.14
python setup.py install

- python-xlib

yum install python-xlib

Para evitar errores se recomienda aumentar el tamaño del buffer del socket cambiando:

recv = self.socket.recv(2048)

a lo siguiente

recv = self.socket.recv(4096)

en el archivo /usr/lib/python2.5/site-packages/Xlib/protocol/display.py.

Instalación:

La versión más actualiza de GDM se baja por medio de svn:

svn co https://svn.forthewiin.org/wmd/trunk/ wmd-trunk

Aquí no se compila nada porque son programas escritos en python. Para probar que todo este funcionando correctamente o para usar el wiimote como un ratón se hace los siguiente:

[renato@linux wmd-trunk]#/sbin/modprobe uinput
[renato@linux wmd-trunk]# xhost +
[renato@linux wmd-trunk]# python WMD.py
uinput: Attempting to autodetect device file
uinput: /dev/misc/uinput isn't a usable uinput device file
uinput: autodetection chose /dev/input/uinput as uinput device file
uinput: Trying to open /dev/input/uinput as control device
uinput: Writing WIIMOTE_UUD
uinput: Registering 31 events
uinput: Creating device
uinput: initialized and ready
CONNECTING
Looking for Wiimote services at address 00:17:AB:36:09:52
Failure. We have not found that Wiimote.
Now trying to discover a willing Wiimote, please activate your Wiimote within 5 seconds.
Found 2 Bluetooth Devices!
Found a Wiimote at address XX:XX:XX:XX:XX:XX
Looking for Wiimote services at address XX:XX:XX:XX:XX:XX
Victory! We have found that Wiimote!
We are now connected to Wiimote at address XX:XX:XX:XX:XX:XX
CONNECTED

Cuando aparezca el letrero "Now trying to discover a willing Wiimote, please activate your Wiimote within 5 seconds." se debe presionar al mismo tiempo los botones 1 y2 del wiimote o bien presionar el botón sync que se encuentra en el compartimiento de las pilas para poner al wiimote en modo detectable.


Probando Unreal Tournament 2004 con el wiimote

Desafortunadamente, el WMD parece estar muy enfocado a ser un "ratón inalámbrico" y el código está bastante desordenado y confuso (el mismo autor lo reconoce) por lo que para usarlo en alguna aplicación es necesario invertir algo de tiempo en el código fuente para ver como funciona. Danigm, un usuario de Linux y amante de los comics, se tomó la molestia de escarbar en el código de WMD para hacer un tutorial donde incluye un esqueleto de como se podrían manejar las clases de WMD con una utilería UNIX (xsendkeycode) para usar el teclado con el control Wii.

Xsendkeycode se encuentra dentro del paquete lineakd, si no lo tiene instalado se puede recurrir a yum:

yum install lineakd

Para jugar Unreal Tournament 2004, modifique ligeramente el ejemplo de Danigm para que quedara de la siguiente forma:

import sys
sys.path.append('.')

import os

from wmd.Common import *
from wmd.Config import CFG
from wmd.UI.UIManager import UIManager
from wmd.Wiimote.WMManager import WMManager
from wmd.EVDispatcher import EVDispatcher
from wmd.MotionSensing import MSManager
from wmd.Pointer import POManager
from wmd.CommandMapper import CommandMapper

class unrealManager:

   def __init__( self, cf, ms, ev ):
      self.cf = cf
      self.ev = ev
      self.ms = ms
      self.ev.subscribe( WM_BT, self.ev_buttons)

   def ev_buttons( self, ev ):

      button = ev[0]
      state  = ev[1]

      # This code is only for mnemonics reasons:

      keyctrl = 9

      key1 = 10
      key2 = 11
      key3 = 12
      key4 = 13
      key5 = 14
      key6 = 15
      key7 = 16
      key8 = 17
      key9 = 18

      keyq = 24
      keyw = 25
      keye = 26
      keyr = 27
      keyt = 28
      keyy = 29
      keyu = 30
      keyi = 31
      keyo = 32
      keyp = 33
 
      keya = 38
      keys = 39
      keyd = 40
      keyf  = 41
      keyg = 42
      keyh = 43
      keyj  = 44
      keyk = 45
      keyl  = 46

      keyz = 52
      keyx = 53
      keyc = 54
      keyv = 55
      keyb = 56
      keyn = 57
      keym = 58

      keyspace = 65

      if state == "DOWN":

         if button == "+":
            os.popen2("xsendkeycode "+str( keyg )+" 1")
         elif button == "-":
            os.popen2("xsendkeycode "+str( keyf )+" 1")
         elif button == "H":
            os.popen2("xsendkeycode "+str( keyctrl )+" 1")
         elif button == "1":
            os.popen2("xsendkeycode "+str( keyspace )+" 1")
         elif button == "2":
            os.popen2("xsendkeycode "+str( keyc )+" 1")
         elif button == "U":
            os.popen2("xsendkeycode "+str( keyw )+" 1")
         elif button == "D":
            os.popen2("xsendkeycode "+str( keys )+" 1")
         elif button == "L":
            os.popen2("xsendkeycode "+str( keya )+" 1")
         elif button == "R":
            os.popen2("xsendkeycode "+str( keyd )+" 1")

      elif state == "UP":

         if button == "+":
            os.popen2("xsendkeycode "+str( keyg )+" 0")
         elif button == "-":
            os.popen2("xsendkeycode "+str( keyf )+" 0")
         elif button == "H":
            os.popen2("xsendkeycode "+str( keyctrl )+" 0")
         elif button == "1":
            os.popen2("xsendkeycode "+str( keyspace )+" 0")
         elif button == "2":
            os.popen2("xsendkeycode "+str( keyc )+" 0")
         elif button == "U":
            os.popen2("xsendkeycode "+str( keyw )+" 0")
         elif button == "D":
            os.popen2("xsendkeycode "+str( keys )+" 0")
         elif button == "L":
            os.popen2("xsendkeycode "+str( keya )+" 0")
         elif button == "R":
            os.popen2("xsendkeycode "+str( keyd )+" 0")

cf = CFG

ev = EVDispatcher(cf)

ms = MSManager( cf, ev ) # Motion analysis
po = POManager( cf, ev ) # Handles the pointer, receives WM_IR, sends out ABS_POS absolute position reports
um = unrealManager( cf, ms, ev ) # Motion analysis
cm = CommandMapper( cf, ev )

# Handles the Wiimote; connects to it, manages wiimote state and mode, parses wiimote reports

wm = WMManager(cf, ev)

if wm.connect() and wm.setup():
        cycles = wm.main_loop()

wm.disconnect()

Obviamente el script le falta bastante trabajo pero seguramente puede servir de guía para programar otros juegos en Linux o para que alguien con más paciencia lo mejore.

¿Hay algo más?

Todo este rollo fue únicamente con fines didácticos porque no suelo jugar en Linux aunque hay buenos juegos. Sin duda dejé muchas cosas sin ver, como el manejo de los infrarrojos del wiimote y su bocinita; pero para mí fue suficiente y ya tengo una buena idea de como funcionan estos juguetes. Quizás regrese un día que me sienta nostálgico o por alguna razón tenga la necesidad; para entonces seguramente habrá mejores programas y utilerías... o tal vez sea cuando el Bluetooth pase a ser pieza de museo.

Otro programa recomendado

Wminput es un programa escrito en C para hacer la interfase con el wiimote. Es un programa interesante porque muchas de las distribuciones ya lo tienen en su repositorio, por lo que vale la pena revisarlo. Si no lo encuentra en su repositorio favorito, puede obtener las fuentes y más información en: www.cwiid.org.

Posteado en Fedora, Linux, Videojuegos | No hay comentarios »

¡Ratas en la casa de la abuela!

July 13th, 2007 by Jorge Machin

Bueno, pero gracias a la inesperada visita, comí unas ricas verduras fritas en aceite de oliva.

Posteado en Fotografías, Gastronomía, Personal, Videojuegos | 2 Comentarios »

DeterK

July 8th, 2007 by Jorge Machin

DeterK 1.0 era un programa de utilería para ingeniería civil que realizaba cálculos de estructuras de concreto y de elementos metálicos para edificios. En el caso de estructuras de concreto obtenía la geometría y el calibre de las varillas a utilizar. Estaba programado en Borland C++ 5.0, usaba OWL para el manejo de ventanas y BDE para el manejo de bases de datos. Podía importar y exportar archivos a otros programas de Ingeniería civil incluyendo al STAAD.

DeterK
Cálculo de un estacionamiento

Lo escribí a principios de 1996 en la vida en la que trabajaba en una constructora. Fue mi primer programa relativemente complejo en C++, donde desarrollé y apliqué técnicas de programación profesionales para reducir el número de errores en la programación, realizar cambios de forma rápida y autodocumentables.

Cabe aclarar que en esa época era más talachudo programar, porque había menos librerías libres y poca información en Internet; por lo que prácticamente había que hacerlo todo desde cero. Por ejemplo, la librería de 3D la tuve que programar, pero me sirvió bastante como ejercicio. Poco tiempo después conocí Direct-X y OpenGL, pero al cambiar de trabajo tuve menos necesidad de utilizar este tipo de librerias hasta varios años después.

Posteado en 3D, Arqueología Machinesca, Personal | 2 Comentarios »

Fotos de México D.F. y alrededores

July 1st, 2007 by Jorge Machin
Reino Aventura
Reino AventuraPueblo PolinesioPueblo AlemánPalacio de Bellas ArtesSecretaria de Comunicaciones en plena construcción del metrobusLa luna desde mi casa

Igual que muchas cosas de las que hay en este blog: "para antes de que se me pierda o se destruya"

Nota: No soy muy afecto a tomar fotos de aquí, pero conforme vaya teniendo; las iré colocando en este post. Gracias a todos los de mi familia que han donado fotos para este post.

Posteado en Fotografías, México, Personal | 3 Comentarios »