Latest versions:
If you're having trouble with the latest version (8.0.0), try an older one.
The latest source can be found at:
This is a .NET PC application that allows you to use either the Wii, PS3, or Xbox 360 uDraw GameTablets as a mouse input device. It supports absolute vs. relative cursor movement, mapping of actions to specific buttons, and multiple tablets at once.
The latest version adds:
For the Wii version, you need to attach a Wii remote to it and sync it via Bluetooth with your PC. Not all USB Bluetooth adapters are compatible; see elsewhere about pairing a Wii remote with your PC.
You may need to re-pair it after turning off the Wii remote; I don't know why, but it's something I have to do.
For the PS3 version, you just need the USB dongle that comes with the tablet (what you normally plug into the PS3, and fits inside the tablet's battery compartment).
For the Xbox 360 version, you need an Xbox 360 USB wireless receiver (what people use to play PC games with wireless Xbox 360 controllers). They sometimes come bundled with Microsoft Xbox 360 wireless controllers, or you can buy a Chinese knockoff online, or you can make one yourself by salvaging the RF board of a broken console.
This application is open source and has no license attached to it, so you're free to do whatever you want with it; but please don't slap your name on it and call it your own, that's just rude. Plus you'll probably go to hell for it.
For the Wii tablet, no additional set-up is necessary beyond initial pairing.
For the PS3 tablet, no additional set-up is necessary.
For the Xbox 360 tablet, you must install a libusb driver for your USB wireless controller receiver. This means you CANNOT use it simultaneously with other controllers; you will have to manually switch back and forth between Microsoft's driver and the libusb one in Device Manager. If you're only using the wireless receiver for the tablet, then you don't need to worry about it.
Install LibUsbDotNet and then run its "USB InfWizard". Go through the wizard to generate a driver for the wireless receiver (you'll need to specify a location to save the driver files), and then click "Install Now" to install it.
Once you have it set up correctly, run the executable in the "bin" folder and double-click the notification area icon. You should see "PS3 uDraw Tablet Device" in green if using the PS3 tablet, or "Xbox 360 Wireless USB Receiver" in green if using the 360 tablet. If you see red instead, you haven't installed the driver correctly (or it's not connected to the PC).
Next, to sync the 360 tablet, hold down the Xbox Guide button on the tablet until the lights flash. You may need to hold down the sync button on the bottom of the tablet (and press the sync button on the USB wireless receiver) as well. When it is synced, the tablet will illuminate one of the four corners of the Xbox Guide button (same as when a controller is synced).
Just run the executable in the "bin" folder. It will add an icon to the notification area, which you can double-click or right-click to bring up the options dialogs above.
Wii and PS3 tablet settings are global, and Xbox 360 tablet settings are configured per tablet based on serial number. It will save to an INI file (file name is in the title of the window).
The settings themselves should be self-explanatory; play around with them. Previous versions of this application had problems with consistent speed; hopefully those problems are resolved now.
(Where ambiguous, assume little endian.)
There are 0x08 bytes that can be sent on the device's OUT interrupt pipe -- I don't know what these are.
There are 0x1B bytes constantly received on the device's IN interrupt pipe, described below:
Offset | Description | ||||||||||||||||||||||||||||
0x00 | Button status information:
| ||||||||||||||||||||||||||||
0x02 | D-pad status information:
| ||||||||||||||||||||||||||||
0x03 | Unknown, HID report descriptor indicates X, Y, Z, and Rz and range 0x00-0xFF. I can't get these to ever change from 80 80 80 80. | ||||||||||||||||||||||||||||
0x07 | Position data:
| ||||||||||||||||||||||||||||
0x13 | Accelerometer data, four 16-bit little endian values -- all 0x0200 when not sync'd:
|
Offset | Description | ||||||||||||||||||
0x00 | Fixed 00 01 00 F0 00 13 (part of the event packet from the Xbox 360 USB wireless receiver). | ||||||||||||||||||
0x06 | Directional status information:
| ||||||||||||||||||
0x07 | Button status information:
| ||||||||||||||||||
0x08 | Starts around 0x72-0x74 (when not pressed) and goes up to 0xFF depending on pen pressure. | ||||||||||||||||||
0x09 | Z accelerometer data; around 0x0C at rest, increases to ~0x35 when fully upside down. | ||||||||||||||||||
0x0A | X offset from top-left corner of current grid of press point, or 0xFF if not pressed. | ||||||||||||||||||
0x0B | Minimum X grid that something is being pressed in (0-7). 0x0F if not pressed. | ||||||||||||||||||
0x0C | Y offset from top-left corner of current grid of press point, or 0xFF if not pressed. | ||||||||||||||||||
0x0D | Minimum Y grid that something is being pressed in (0-4), 0x0F if not pressed. | ||||||||||||||||||
0x0E | 0x40 when using the pen, 0x80 when using the finger and something crazy when pinching/stretching. | ||||||||||||||||||
0x0F | 0x00 normally, seems to be the distance between two fingers when pinching/stretching. | ||||||||||||||||||
0x10 | X accelerometer data; starts at ~0x20, increases to ~0x35 when tilted fully left, decreases to ~0x0C when tilted fully right. | ||||||||||||||||||
0x11 | Y accelerometer data; starts at ~0x24, increases to ~0x35 when tilted fully backward, decreases to ~0x0A when tilted fully forward. |
The Wii tablet is a Wii remote extension with ID 0xFF00A4200112. It returns six bytes of data:
Offset | Description |
0x00 | Y offset from top-left corner of current grid of press point, or 0xFF if not pressed. |
0x01 | X offset from top-left corner of current grid of press point, or 0xFF if not pressed. |
0x02 | Upper nibble is minimum X grid that something is being pressed in (0-5), starting at lower left corner, or 0x0F if not pressed. Lower nibble is minimum Y grid (0-7). |
0x03 | Pen pressure, goes from ~0x08 (not pressed at all) to ~0xF4 (pressed hard). |
0x04 | Unknown, always 0xFF. |
0x05 | Bit 1 is reset when the pen button is being held down. |
The PS3 and 360 tablets are broken up into an 8x5 grid of 256x256 each. As the tablet's resolution is 1920x1080 (which doesn't divide evenly), the last row and column are slightly smaller:
256x256 | 256x256 | 256x256 | 256x256 | 256x256 | 256x256 | 256x256 | 128x256 |
256x256 | 256x256 | 256x256 | 256x256 | 256x256 | 256x256 | 256x256 | 128x256 |
256x256 | 256x256 | 256x256 | 256x256 | 256x256 | 256x256 | 256x256 | 128x256 |
256x256 | 256x256 | 256x256 | 256x256 | 256x256 | 256x256 | 256x256 | 128x256 |
256x56 | 256x56 | 256x56 | 256x56 | 256x56 | 256x56 | 256x56 | 128x56 |
You can get the absolute coordinates of the point being pressed with:
The Wii tablet is a little nuttier, and is broken up into an 8x6 grid (or something like this):
158x158 | 256x158 | 256x158 | 256x158 | 256x158 | 256x158 | 256x158 | 158x156 |
158x256 | 256x256 | 256x256 | 256x256 | 256x256 | 256x256 | 256x256 | 158x156 |
158x256 | 256x256 | 256x256 | 256x256 | 256x256 | 256x256 | 256x256 | 158x156 |
158x256 | 256x256 | 256x256 | 256x256 | 256x256 | 256x256 | 256x256 | 158x156 |
158x256 | 256x256 | 256x256 | 256x256 | 256x256 | 256x256 | 256x256 | 158x156 |
158x158 | 256x158 | 256x158 | 256x158 | 256x158 | 256x158 | 256x158 | 128x158 |
Tablet/controller data is sent to PPJoy as follows:
Digital 0 | Cross / A |
Digital 1 | Circle / B |
Digital 2 | Triangle / Y |
Digital 3 | Square / X |
Digital 4 | Up |
Digital 5 | Down |
Digital 6 | Left |
Digital 7 | Right |
Digital 8 | Playstation / Xbox Guide Button |
Digital 9 | Select / Back |
Digital 10 | Start |
Digital 11 | Tablet Pen Click |
Digital 12 | Controller Left Stick Button |
Digital 13 | Controller Right Stick Button |
Digital 14 | Controller Left Shoulder |
Digital 15 | Controller Right SHoulder |
Analog 0 | Tablet Accelerometer X Axis |
Analog 1 | Tablet Accelerometer Y Axis |
Analog 2 | Tablet Accelerometer Z Axis |
Analog 3 | Tablet Pressure Point X Axis (centered when not pressed) |
Analog 4 | Tablet Pressure Point Y Axis (centered when not pressed) |
Analog 5 | Controller Left Trigger |
Analog 6 | Controller Right Trigger |
Analog 7 | Controller Left Stick X Axis |
Analog 8 | Controller Left Stick Y Axis |
Analog 9 | Controller Right Stick X Axis |
Analog 10 | Controller Right Stick Y Axis |
Will I still be able to use my uDraw GameTablet like normal after this? This won't affect either my tablet or the console in any way, right?
Of course; it won't affect either the tablet or the console in any way.
What do I need on my PC to run this?
.NET Framework 2.0 or better (as well as a Windows OS that it supports -- anything modern). For the Xbox 360 tablet, you also need an Xbox 360 USB wireless receiver (either the official Microsoft one, a Chinese knockoff, or a salvaged console RF board).
What do I do after running the application?
Use the tablet. Right-click the icon in the notification area and choose "Options..." (or double-click the icon) to bring up per-tablet settings you can configure.
Will you ever add Photoshop pressure sensitivity to it?
Highly unlikely. Photoshop looks for actual USB tablet devices, which this is not. This is just some code to communicate with the tablet and/or 360 receiver directly. There is no way to provide pressure sensitivity in Windows without the device actually showing up as a tablet instead of a custom device. There are only two ways I can think of around this -- expose a virtual USB tablet device and pass through all the information, or create a WINTAB32.DLL bridge between Photoshop and the real tablet. I'm probably not going to work on it.
This sucks, it's choppy and/or some parts of it don't work for me, etc.
This was never meant to be the best implementation of this kind of thing; if you don't like it, I encourage you to use the documentation on this page to produce something better.
Will there ever be a Mac or Linux port of this?
Not by me. You're welcome to use the documentation on this page to produce one.
What tools did you use to assemble/build this?
It can be built with Visual Studio C# 2010 Express from microsoft.com (or similar).
How can I scream at you / profess my undying love / ask a question / etc.?
brandonlw@gmail.com.