Nunchuck arduino

Oggi ho acquistato il nunchuck per completare la realizzazione del progetto sviluppato insieme a voi.
Premetto che il nunchuck non é originale della Nintendo.
L' ho collegato come descritto, ma sembra non funzionare. Su i pin di arduino che controllano i servomotori c'é una tensione fissa di 0,6V che non varia nonostante il movimento del controller.
Ho provato a mettere una resistenza da 1,5K su i 3,3 V di alimentazione, ma sembra non cambiare nulla.
Cosa dovrei fare?

Cosa dovrei fare?
mandaci il link al codice e allo schema o mandaceli.

Modifica il programma e invia i dati che vengono dal nunchuck tramite la seriale al terminale del IDE. Cosí vedi cosa leggi dalla nunchuck.

Ciao Uwe

Nun_Servo.pde

/*
Servo Controller basato sul Nunchuk
 (c) 2011 By MdA Project 
 
 v1.0.0, build 30.07.2011
 
 */

/*
 Collegamenti Nunchuk
 _________
 | 1 2 3 |
 |       |
 | 6 5 4 |
 |_-----_|
 
 •pin 1: verde - data (Arduino analog pin 4) 
 •pin 2: (not connected) 
 •pin 3: rosso - 3.3V 
 •pin 4: giallo - clock (Arduino analog pin 5) 
 •pin 5: (not connected) 
 •pin 6: bianco - GND
 
 Il nunchuk originale Nintendo incorpora delle resistenze di pullup I2C da circa 1.8k.
 Se utilizzate un Nunchuk non Nintendo verificate la presenza dei 3.3V su SDA e SCL
 ed eventualmente aggiungere due resistenze di pull up, collegate al 3.3V, 
 con un valore compreso tra 1.5k e 3.3k
 */

/*
 NOTE GENERALI
 
 a) Non è garantito il corretto funzionamento con Nunchuk non originali.
 
 b) In questa versione non è presente una routine per la calibrazione del Joystick
 e dell'accelerometro.
 Tutti i calcoli sono eseguiti sulla base dei valori medi forniti dai
 sensori pertanto sia il punto centrale che i punti estremi possono differire
 sensibilmente da quanto atteso e in modo diverso con diversi Nunchuk.
 La calibrazione verrà aggiunta nelle future release.
 
 c) Nella funzione "nun_read()" sono contenute delle serial.print() commentate, vanno
 utlizzate, decommetandole, solo a scopo diagnostico per verificare il corretto
 funzionamento del Nunchuk, visualizzano tutti i valori letti sul monitor seriale.
 
 d) Nella prossima release verrà aggiunto il controllo tramite seriale con protocollo
 dedicato e una GUI per pc (in futuro anche per Android) che permetterà di muovere
 i servi tramite cursori e/o joystik collegato al pc.
 
 */

#include <Wire.h>      // include per I2C
#include <Servo.h>     // include per i Servo

// creazione degli oggetti servo
Servo servo1;
Servo servo2;
Servo servo3;
Servo servo4;
Servo servo5;
Servo servo6;
Servo servo7;
Servo servo8;

int pos = 1500;              // posizione servo
char Led_stat = 0;
//uint8_t nun_buf[6];  
unsigned char nun_buf[6];    // buffer dati in arrivo dal nunchuck,  

unsigned char z_but = 0;
unsigned char c_but = 0;
unsigned char joy_x_axis;
unsigned char joy_y_axis;
int accel_x_axis; 
int accel_y_axis;
int accel_z_axis;

void setup() 
{ 
  pinMode(13, OUTPUT);
  Serial.begin(115200);      // per uso futuro della seriale
  nunchuck_init();           // inizializza il nunchuck

  // attaches servo ai pin 3-10 
  servo1.attach(3);    
  servo2.attach(4);
  servo3.attach(5);
  servo4.attach(6);
  servo5.attach(7);
  servo6.attach(8);
  servo7.attach(9);
  servo8.attach(10);
} 

void loop() 
{ 
  Led_stat ^=1;                  // inverte il valore di Led_stat
  digitalWrite(13, Led_stat);    // lampeggio led
  nun_get();
  nun_read(); 

  if (z_but & c_but)
  {
    pos = 800 + joy_x_axis * 6; 
    servo1.writeMicroseconds(pos);
    pos = 800 + joy_y_axis * 6;
    servo2.writeMicroseconds(pos);
  }

  if (z_but & !c_but)
  {
    pos = 800 + joy_x_axis * 6; 
    servo3.writeMicroseconds(pos);
    pos = 800 + joy_y_axis * 6;
    servo4.writeMicroseconds(pos);
  }

  if (!z_but & c_but)
  {
    pos = 800 + joy_x_axis * 6; 
    servo5.writeMicroseconds(pos);
    pos = 800 + joy_y_axis * 8;
    servo6.writeMicroseconds(pos);
  }

  if (!z_but & !c_but)
  {
    pos = 500 + accel_x_axis * 2 ; 
    servo1.writeMicroseconds(pos);
    pos = 500 + accel_y_axis * 2;
    servo2.writeMicroseconds(pos);
  }

  pos = 500 + accel_x_axis * 2 ; 
  servo7.writeMicroseconds(pos);
  pos = 500 + accel_y_axis * 2 ; 
  servo8.writeMicroseconds(pos);
  delay(50); 
}

