I've wanted to use my Wiimote to control my PC for some time now, and finally got around to trying it all out.
Getting the wiimote connected to my PC was easy - just install
wmgui, a little GUI app which demonstrates connectivity (via
There's also a package called
wminput which probably does what most people want - it turns a wiimote into an X11 input device (e.g. mouse) so you can point to move the mouse around. You have to
sudo modprobe uinput first on Ubuntu 9.04, btw.
I wanted to play with it myself, so I installed
python-cwiid and messed about with a Python script until I got the hang of the API1):
#!/usr/bin/env python # Wiimote experiments. Hopefully this'll grow into something I can use with # wminput (or emulate it to the same affect) import os import sys import time import cwiid wiimote = None print "Press 1+2 on the Wiimote now..." while not wiimote: try: wiimote = cwiid.Wiimote() except e: print e print "Ignoring previous exception" time.sleep(0.5) wiimote.led = cwiid.LED1_ON | cwiid.LED2_ON | cwiid.LED3_ON | cwiid.LED4_ON wiimote.rumble = True time.sleep(0.4) wiimote.rumble = False wiimote.led = cwiid.LED1_ON | cwiid.LED4_ON print wiimote.state wiimote.enable(cwiid.FLAG_MESG_IFC) # "if changes" wiimote.rpt_mode = cwiid.RPT_BTN while True: messages = wiimote.get_mesg() for mtype, m in messages: if mtype == cwiid.MESG_BTN: for x in dir(cwiid): if not x.startswith("BTN_"): continue if eval("cwiid.%s" % x) != m: continue print x break if m == cwiid.BTN_A | cwiid.BTN_B: print "A + B, exiting" wiimote.disable(cwiid.FLAG_MESG_IFC) wiimote.rpt_mode = 0 wiimote.close() exit # Causes a segfault.. (why?) elif mtype == cwiid.MESG_ERROR: for x in dir(cwiid): if not x.startswith("ERROR_"): continue if eval("cwiid.%s" % x) != m: continue print x break else: for x in dir(cwiid): if not x.startswith("MESG_"): continue if eval("cwiid.%s" % x) != mtype: continue print x break
Next I need to workout how to inject things into X11, probably via
/dev/misc/uinput. I think this snippet will be invaluable.