3 Simple Ways to
Share What You Make

With Instructables you can share what you make with the world — and tap into an ever-growing community of creative experts.

PhotosPhotos

Share one or more photos of a project, recipe, or whatever you've made, quickly and easily.

Step by StepStep-By-Step

Share your step-by-step photos with text instructions of what you made so others can do it too!

VideoVideo

Share your how-to video. You'll need your embed code from a video site such as YouTube.

USB Wii Classic Controller

USB Wii Classic Controller
This project will show you how to create a real USB game pad using a Wii Classic Controller.



Through the steps, you will learn about:
  • How USB works
  • How I2C works
  • How to read data from the Wii Classic Controller
Some of these pre-requisite skills would be nice
  • General electronics
  • AVR programming
The code will be based on V-USB, and the circuit will be based on a implementation V-USB example circuitry called USnooBie.

The entire project is provided as a ZIP file download below. Also see below for a flowchart of how the code will work.



 
Remove these adsRemove these ads by Signing Up
 

Step 1Using the AVR with V-USB

Using the AVR with V-USB
For the microcontroller, we'll be using a ATmega328P. This microcontroller has enough memory resources and a built-in TWI/I2C peripheral to accomplish our goals. However, it does not have built-in USB, which is a problem that we are going to solve using V-USB.
 

"V-USB is a software-only implementation of a low-speed USB device for Atmel’s AVR® microcontrollers, making it possible to build USB hardware with almost any AVR® microcontroller, not requiring any additional chip."

- V-USB official website

V-USB uses a set of hardware and some very special assembly programming techniques to bit-bang the non-return-to-zero (NRZ) binary code that USB uses to communicate. The files provided by V-USB will be compiled into our program in order to create a USB device with our ATmega328P

Please visit the download section of V-USB's website to obtain a copy of the latest version. In my project source code, it's already included.

To compile V-USB into your project...

  1. Make sure you've defined the processor and clock speed correctly (V-USB only supports certain clock speeds)
  2. Copy the folder "usbdrv" from the downloaded package into your project folder
  3. In your project manager or makefile, include "usbdrv.c" and "usbdrvasm.S", such that the object file that's generated will become linked into your project
  4. Inside the folder "usbdrv", there is a "usbconfig-prototype.h", copy that file into your main project directory, and rename it to "usbconfig.h"
  5. Edit "usbconfig.h", this will be explained in detail later
  6. Use "#include" statements to include "usbconfig.h" and then "usbdrv/usbdrv.h"
  7. Make sure that "usbdrv/usbdrv.h" is able to find "usbconfig.h", if it's not able to, use the use "-I" to your makefile or edit "usbdrv/usbdrv.h" to change the file path to "usbconfig.h" (to "../usbconfig.h")
Then your project must implement the some functions...
  • You must initialize V-USB, and then enable interrupts in the AVR
  • It's almost a standard practice to fake disconnect, wait a few milliseconds, and reconnect to the computer, during starting the code. This makes sure your device and computer are in a "reset" state to start off.
  • A request handler function must be implemented, even if you don't perform real actions in it, you must implement it yourself. Look for "usbFunctionSetup" later.
    • In our example, we need to use this function to handle two special requests, you'll see it later
  • The gamepad is a HID device, a USB HID Report Descriptor must be written and stored in your code
More Reading:
« Previous StepDownload PDFView All StepsNext Step »
9 comments
Mar 17, 2012. 12:08 PMgeraldrubalcava says:
Hey! i love your project! but one question... do you think you can compile this on attyin85? similar to the http://hobbyelektronik.org/w/index.php?title=SNES-Joypad
Mar 17, 2012. 10:49 PMgeraldrubalcava says:
wow thats great! i recently finished a nes to usb controller and i loved it. but i would of loved to be able to use a classic controller. But thus im not a avr programer so i dont know much. just enough to mess around a bit with the code.

but great tutorial! loved it! hopefully one day i can implement this on a attiny85.
Oct 21, 2011. 12:34 AMdenilsonsa says:
Thank you for this project!

Not because I've actually used it… But I copy-pasted this HID Descriptor into my project (that has a quite similar HID with keyboard+mouse), and found that your HID did work, while mine didn't.

4 hours later, I finally found the bug in my project. I had written 0x0f where should have been 0x10, somewhere in the middle of my HID descriptor.

So, thank you to help me find the typo in my code! :-)
I guess you never thought this intructable would be useful for that! :-P
Aug 13, 2011. 1:41 PMRegax says:
You really put a lot of work into this instructable. Great work!

I have a question in regards to the format of your instructable. How did you get those dotted borders around your code? It makes the instructable look so neat and orderly.
Jul 25, 2011. 8:13 PMthewizard42 says:
Now do you think it's possible to do this the other way around? Like spoof the classic controller?

Pro

Get More Out of Instructables

Already have an Account?

close

All Steps Viewing
View all steps of an Instructable on the same page when you're a Pro Member.

Upgrade to Pro today!
177
Followers
12
Author:frank26080115(Frank's Projects)
I'm an electrical engineering student at the University of Waterloo.