Using the Wiimote with PyGame
| tags: programming, enabling technology, wiimote
UPDATE:Tim Swast has updated this code to work with the new wiiuse API. I recommend his version which you can find here: http://pypi.python.org/pypi/wiiuse/0.12
Several of my project teams this semester will (I hope) use PyGame and the Wiimote in their projects. I had it working fine on Ubuntu but struggled to find an interface that works with Python on Windows XP. Luke pointed me to wiiuse so I wrote a very simple wrapper with ctypes and then wrapped that in a module for PyGame. You can find the code in CVS at SourceForge in pywiiuse. I also uploaded a source release. You'll need wiiuse.dll on Windows or wiiuse.so on Ubuntu.
Here's a simple example using it in PyGame.
import pygame import pygame_wiimote # ideally something like this would be part of pygame so the _ would become . import sys pygame.init() # initialze the wiimotes print 'press 1&2' pygame_wiimote.init(1, 5) # look for 1, wait 5 seconds n = pygame_wiimote.get_count() # how many did we get? if n == 0: print 'no wiimotes found' sys.exit(1) wm = pygame_wiimote.Wiimote(0) # access the wiimote object wm.enable_accels(1) # turn on acceleration reporting w,h = size = (512,512) screen = pygame.display.set_mode(size) run = True old = [h/2] * 3 maxA = 2.0 colors = [ (255,0,0), (0,255,0), (0,0,255) ] while run: for event in pygame.event.get(): if event.type == pygame.QUIT: print 'quiting' run = False break elif event.type == pygame_wiimote.WIIMOTE_BUTTON_PRESS: print event.button, 'pressed' elif event.type == pygame_wiimote.WIIMOTE_BUTTON_RELEASE: print event.button, 'released' elif event.type == pygame_wiimote.WIIMOTE_ACCEL: for c in range(3): s = int((event.accel[c] * h / maxA + h)/2) s = max(0, min(h-1, s)) pygame.draw.line(screen, colors[c], (w-3, old[c]), (w-2, s)) old[c] = s screen.blit(screen, (-1, 0)) elif event.type == pygame_wiimote.NUNCHUK_ACCEL: print 'n accel', event.accel pygame.display.flip() pygame.time.wait(10) wm.disconnect()