problemi nunchuk

salve ragazzi ho provato a cimentarmi nell’utilizzo del nunchuk ma ho riscontrato un problemino. usando il programma per interrogare il nunchuk sui valori dell’accellerometro i valori riportati su serial monitor sono sempre gli stessi con qualsiasi posizione del nunchuk; ossia 132 124 499 426 355. a cosa puo essere dovuto. il ninchuk che uso non è originale, puo essere che si è rotto?
il codice che uso è questo:
#include <Wire.h>

uint8_t buf[6]; // buffer for the six-bytes packet coming from Nunchuck
int cnt=0; // count of bytes in the buffer
int readcnt=0; // number of times we read a packet from Nunchuck
int ledPin=13; // which pin will host the blinking LED

uint8_t nunchuk_decode(uint8_t x) // decode nunchuck data
{
return (x^0x17)+0x17; // not that an hard encryption…
}

void nunchuck_ack() // acknowledge a Nunchuck packet
{
Wire.beginTransmission(0x52); // send a zero to device 0x52
Wire.send(0);
Wire.endTransmission();
}

void setup() // initialization
{
int n;
digitalWrite(ledPin, HIGH); // turn on LED

for(n=0; n<6; n++) buf[n]=0; // fill buffer with zero values

Serial.begin(115200); // console init

Wire.begin(); // TWI init

Wire.beginTransmission(0x52); // nunchuck init
Wire.send(0x40);
Wire.send(0);
Wire.endTransmission();

digitalWrite(ledPin, LOW); // turn off LED

Serial.print("!-- start\n");
}

void loop() // main loop
{
Wire.requestFrom(0x52, 6); // request data from nunchuck
while(Wire.available()) // read data and light the LED
{
buf[cnt++] = nunchuk_decode(Wire.receive());
digitalWrite(ledPin, HIGH);
}

if(cnt>=6) // an entire Nunchuck packet was read?
{
printdata(); // yes, print it
cnt=0; // clear buffer counter
nunchuck_ack(); // acknowledge received packet
digitalWrite(ledPin, LOW); // turn off the LED
delay(800); // wait 800msec before next loop
}
}

void printdata() // print out the values
{
int n; // note: the 123,131,524,597… depend on my Nunchuck calibration

Serial.print(++readcnt, DEC);

Serial.print("\t"); // joystick x/y values
Serial.print((int)buf[0]-123);
Serial.print("\t");
Serial.print((int)buf[1]-131);

n=(buf[2]<<2)+((buf[5]>>2)&3)-524; // accel X
Serial.print("\t");
Serial.print(n);

n=(buf[3]<<2)+((buf[5]>>4)&3)-597; // accel Y
Serial.print("\t");
Serial.print(n);

n=(buf[4]<<2)+((buf[5]>>6)&3)-668; // accel Z
Serial.print("\t");
Serial.print(n);

Serial.print(buf[5]&1 ? "\t- " : "\t[z] ");
Serial.print(buf[5]&2 ? “-” : "

");

  Serial.print ("\r\n");
}

grazie dell'aiuto

se il nunchuck non è ariginale devi usare una stinga di inizializzazione diversa. cerca nunchuck farlocco e dovresti trovare tutto l'occorrente

wow sono riuscito a far andare arduino con il nunchuk!!:) ho un'ultima domanda da porre...non ho capito bene il significato di un stinga che dovrebbe dare i valori a un servo in base a ciò che viene letto dal nunchuk:

int pos = map(joy_x, 0, 255, 0, 90); servoX.write(pos);

qualcuno potrebbe spiegarmi bene cosa fa e come potrei mettere i valori che dico io al servo in proporzione della lettura della posizione? grazioe infinite

il joy_x da un valore, 0 se è inclinato da un lato 127 al centro e 255 se inclinato nell'altro lato. pos = map(joy_x, 0, 255, 0, 90) trasformail range 0-255 in 0-90

Dai un'occhiata qui per essere più sicuro e capire bene il funzionamento di questa funzione:

http://www.arduino.cc/en/Reference/Map

ciao,

Fabrizio.

grazie mille sono riuscito a risolvere il mio problema!:) ora il mio programma funziona come dovrebbe, solo che sono uno che vorrebbe fare le cose in grande! come potrei spedire i miei valori letti dal nunchuk e spedirli a un'altro arduino che li esegua tramite xbee??

allora nessuno??? io sono riuscuto a combinare qualcosa. del tipo che i valori vengono inviati all’xbee ma non vengono letti in maniera errata.
i codici che uso sono i seguenti:
per arduino con nunchuk:
#include <Wire.h>
#include “nunchuck_funcs.h”
#include <Servo.h>

int servoPin = 9;

int loop_cnt=0;

byte accx,accy,zbut,cbut,joy_x,joy_y;

Servo servoX;
void setPwmFrequency(int pin, int divisor)
{
byte mode;
if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 64: mode = 0x03; break;
case 256: mode = 0x04; break;
case 1024: mode = 0x05; break;
default: return;
}
if(pin == 5 || pin == 6) {
TCCR0B = TCCR0B & 0b11111000 | mode;
} else {
TCCR1B = TCCR1B & 0b11111000 | mode;
}
} else if(pin == 3 || pin == 11) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 32: mode = 0x03; break;
case 64: mode = 0x04; break;
case 128: mode = 0x05; break;
case 256: mode = 0x06; break;
case 1024: mode = 0x7; break;
default: return;
}
TCCR2B = TCCR2B & 0b11111000 | mode;
}
}

