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
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!