User Tools

Site Tools


coding:wiimote

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

coding:wiimote [2009/06/07 23:58] (current)
robm created
Line 1: Line 1:
 +====== Wiimote ======
 +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 ''​libcwiid1.so''​).
 +
 +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.
 +
 +===== Doing it myself =====
 +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 API(([[http://​wiki.wiimoteproject.com/​Reports|WiiMote Project.com]] was useful in working out the API)):
 +
 +<code python>
 +#​!/​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
 +</​code>​
 +
 +Next I need to workout how to inject things into X11, probably via ''/​dev/​misc/​uinput''​. I think [[http://​www.koders.com/​python/​fidAC06355D48C7BA355686BC67E42D0C7B09CD7FEA.aspx|this snippet]] will be invaluable.
coding/wiimote.txt · Last modified: 2009/06/07 23:58 by robm