JagWii

Control a Jaguar with the Wii Nunchuck!

Uses the WiiChuckClass and borrows heavily from the example code.

Comments and pictures to follow(soon-ish)!

//code starts here 

#include <math.h> //I don't remember which math function, but a good thing to have

#include <avr/interrupt.h> // Allows the PWM frequency to be modified

#include "Wire.h" 

#include "WiiChuck.h" // Need to create a file called WiiChuck.h and save into your library

//#include "nunchuck_funcs.h"

#define MAXANGLE 90

#define MINANGLE -90

// Setup the PWM related pins

const int jagsigpin = 9;

const int jagpwrpin = 7;

const int jaggndpin = 8;

//Setup an LED status pin

const int ledpin = 13;

//value is what the PWM is set to: 47 corresponds to midpoint, 20 full reverse 74 full forward

int value = 47;

//create a WiiChuck object called chuck

WiiChuck chuck = WiiChuck();

int angleStart, currentAngle;

int tillerStart = 0;

double angle;

int bob = 0;

boolean lightstatus = LOW;

void setup() {

    //set the PWM frequency to be 122Hz

  TCCR1B = TCCR1B & 0b11111000 | 0x04;

//setup the output pins for PWM and references

  pinMode(jagsigpin, OUTPUT);

  pinMode(jagpwrpin, OUTPUT);

  pinMode(jaggndpin, OUTPUT);

//setup the LED indicator pin

  pinMode(ledpin, OUTPUT);

//set the reference pins

  digitalWrite(jagpwrpin,HIGH);

  digitalWrite(jaggndpin,LOW);

//start the serial link for monitoring purposes

  Serial.begin(115200);

//call the nunchuck initialization functions

  chuck.begin();

  chuck.update();

//set the PWM value to midrange so the motor doesn't jump around before ready

  analogWrite(jagsigpin,value);

  //chuck.calibrateJoy();

}

void loop() {

//20mS loop provides a smooth response that seems continuous

  delay(20);

//get the values from the nunchuck over the I2C link

  chuck.update(); 

//bob is a counter variable for the loop that allows things to run on multiples of 20mS

  bob = bob + 1;

//50x20mS = 1000mS = 1second, 

  if(bob == 50){

  //toggle the boolean value

  lightstatus = ~lightstatus;

//write the new value to the LED pin to change the light

  digitalWrite(13, lightstatus);

//clear the counter so the light will change again in another second

  bob = 0;

  }

  

//the original code scrolled the axis values on the terminal. It was difficult

//to understand so I have the display update once, each time that c is pressed.

  if(chuck.cPressed()){

  

  Serial.print(chuck.readRoll());

    Serial.print(", ");  

  Serial.print(chuck.readPitch());

    Serial.print(", ");  

    Serial.print((int)chuck.readAccelX()); 

    Serial.print(", ");  

    Serial.print((int)chuck.readAccelY()); 

    Serial.print(", ");  

    Serial.print((int)chuck.readAccelZ()); 

    Serial.println();

  }

// the original code didn't grab the thumbstick data which makes for better motor control

// while debugging I updated the motor speed only on button press

  if(chuck.zPressed()){

    Serial.print("x axis: ");

    Serial.print((int)chuck.readJoyX());

    Serial.print(", y axis: ");

    Serial.print((int)chuck.readJoyY());

    Serial.println();

/*The PWM value used allows a range of 20 to 74 with 47 as the midpoint

there are 27 steps in the positive and negative directions

The nunchuck function provides -100 to 100 

this scale is mapped to -27 to 27 and then subtracted from the midpoint of 47

*/

    value = ((int)chuck.readJoyX())*(.27);

    value = value/2;

    value = 47-value;

    Serial.print("value written: ");

    Serial.print(value);

    Serial.println();

    analogWrite(jagsigpin,value);

  }

// For continuous running with the loop... This is where the real action occurs

  value = ((int)chuck.readJoyX())*(.27);

    value = value/2;

    value = 47-value;

    Serial.print("value written: ");

    Serial.print(value);

    Serial.println();

    analogWrite(jagsigpin,value);

}