Ok, This is what I have so far. This comunicates with the arduino and all I am using is the joystick y,x axix and the two buttons.
The buttons are just driving a 5v relay. The problem with What I have right now is that both can be turned on and that would not be good for my battery. I need to make it so that either one or the other is on and not both. These are used on pins 2 and 4. Also these are all set to ledpins because that is what I was doing testing with.
Now the other part i need is to make the pin 8 and pin 9. work together. When both of these see the input of of joystick y go up then both of these need to have the same PWM coming out. Which the duty cycle at nuetral needs to be a about 6% and and the make duty cycle out needs to be about 8%. ( I will need to be able to adjust these slighly.) This will drive the submarine forward. Now to turn, I need x joystick. when the bytes go down then the pin eight needs to start backing off on the PWM. Then if x joystick goes up then the Pin 9 needs to start backing off. This will in turn make it so that one motor is spinning faster than the other and it will turn.
Throught this code. I have blocked out some things that are not needed. and aslo I have added the thresh holds. If the code was setup so that I could put in the thresholds from the wii nunchuck myself then it would be great
#include <PString.h>
#include <Wire.h>
#undef int
#include <stdio.h>
uint8_t outbuf[6]; // array to store arduino output
int cnt = 0;
int ledPin = 13;
int ledpin1 = 9;
int ledpin3 = 2;
int ledpin2 = 8;
int ledpin4 = 4;
int yThres = 200;
int xThres = 200;
int xThresmin = 40;
int z_buttonmin = 0;
int c_buttonmin = 0;
void
setup ()
{
pinMode (ledpin1, OUTPUT);
pinMode (ledpin2, OUTPUT);
pinMode (ledpin3, OUTPUT);
pinMode (ledpin4, OUTPUT);
Serial.begin (19200);
Serial.print ("Finished setup\n");
Wire.begin (); // join i2c bus with address 0x52
TWBR = 158;
TWSR |= _BV (TWPS0);
nunchuck_init (); // send the initilization handshake
}
void
nunchuck_init ()
{
Wire.beginTransmission (0x52); // transmit to device 0x52
Wire.write (0x40); // sends memory address
Wire.write (0x00); // sends sent a zero.
Wire.endTransmission (); // stop transmitting
}
void
send_zero ()
{
Wire.beginTransmission (0x52); // transmit to device 0x52
Wire.write (0x00); // sends one byte
Wire.endTransmission (); // stop transmitting
}
void
clearTwiInputBuffer(void)
{
while ( Wire.available())
Wire.read ();
}
void
loop ()
{
int test =0;
Wire.requestFrom (0x52, 6); // request data from nunchuck
while (Wire.available ())
{
outbuf[cnt] = nunchuk_decode_byte (Wire.read ()); // receive byte as an integer
digitalWrite (ledPin, HIGH); // sets the LED on
cnt++;
}
clearTwiInputBuffer();
// If we recieved the 6 bytes, then go print them
if (cnt >= 5)
{
print ();
}
cnt = 0;
send_zero (); // send the request for next bytes
delay (100);
}
// Print the input data we have recieved
// accel data is 10 bits long
// so we read 8 bits, then we have to add
// on the last 2 bits. That is why I
// multiply them by 2 * 2
void
print ()
{
int joy_x_axis = outbuf[0];
int joy_y_axis = outbuf[1];
// int accel_x_axis = outbuf[2] * 2 * 2;
// int accel_y_axis = outbuf[3] * 2 * 2;
// int accel_z_axis = outbuf[4] * 2 * 2;
int z_button = 0;
int c_button = 0;
// byte outbuf[5] contains bits for z and c buttons
// it also contains the least significant bits for the accelerometer data
// so we have to check each bit of byte outbuf[5]
if ((outbuf[5] >> 0) & 1)
{
z_button = 1;
}
if ((outbuf[5] >> 1) & 1)
{
c_button = 1;
}
// if ((outbuf[5] >> 2) & 1)
// {
// accel_x_axis += 2;
// }
// if ((outbuf[5] >> 3) & 1)
// {
// accel_x_axis += 1;
// }
//
// if ((outbuf[5] >> 4) & 1)
// {
// accel_y_axis += 2;
// }
// if ((outbuf[5] >> 5) & 1)
// {
// accel_y_axis += 1;
// }
//
// if ((outbuf[5] >> 6) & 1)
// {
// accel_z_axis += 2;
// }
// if ((outbuf[5] >> 7) & 1)
// {
// accel_z_axis += 1;
// }
if (joy_y_axis > yThres)
{
if (joy_y_axis==0){
return;
}
if (joy_y_axis==255){
return;
}
digitalWrite (ledpin1, HIGH);
digitalWrite (ledpin2, HIGH);
}
else
{
digitalWrite (ledpin1, LOW);
digitalWrite (ledpin2, LOW);
}
if (joy_x_axis==0){
return;
}
if (joy_x_axis==255){
return;
}
if (joy_x_axis > xThres)
{
digitalWrite (ledpin2, HIGH);
}
if (joy_x_axis < xThresmin)
{
digitalWrite (ledpin1, HIGH);
}
if (z_button == z_buttonmin)
{
digitalWrite (ledpin3, HIGH);
}
else
{
digitalWrite (ledpin3, LOW);
}
if (c_button == c_buttonmin)
{
digitalWrite (ledpin4, HIGH);
}
else
{
digitalWrite (ledpin4, LOW);
}
delay (1000);
Serial.print (joy_x_axis, DEC);
Serial.print ("\t");
Serial.print (joy_y_axis, DEC);
Serial.print ("\t");
// Serial.print (accel_x_axis, DEC);
// Serial.print ("\t");
//
// Serial.print (accel_y_axis, DEC);
// Serial.print ("\t");
//
// Serial.print (accel_z_axis, DEC);
// Serial.print ("\t");
Serial.print (z_button, DEC);
Serial.print ("\t");
Serial.print (c_button, DEC);
Serial.print ("\t");
Serial.print ("\r\n");
}
// Encode data to format that most wiimote drivers except
// only needed if you use one of the regular wiimote drivers
char
nunchuk_decode_byte (char x)
{
x = (x ^ 0x17) + 0x17;
return x;
}