in qualsiasi posizione sia orientato il nunchuck(beh tutto questo vale per qualsiasi accelerometro), da fermo la G=sqrt(x^2+y^2+z^2) dovrebbe essere SEMPRE UGUALE, ovvio che da X, Y e Z devo sottrarre il valore che equivale a 0G, cosa che mi pare tu non faccia.
per chiarirmi meglio: se il sensore è settato per leggere al massimo 2G, e la sua precisione è 10bit (da 0 a 1024):
-2G equivale a 0
0G equivale a 512
+2G equivale a 1024
però questo da per scontatati che la X Y e Z leggano lo stesso valore per la stessa G, cosa non vera nell'imperfetto mondo reale.
Partiamo dal fatto che prima di tutto devi trovare lo 0G la 1G, si fa così:
asse Z verso il basso: z=0G+1G, x=0G e y=0G
asse X verso il basso: z=0G, x=0G+1G e y=0G
asse Y verso il basso: z=0G, x=0G e y=0G+1G
come potrai vedere, per piccoli errori del tenere il sensore perfettamente dritto, gli 0G non saranno perfettamente uguali, io ho usato il valore di mezzo
A questo punto sottrai al valore 0G+1G di ogni asse il corrispettivo valore 0G, ed ottieni il valore di 1G.
Se ottieni valori di -1G vuol dire semplicemente che hai tenuto il sensore con l'asse al contrario, nulla di preoccupante.
I valori non saranno tutti uguiali ma simili, mi pare che la Z discosti un po' essendo su un chip a parte.
ora, ogni lettura del nunchuck fai:
/*togli i valori di 0G, e rendi lineari tra loro i valori di x, y, e z, se no rovinano il calcolo*/
x=map(x, G0x, G1x, 0, 10000);
y=map(y, G0y, G1y, 0, 10000);
z=map(z, G0z, G1z, 0, 10000);
G=sqrt(x*x+y*y+z*z);
ora, se tieni il nunchuck FERMO in QUALSIASI posizione, dovresti leggere sempre una G di 10000(puoi cambiare il 10000 in qualsiasi altro numero)