Offline
Newbie
Karma: 0
Posts: 10
|
 |
« Reply #5 on: September 19, 2012, 09:53:22 am » |
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; }
|