Lentezza segnali input nunchuck

Ciao a tutti!
Sono nuovo del forum, ho comprato da un mesetto Arduino e devo dire che mi ha aperto un mondo!
Non sapevo nulla (e tutt'ora ne so pochissimo) di elettronica, ma mi ha dato la spinta per interessarmi a fondo dell'argomento e iniziare
a divertirmi :slight_smile:
Sono riuscito a mettere in piedi un piccolo rover casalingo, prima facendo alcune prove con sensori e facendolo girare per la stanza autonomamente,
e fin qui tutto ok!
Il passo successivo è stato comprare un adattatore per nunchuck da collegare ad arduino....ho trovato del codice in internet per ricevere il segnale
e sembra funzionare... l'unico problema è che l'input dal nunchuck (avanti, indietro, ruota e vai avanti ecc..) viene eseguito con un leggero ritardo, e a volte
addirittura inizia a fare ciò vuole, va avanti da solo o cose così...mentre altre volte risponde agli input.
Come ho scritto prima, ho preso il codice che gestisce il segnale del nunchuck da un esempio di un ragazzo su internet, e l'ho riadattato per le mie
esigenze, quindi sicuramente può essere che ho scritto del codice "sporco" che non sempre riesce ad essere eseguito in maniera corretta.

Vi posto il codice, così se per cortesia potreste dirmi dove "sbaglio", o se avete qualche consiglio da darmi, mi fareste un enorme favore!!

Grazie ciao a tutti :smiley:

#include <Servo.h>
#include <Wire.h>
int zero = 0;
** Servo servoSensori;**
** Servo servoDirezionale;**
** uint8_t buf[6]; **
** int cnt=0; **
** int readcnt=0; **
** int ledPin=13; **
** int motore1a = 2;**
** int motore1b = 3;**
** int motore2a = 4;**
** int motore2b = 5;**

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()
{

** pinMode(motore1a, OUTPUT); //motore 1**
** pinMode(motore1b, OUTPUT);**

** pinMode(motore2a, OUTPUT); // motore 2**
** pinMode(motore2b, OUTPUT);**

** servoSensori.attach(8); // attaches the servo on pin 9 to the servo object**
** servoDirezionale.attach(7); // attaches the servo on pin 9 to the servo object**

** 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()
{
__ /--------------SERVO SENSORI---------------------------------------------------------/ /__
** servoSensori.write(86); //CENTRO **
** delay(300); **
** servoSensori.write(100); //DESTRA POCO **
** delay(300); **
** servoSensori.write(130); //DESTRA **
** delay(300); **
** servoSensori.write(86); //CENTRO **
** delay(300); **
** servoSensori.write(55); //SINISTRA POCO **
** delay(300);**
** servoSensori.write(30); //SINISTRA **
** delay(300);**
__
/__
__ /-----------------------------NUNCHUCK-------------------------------------------------------------------/__
** 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(300); // wait 800msec before next loop**
** }**
** }**
** void printdata() // print out the values**
** {**
** int n; // note: the 123,131,524,597... depend on my Nunchuck calibration**

__ /------------DIREZIONE ROVER-----------------------------------------------------------------------/__
** //CENTRO**
** if((int)buf[0]-123 == 5 && (int)buf[1]-131 == -3)**
** {**
** Serial.println("centro");**
** servoDirezionale.write(42); //centro**
** //STOP MOTORI**
** digitalWrite(motore1a, LOW);**
** digitalWrite(motore2a, LOW);**
** digitalWrite(motore1b, LOW);**
** digitalWrite(motore2b, LOW);**
** delay(100);**
** }**

** //DESTRA AVANTI**
** if((int)buf[0]-123 == 132 && (int)buf[1]-131 == 124)**
** {**
** Serial.println("destra avanti");**
** servoDirezionale.write(20);**
** //STOP INDIETRO**
** digitalWrite(motore1b, LOW);**
** digitalWrite(motore2b, LOW);**

** //GO AVANTI**
** digitalWrite(motore1a, HIGH);**
** digitalWrite(motore2a, HIGH);**
** delay(100);**
** }**

** //DESTRA INDIETRO**
** if((int)buf[0]-123 == 132 && (int)buf[1]-131 == -131)**
** {**
** Serial.println("destra indietro");**
** servoDirezionale.write(20);**
** digitalWrite(motore1a, LOW);**
** digitalWrite(motore2a, LOW); **

** //go indietro**
** digitalWrite(motore1b, HIGH);**
** digitalWrite(motore2b, HIGH);**
** delay(100);**

** }**

** //SINISTRA AVANTI**
** if((int)buf[0]-123 == -123 && (int)buf[1]-131 == 124)**
** {**
** Serial.println("sinistra avanti");**
** servoDirezionale.write(60);**
** //STOP INDIETRO**
** digitalWrite(motore1b, LOW);**
** digitalWrite(motore2b, LOW);**

** //GO AVANTI**
** digitalWrite(motore1a, HIGH);**
** digitalWrite(motore2a, HIGH);**
** delay(100);**
** }**

** //SINISTRA INDIETRO**
** if((int)buf[0]-123 == -123 && (int)buf[1]-131 == -131)**
** {**
** Serial.println("sinistra indietro");**
** servoDirezionale.write(60);**
** //STOP AVANTI**
** digitalWrite(motore1a, LOW);**
** digitalWrite(motore2a, LOW); **

** //go indietro**
** digitalWrite(motore1b, HIGH);**
** digitalWrite(motore2b, HIGH);**
** delay(100);**
** }**
__ /------------DIREZIONE VELOCITA'-----------------------------------------------------------------------/__
** //AVANTI**
** if((int)buf[0]-123 == 5 && (int)buf[1]-131 == 124)**
** {**
** Serial.println("avanti");**
** //STOP INDIETRO**
** digitalWrite(motore1b, LOW);**
** digitalWrite(motore2b, LOW);**

** //GO AVANTI**
** digitalWrite(motore1a, HIGH);**
** digitalWrite(motore2a, HIGH);**
** delay(100);**
** }**

** //INDIETRO**
** if((int)buf[0]-123 == 5 && (int)buf[1]-131 == -131)**
** {**
** //stop avanti**
** Serial.println("indietro");**
** digitalWrite(motore1a, LOW);**
** digitalWrite(motore2a, LOW); **

** //go indietro**
** digitalWrite(motore1b, HIGH);**
** digitalWrite(motore2b, HIGH);**
** delay(100);**
** }**
}

http://www.arduino.cc/playground/Main/WiiChuckClass

prendi il primo testo e crea un file .h(libreria)

e usa il codice di esempio per capire come funziona.

così renderari il codice più leggibile, anche in vista di aggiute al rover :wink: ,oltre al fatto che è molto comoda e funziona egregiamente.

prova e facci sepere se è anche lento con questo codice.

ciao

Grazie mille! appena torno a casa stasera provo e vi faccio sapere :smiley:

Salve gente! Pure io sono nuovo del mondo di arduino (ho un 2009), per ora ho costruito solo un piccolo carrellino che gira per casa cambiando direzione quando tocca un ostacolo, ora lo vorrei migliorare sfruttando proprio un nunchuck e un adattatore acquistato on line.
Avrei un paio di domande da fare a riguardo però: l'adattatore occupa gli analog in 2 3 4 e 5, 4 e 5 per la comunicazione i2c mentre 1 e 2 dovrebbero andare rispettivamente a GND e 5V. On line ho trovato una libreria (che però non riesco ad usare) che a quanto ho capito provvede anche ad alimentare il nunchuck tramite le porte 1 e 2, sapete per caso se lo fa anche la libreria menzionata qui sopra?

Ottimo garinus!! Ho importato la libreria e sto "giocando" con l'input dell'arduino....sembra ricevere il segnale in maniera corretta!!
Stasera provo ad applicare il mio codice per muovere il rover e poi vedremo l'esito :slight_smile:

@Deca86it : applica nelle porte 1 e 2 analogiche i cavetti di input del nunchuck, come da te supposto :wink:

Ci si aggiorna!

Deca86it:
Avrei un paio di domande da fare a riguardo però: l'adattatore occupa gli analog in 2 3 4 e 5, 4 e 5 per la comunicazione i2c mentre 1 e 2 dovrebbero andare rispettivamente a GND e 5V.

Attenzione che il Nunchuk DEVE essere alimentato a 3.3 Volt, se lo alimenti a 5V lo danneggi.
Collega i contatti per l'alimentazione con GND e 3.3V presi dal connettore per le alimentazioni di Arduino.
La corrente richiesta dal Nunchuk è meno di 30 mA, quindi compatibile anche per le versioni 2009 di Arduino dove tale tensione è fornita dal FTDI con una limitata capacità di fornire corrente.
Tutti i siti dove dicono che si può collegare il Nunchuk al +5V dicono cavolate, anzi per fare le cose fatte bene sarebbe meglio usare, per SDA e SCL, due resistenze di pull up esterne, invece di quelle interne, da 3.3k collegate al 3.3V

@garinus: Provato e funziona alla grande!! Risponde in maniera velocissima all'input (gli ho messo 20ms)
E' tutta un'altra cosa ora!Magari appena ultimerò il rover posterò una foto per condivisione :slight_smile:

Grazie ancora e buona continuazione XD

Interessante, mi ha incuriosito :wink: Aspettiamo le foto allora :slight_smile:

Chiedo scusa, ho buttato lì un "5V" molto a caso, avevo già letto che si alimenta a 3,3V, quindi in teoria se la libreria si occupa anche di questo, presumo lo faccia in modo corretto.
Ho usato le parole "se" e "presumo" di proposito, infatti ho appena effettuato qualche prova, aggiunta la libreria ho caricato lo sketch. Il monitor restituisce valori sempre uguali a nunchuck staccato, appena lo collego, il monitor cessa di restituire valori ma non appare alcun errore. Il tester inoltre non rileva i 3,3V.. Avete qualche spiegazione? Non accade nulla vero se lo alimento direttamente dall'apposita porta?

Deca86it:
Chiedo scusa, ho buttato lì un "5V" molto a caso, avevo già letto che si alimenta a 3,3V, quindi in teoria se la libreria si occupa anche di questo, presumo lo faccia in modo corretto.

La libreria non può in nessun modo controllare la tensione di alimentazione, questa la devi prendere dal relativo connettore di Arduino.

winz84:
Ottimo garinus!! Ho importato la libreria e sto "giocando" con l'input dell'arduino....sembra ricevere il segnale in maniera corretta!!
Stasera provo ad applicare il mio codice per muovere il rover e poi vedremo l'esito :slight_smile:

@Deca86it : applica nelle porte 1 e 2 analogiche i cavetti di input del nunchuck, come da te supposto :wink:

Ci si aggiorna!

Cioè è possibile alimentare il nunchuck dalle porte "analog in" 1 e 2?
Chiedo scusa per la ripetizione, ma qualcuno dice di si, qualcuno di no... Per quel poco che ci capisco io mi viene da pensare che impostando su "HIGH" una porta si ottiene una tensione positiva, con analogwrite la si potrà anche regolare tipo pwm immagino...
Però in effetti la suddetta libreria non sembra farlo...

P.S.: per la cronaca ho sbagliato le porte utilizzate dall'adattatore, in realtà sono le porte 2, 3, 4, e 5.

Cioè è possibile alimentare il nunchuck dalle porte "analog in" 1 e 2?

No scusa mi sono espresso male io.. l'alimentazione la ricavi dall'uscita da 3,3V di Arduino (vi colleghi carica positiva e terra), mentre nelle porte A1 e A2 io ci ho collegato il Data e Clk ...
calcola che è un mesetto che mi destreggio nell'elettronica, quindi non so esattamente a cosa equivalgono devo ancora informarmi, per ora sono troppo preso nel mettere in pratica :smiley: però le scritte sui pin dell'adattatore del nunchuck sono quelle!
Questo è quello che so, onde evitare casini però ti rimando ad una risposta di qualcuno che ne sa sicuramente più di me :wink:

Per il resto ecco qualche foto del mio rover in costruzione!
E' molto semplice essendo il primo è più una piattaforma di esperimenti che un rover eheheh
In futuro vorrei usarlo per sperimentare anche la connessione via wireless (per il nunchuck) e l'applicazione di un pannello solare per l'energia dei futuri led che vi applicherò (non spero di alimentare con il solare i motori visto il consumo di questi ultimi XD )

Buona serata a tutti


Prima prova di "montaggio"


Stesura colore nero


Stesura colore nero

Deca86it:
Cioè è possibile alimentare il nunchuck dalle porte "analog in" 1 e 2?
Chiedo scusa per la ripetizione, ma qualcuno dice di si, qualcuno di no

Cosa non ti è chiaro del fatto che il Nunchuk funziona a 3.3V e non deve essere alimentato a 5V ?
Un GPIO dell'ATmega non è una presa di alimentazione e non deve essere usato come tale.

... Per quel poco che ci capisco io mi viene da pensare che impostando su "HIGH" una porta si ottiene una tensione positiva

No, ottieni un livello logico alto che non è la stessa cosa di una tensione di alimentazione.

, con analogwrite la si potrà anche regolare tipo pwm immagino...

analogwrite si applica solo ai pin che possono funzionare come uscite pwm, e non sono tra quelli utilizzabili come ingressi analogici, inoltre non è una tensione variabile visto che si tratta di un'onda rettangolare con duty cycle variabile.
Ovviamente partendo dal pwm e utilizzando un filtro passa basso e un opamp si può ottenere una vera tensione variabile, ma è una complicazione inutile in questo caso visto che i 3.3V sono già disponibili sul connettore delle alimentazioni di Arduino.

Tutto chiarissimo grazie! Non avevo pensato la fatto che in effetti le pwm si trovano da tutt'altra parte, e in effetti è inutile complicarsi la vita! Solo mi rimane l'atroce dubbio di come, in alcuni video sul tubo, riescano ad utilizzare il nunchuck utilizzando solo ed esclusivamente l'adattatore che ho io, che è connesso solo alle porte già menzionate. Comunque non voglio indagare oltre per ora, collegherò i 3,3V forniti da arduino all'adattatore e inizierò a fare le mie prove! Mi conviene tagliare i piedini che vanno alle porte non utilizzate onde evitare di fare danni coi 3,3V?

Complimenti per il rover comunque! Vediamo se riesco a linkare la foto del mio...

Imgur

Finalmente sono riuscito a collegare il nunchuck e a leggere sul monitor i valori restituiti. Cercando di individuare i valori che mi serviranno ho notato una comportamento piuttosto anomalo sulla rilevazione delle rotazioni effettuate sull'asse z (credo sia z quello "perpendicolare al terreno"...). I valori cioè non sembrano per niente precisi e diventano ancor meno precisi quando il nunchuck è leggermente inclinato su uno degli altri assi. Qualcuno saprebbe spiegarmi quali potrebbero essere i motivi?

(Per la cronaca durante le prove ho considerato come normale la posizione di utilizzo con la console: cioè con lo stelo del joystick perpendicolare al terreno...)

Io non saprei proprio, ti rimando alla maggiore esperienza di qualcun'altro!!
E comunque complimenti anche a te per il rover :wink: bello vedere come ogni "robot" o altro siano sempre
molto diversi l'uno dall'altro... buona continuazione!!

il nunchuck è in piano quando appoggi la borad perperndicolare alla gravità, ovvero parallelo al terreno.se non parti da questo riferimento, e non spieghi a che inclinazione (e in che direzione) trovi questo errore è difficile capire cosa possa essere.

Re: Lentezza segnali input nunchuck
« Reply #8 on: May 20, 2011, 08:27:40 PM »
Bigger Smaller Reset Quote
Chiedo scusa, ho buttato lì un "5V" molto a caso, avevo già letto che si alimenta a 3,3V, quindi in teoria se la libreria si occupa anche di questo, presumo lo faccia in modo corretto.
Ho usato le parole "se" e "presumo" di proposito, infatti ho appena effettuato qualche prova, aggiunta la libreria ho caricato lo sketch. Il monitor restituisce valori sempre uguali a nunchuck staccato, appena lo collego, il monitor cessa di restituire valori ma non appare alcun errore. Il tester inoltre non rileva i 3,3V.. Avete qualche spiegazione? Non accade nulla vero se lo alimento direttamente dall'apposita porta?

Ragazzi per favore aiutatemi ho lo stesso problema ke è stato citato sopra... appena collego il pin 4 analogico (cioè appena collego il nunchack ) si interrompe il processo! come posso risolvere come avete risolto voi il problema? ve ne sarò molto grato! :smiley:

i sensorti li puoi alimentare tranquillamente a 5V, magari diminuisci un poco la loro vita ma funzionano bene lo stesso (provato in prima persona)

I sensori i2c non li puoi collegare "a caldo" perchè hanno bisogno di particolari procedure di inizializzazione. Quindi quando attacchi devi resettare arduino. a me capita alle volte che il nun si blocchi all'inizializzazione: in quel caso basta togliere l'alimentazione ad arduino (e quindi anche al sensore) che tutto torna a funzionare tranquillamente. Consiglio di accendere op spegnere un led subito dopo l'inizializzazione, così vedi subito se tutto è andato a buon fine.

lesto:
i sensorti li puoi alimentare tranquillamente a 5V, magari diminuisci un poco la loro vita ma funzionano bene lo stesso (provato in prima persona)

Evitiamo di dare simili consigli, se un dispositivo è da 3.3 Volt DEVE essere alimentato a 3.3V, non esiste il discorso dura di meno o scalda di più, semplicemente si rompe, lo può fare in pochi secondi o metterci qualche ora, ma il risultato finale non cambia.