Nun_Func.pde

void nunchuck_init()
{ 
  Wire.begin();                    
  Wire.beginTransmission(0x52);
  Wire.send(0x40); 
  Wire.send(0x00); 
  Wire.endTransmission();
}

void nunchuck_send_request()
{
  Wire.beginTransmission(0x52); 
  Wire.send(0x00);
  Wire.endTransmission();
}

int nun_get()
{
  int cnt=0;
  Wire.requestFrom (0x52, 6);   
  while (Wire.available ())
  {
    nun_buf[cnt] = nun_decode(Wire.receive());
    cnt++;
  }
  nunchuck_send_request();  

  if (cnt >= 5) {
    return 1;  //restituisce 1 se fallisce
  }
  return 0; //restituisce 0 se i dati sono stati ricevuti in maniera corretta
}

// decodifica valori nunchuck
char nun_decode (char x)
{
  x = (x ^ 0x17) + 0x17;
  return x;
}

void nun_read()
{ 
  joy_x_axis   = nun_buf[0];
  joy_y_axis   = nun_buf[1];
  accel_x_axis = nun_buf[2] << 2; 
  accel_y_axis = nun_buf[3] << 2;
  accel_z_axis = nun_buf[4] << 2;
  z_but = 0;
  c_but = 0;

  if ((nun_buf[5] >> 0) & 1) z_but = 1;
  if ((nun_buf[5] >> 1) & 1) c_but = 1;

  if ((nun_buf[5] >> 2) & 1) accel_x_axis += 1;
  if ((nun_buf[5] >> 3) & 1) accel_x_axis += 2;

  if ((nun_buf[5] >> 4) & 1) accel_y_axis += 1;
  if ((nun_buf[5] >> 5) & 1) accel_y_axis += 2;

  if ((nun_buf[5] >> 6) & 1) accel_z_axis += 1;
  if ((nun_buf[5] >> 7) & 1) accel_z_axis += 2;

  // da decommentare solo per verifica corretto funzionamento Nunchuk
/*
  Serial.print(accel_x_axis, DEC);
  Serial.print(",");
  Serial.print(accel_y_axis, DEC);
  Serial.print(",");
  Serial.print(accel_z_axis, DEC);
  Serial.print(",");
  Serial.print(joy_x_axis,DEC);
  Serial.print(",");
  Serial.print(joy_y_axis, DEC);
  Serial.print(",");
  Serial.print(z_but, DEC);
  Serial.print(",");
  Serial.println(c_but, DEC);
*/
}

il codice è questo. Provando ad inviare i dati tramite seriale su serial monitor mi escono 6 valori che sono sempre gli stessi.

Provo e riprovo, ma non cambia nulla. Ho anche provato a mettere una resistenza da 3k ma non cambia nulla.

Ho controllato e su sda ed scl arrivano i 3,3v