void setup()
{
Serial.begin(9600);
//nunchuck_setpowerpins();
pinMode(servoPin, OUTPUT);

nunchuck_init(); // send the initilization handshake

Serial.print(“WiiChuckDemo ready\n”);
servoX.attach(servoPin);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
setPwmFrequency(5, 4); //31250/3 = 10.416 Hz circa
setPwmFrequency(6, 4);
analogWrite(5,0);
analogWrite(6,0);
servoX.write(90);
}

void loop()
{
/*int pos;
for(pos = 0; pos < 100; pos += 1) // goes from 0 degrees to 180 degrees
{ // in steps of 1 degree
servoX.write(pos); // tell servo to go to position in variable ‘pos’
delay(15); // waits 15ms for the servo to reach the position
}
for(pos = 100; pos>=1; pos-=1) // goes from 180 degrees to 0 degrees
{
servoX.write(pos); // tell servo to go to position in variable ‘pos’
delay(15); // waits 15ms for the servo to reach the position
} */
if( loop_cnt > 100 )
{ // every 100 msecs get new data
loop_cnt = 0;

nunchuck_get_data();

accx = nunchuck_accelx(); // ranges from approx 70 - 182
accy = nunchuck_accely(); // ranges from approx 65 - 173
zbut = nunchuck_zbutton();
cbut = nunchuck_cbutton();
joy_x =nunchuck_joyx();
joy_y =nunchuck_joyy();
// Serial.print("accx: “);
Serial.println((byte)accx,DEC);
//Serial.print(”\taccy: “);
Serial.println((byte)accy,DEC);
//Serial.print(”\tzbut: “);
// Serial.print((byte)zbut,DEC);
// Serial.print(”\tcbut: “);
Serial.println((byte)cbut,DEC);
// Serial.print(”\tjoy_x: “);
Serial.println((byte)joy_x,DEC);
// Serial.print(”\tjoy_y: ");
Serial.println((byte)joy_y,DEC);

}
loop_cnt++;
delay(1);

}
invece l’arduino sulla macchinina ha il segiente codice:
#include <Servo.h>
int servoPin = 9;
Servo servoX;
int accyByte =0;
int accxByte =0;
int cbutByte =0;
int joy_yByte =0;
int joy_xByte =0;

#define accy
#define accx
#define cbut
#define joy_x
#define joy_y
void setPwmFrequency(int pin, int divisor)
{
byte mode;
if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 64: mode = 0x03; break;
case 256: mode = 0x04; break;
case 1024: mode = 0x05; break;
default: return;
}
if(pin == 5 || pin == 6) {
TCCR0B = TCCR0B & 0b11111000 | mode;
} else {
TCCR1B = TCCR1B & 0b11111000 | mode;
}
} else if(pin == 3 || pin == 11) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 32: mode = 0x03; break;
case 64: mode = 0x04; break;
case 128: mode = 0x05; break;
case 256: mode = 0x06; break;
case 1024: mode = 0x7; break;
default: return;
}
TCCR2B = TCCR2B & 0b11111000 | mode;
}
}
void setup()
{
Serial.begin(9600);
pinMode(servoPin, OUTPUT);
servoX.attach(servoPin);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
setPwmFrequency(5, 4); //31250/3 = 10.416 Hz circa
setPwmFrequency(6, 4);
analogWrite(5,0);
analogWrite(6,0);
servoX.write(90);
}
void loop()
{
// send data only when you receive data:

// read the incoming byte:

// say what you got:
//Serial.print("");
accxByte = Serial.read(accx);
accyByte = Serial.read(accy);
cbutByte = Serial.read(cbut);
joy_xByte =Serial.read(joy_x);
joy_yByte =Serial.read(joy_y);
Serial.print("accx: “); Serial.print((byte)accxByte,DEC);
Serial.print(”\taccy: “);Serial.print((byte)accyByte,DEC);
//Serial.print(”\tzbut: “);
// Serial.print((byte)zbut,DEC);
Serial.print(”\tcbut: “); Serial.println((byte)cbutByte,DEC);
Serial.print(”\tjoy_x: “); Serial.println((byte)joy_xByte,DEC);
Serial.print(”\tjoy_y: "); Serial.println((byte)joy_yByte,DEC);
// Serial.print(accxByte,BYTE);
// Serial.print(accyByte,BYTE);
//Serial.print(cbutByte,BYTE);
//Serial.print(joy_xByte,BYTE);
// Serial.print(joy_yByte,BYTE);
if(cbutByte ==1)
{
int pos = map(accxByte, 70, 200, 140, 40); // scale it to use it with the servo (value between 0 and 180)
servoX.write(pos);
if(accyByte<120)
{

analogWrite(5,80);
analogWrite(6,0);
}
else
if(accyByte>140)
{
analogWrite(5,0);
analogWrite(6,80);
}
if((accyByte>121)&&(accyByte<139))

{
digitalWrite(5,LOW);
digitalWrite(6,LOW);

}
}
else
if(cbutByte==0)
{
int pos = map(joy_xByte, 0, 255, 140,40); // scale it to use it with the servo (value between 0 and 180)
servoX.write(pos);
if(joy_yByte<120)
{
analogWrite(5,80);
analogWrite(6,0);
}
else
if(joy_yByte>140)
{
analogWrite(5,0);
analogWrite(6,80);
}
if((joy_yByte>120)&&(joy_yByte<140))

{
digitalWrite(5,LOW);
digitalWrite(6,LOW);
}
}

}