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); } |
Arduino Jaguar >