Ho appena fatto una prova dello sketch con un nunchuk non originale e funziona (non ho montato i servo). L'unica cosa che mi sono premurato di fare è stato l'inserimento di un traslatore di livello (http://www.robot-italy.com/product_info.php?cPath=52_71&products_id=2276) sui segnali SDA e SCL per non avere brutte sorprese con i livelli logici 0-5V che escono da arduino.
Se non hai sbagliato le connessioni può essere che il tuo nunchuk non funzioni proprio :frowning:

Ciao
QP

@quercuspetraea , ciao anch'io vorrei sperimentare con il nunchuk , credi sia meglio comprare l'originale o quello tarocco? Ho letto su alcune guide che utilizzavano il nunchuk a 5v puó essere ? Se lo uso a 3.3 v senza traslatorie di livello dà problemi ?
Ciao Niko

nikone:
@quercuspetraea , ciao anch'io vorrei sperimentare con il nunchuk , credi sia meglio comprare l'originale o quello tarocco? Ho letto su alcune guide che utilizzavano il nunchuk a 5v puó essere ? Se lo uso a 3.3 v senza traslatorie di livello dà problemi ?

Io ne ho preso uno tarocco e fortunatamente funziona (prima di acquistarlo ho fatto un gesto apotropaico toccandomi gli attributi XD). In quanto ad alimentarlo con 5V non se ne parla; va alimentato a 3,3V e se si vuole che duri è consigliabile adeguare i livelli logici di SDA e SCL con un traslatore.

Ciao
QP

va alimentato a 3,3V e se si vuole che duri è consigliabile adeguare i livelli logici di SDA e SCL con un traslatore.

Ok , intendi dire che potrebbe danneggiarsi o che non é detto che vada ?
Comunque la mia duemila ove modificata puó cambiare tensione di lavoro della mcu da5v a 3.3 v percui in teoria non avrei bisogno del traslatore
Ciao Niko

Ok , intendi dire che potrebbe danneggiarsi o che non é detto che vada ?

Intendo che può danneggiarsi.

Comunque la mia duemila ove modificata puó cambiare tensione di lavoro della mcu da5v a 3.3 v percui in teoria non avrei bisogno del traslatore

Se fai andare tutto a 3,3V sei chiaramente a posto.

Ciao
QP

Se fai andare tutto a 3,3V sei chiaramente a posto.

Ok , solo che poi qualsiasi altra cosa funzionante a 5v non risulterà poi compatibile :~
Hai per caso sottomano un semplice schema di un convertitore di livello ?
Ciao Niko

Ciao , ho trovato un vecchio topic , leggi l'ultimo reply di astro
http://arduino.cc/forum/index.php/topic,58095.20
Sembra che non serva il convertitore, adesso compro il nunchuk e ti dico
Ciao Niko

Hai per caso sottomano un semplice schema di un convertitore di livello ?

Questo potrebbe andare bene http://www.sparkfun.com/datasheets/BreakoutBoards/Level-Converter-v10.pdf

Sembra che non serva il convertitore, adesso compro il nunchuk e ti dico

Mi fido di Astro e delle sue misure ma il chip, che è della serie LIS3L02 di STM, da come caratteritiche elettriche VDD min. 2,4V e max 3,6. Io per prudenza adatto i livelli e non ci penso più.

Ciao
QP

Ciao rileggendo il post Che avevo linkato ho trovato la seguente citazione di astro

Se devi usare solo dispositivi I2C a 3.3V non ti serve nessun traslatore di livello, colleghi direttamente SDA e SCL alle rispettive linee di Arduino e le due pullup, rigorosamente da 1.5k, le colleghi al +3.3V.
Le linee I2C sono del tipo open drain il che permette di usare diversi livelli di tensioni, purché nel range ammesso, a piacere.

E questa

No, Arduino lo alimenti regolarmente a 5V, quello che cambia è la tensione per l'uno logico del bus I2C che viene determinata dalle resistenze di pull up, se le colleghi a 3.3 V e usi solo device I2C che lavorano con questa tensione non ti serve nessun traslatore di livello

L'unica pecca é che senza traslatore sul bus ci potrebbero essere solo dispositivi A 3.3v , o almeno così sembra , proveró (la scienza è fatta di errori)
Ciao e grazie

nikone:
L'unica pecca é che senza traslatore sul bus ci potrebbero essere solo dispositivi A 3.3v , o almeno così sembra , proveró (la scienza è fatta di errori)

Si senza un traslatore di livelli puoi collegare solo device con SDA e SCL a 3.3V, però dato questo valore di tensione riguarda solo le suddette linee in realtà nulla vieta di collegare anche device alimentati a 5V, come lo è Arduino, però possono saltare fuori problemi legati al valore minimo ammesso per l'uno logico che potrebbero rendere molto critica la lettura del bus da parte dei device a 5V.

Ok grazie astro , se volessi creare un traslatore potrei usare un circuito come questo per la sd
http://www.google.it/search?um=1&hl=it&safe=off&client=safari&tbo=d&biw=768&bih=928&tbm=isch&sa=1&q=arduino+e+sd+schematic&oq=arduino+e+sd+schematic&aq=f&aqi=&aql=&gs_sm=3&gs_upl=18019l20925l0l21199l10l10l0l5l0l0l284l284l2-1l1l0 ?
Ciao Niko

Quindi, visto che al serial monitor leggo dei valori fissi, il problema sta nel 3,3V di SCA e SDL e teoricamente dovrei risolvere il problema inserendo un traslatore di livello (come questo http://www.robot-italy.com/product_info.php?cPath=52_71&products_id=2276) sui segnali SDA e SCL.
Secondo voi é questo il mio problema?

Dipende ma se rileggi bene questa discussione abbiamo parlato appunto del fatto che un traslatore di livello potrebbe non essere necessario

nikone:
Dipende ma se rileggi bene questa discussione abbiamo parlato appunto del fatto che un traslatore di livello potrebbe non essere necessario

Gli AVR non hanno alcun problema a leggere l'I2C a 3.3V, il problema è solo per eventuali device a 5V collegati sul bus I2C a 3.3V, in questo caso è consigliabile usare un traslatore di livelli per isolare il lato 5V da quello 3.3V.
Il Nunchuk funziona senza problemi sul AVR senza usare un traslatore di livelli.

É proprio questo il problema, sembra che tutto stia a posto ma in realtà non funziona. Quando collego il nunchuck, al serial monitor vedo 6 valori che scorrono mantenendosi sempre uguali; se scollego il controller i valori non scorrono più. Su arduino invece su i pin adibiti al controllo dei servomotori c' é una tensione fissa di 0,6V che non cambia nonostante il movimento del controller.
Il codice é ok, e poi ho collegato tutto come nelle note del codice.
Quindi quale potrebbe essere il problema? Non é che ci sono problemi con il nunchuck visto che non é originale? Purtroppo non so proprio cosa fare!