Wednesday, March 30, 2011

Early Development

I plan to update as the project develops, but so far I haven't been keeping track. So here's the highlights so far.

Phase 0
Got an idea to improve the final project. Began investigating how to implement digital logic and how to hack a game controller. Found out what the Arduino does and how people hacked PS2 controllers.

Originally I thought PS2 controllers would be good because they are widespread, which means people are familiar with them and there are many 3rd-party (cheap) controllers. I also thought since they were older, there would be more information on the internet on how to hack these. I assumed that the newer controllers would be too high-tech to use, and too new for anyone to have a good way of hacking them. These assumptions turned out to be pretty bad (for reasons probably discussed later).

Phase 1
Ordered the Arduino Uno, PS2 Dualshock 2 (non-Sony AKA non-OEM), and accessories from Sparkfun.com. Began to read Bill Porter's website on how to hack a PS2 controller: http://www.billporter.info/playstation-2-controller-arduino-library-v1-0/. He goes into a lot of detail and has a Arduino library to boot.

Phase 2
Found out that Nintendo (Wii) Nunchuks are very easy to interface with an Arduino. The Nunchuk communicates over I2C, which the Arduino is capable of reading directly. Tod Kurt invented an adapter that is super easy to use: http://todbot.com/blog/2008/02/18/wiichuck-wii-nunchuck-adapter-available/. He also lists a corresponding Arduino library. I order an adapter ($4 from http://store.fungizmos.com/, free shipping!) as backup in case the PS2 doesn't work.

Also found out that people using non-Sony PS2 controllers were having a lot of trouble using them with Arduinos. In retrospect I should have invested the extra ~$4 and bought an authentic Sony PS2 controller.

Phase 3
Attempted to crimp wires from the PS2 to the Arduino, and didn't get it to work. Tried to solder the wires but they are very thin and weak copper wires, and hard to solder. Bought a Nintendo Nunchuk and hooked it up to the Arduino using Tod's adapter and got some test code (http://www.arduino.cc/playground/Main/WiiChuckClass) working. Tested the accelerometers, Z, and C buttons. I had a lot of trouble getting the Arduino to print values to the serial monitor but eventually got it to work. Here's an example:

// This program prints out something when you press the z button.


#include <math.h>

#include "Wire.h"
#include "WiiChuck.h"
#include "nunchuck_funcs.h"

#define MAXANGLE 90
#define MINANGLE -90


WiiChuck chuck = WiiChuck();
int angleStart, currentAngle;
int tillerStart = 0;
double angle;

void setup() {

  Serial.begin(19200);
  Serial.print("hello");
  nunchuck_init();

  chuck.begin();
  chuck.update();
  Serial.print("Setup done!");
  //chuck.calibrateJoy();
}


void loop() {
  delay(20);
  chuck.update();
  if(chuck.zPressed()) {
    Serial.println("Zbutton pressed");
  }
  else if(chuck.cPressed()){
    Serial.println("cButton pressed");
  }
}

Intro

This blog is to record the development process of an electronics project. The goal of this project is to improve a DC motor controller that was originally produced in a University of Washington class.

Abstract

A final project from my University class, a motor controller, enabled a DC motor to brake, change direction and adjust speeds. Although this was completed, the analog user interface and logic system were  suboptimal because of excessive wiring and inefficient use of space. A microcontroller would streamline logic processes and save space, while an interfaced gaming controller would be highly user friendly. These upgrades will be attempted.

Specs of DC Motor, logic, and control system:

-27 V DC Motor with MOSFET H-bridge, optocoupled to logic (Will likely be tuned down to ~18 V for presentation)
-Bidirectional rotation
-Speed control
-Dynamic braking, possibly counter-current braking
-User interface: Nintendo Nunchuk or Playstation 2 Dualshock
-Logic: Arduino Uno (AT MEGA 328 micro-controller) 

Motivation (Problem Statement)

The original logic design was based on a multiplexer array. Each multiplexer was fed 4 input signals and were switched based on two more signals. Also, extra features such as slow-start (using RC circuits) were hard-wired into the board. This lead to a very complicated board. An alternative is to use a microcontroller. The Arduino Uno is a microcontroller board that is easily programmable and easily interfaced with other hardware. It has enough computing power to act alone as the logic component. Using the Uno will save space, and it will be easier to customize.

Similarly, the user interface was based on analog components such as dial-potentiometers and switches. This lead to a very messy design; many wires had to be soldered and there was no central box containing all the controls. A gaming controller such as a PS2 Dualshock or Nintendo Nunchuk will be interfaced with the Arduino to provide a more user friendly environment.