nunchuk su arduino e valori convertiti in G

ieri ho comoparato un nunchuk della wii , dopo averlo apero e collegato ad arduino ho cercato su internet un po di programmi di esempio, funziona tutto ma vorrei sapere come convertire i valori numerici che ottengo nella console seriale in valore di forza G pero in seguito vorrei collegare ad arduino un display 16*2 dove visualizzare questi valori

io avevo pensato ad una proporzione pero non so' se è il metodo esatto perche non so se la lattura viene data iin modo lineare o magari aumentndo la forza g il valore cresce in modo non lineare

in fine vorrei sapere il valore massimo che l'accelerometro riesce a leggere perche non ho trtovato nessun datasheet di questo accelerometro ma solo dialtri modelli simili

:slight_smile: :)grazie a tutti :slight_smile: :slight_smile:

mi pare 2g fondoscala
dovrebbe essere lineare la trasformazione
per il mio progetto(simile) ho fatto così...

a quoindi ok faccio solo la proporzione ti ringrazio

visto che anche tu hai armeggiato cn queesti tipi di eccelerometri ti vorrei porre una domanda: ;D

il valore della forza viene restituito in un valore numerico che varia da 0 a 1024 ?

quindi se è cosi a 512 avrei 0G a 512+512/2=768 1G e a 1024 2G se è cosi allora tutto dovrebbe funzionare a dovere perche tendo l'accelerometro parallelo al pavimento mi da 508 per l'asse x 518 per l'asse y e + o - 700 per l'asse Z

pero adesso mi viene un dubbio :-/ (magari stupidissimo)
per effettuare la proporzione devo fare

asse X
512:0=lettura:(valore in g equivalente)

quinid per ottenere il valore in G devo fare (medio* medio)/estremo

(0*lettura)/512 e qui che mi insorge il dubbio :-/ io avro sempre un valore 0 come risulato
facendo questo calcolo

o sbaglio io qualcosa :cry:

grazie per le eventuali risposte e per la tua attenzione o di qualsiasi altro utente :slight_smile: :slight_smile:

dubbio risolto tuto funziona ora vorrei solo sistemare meglio il codice visto che adesso vorrei mettere altre 2 o 3 funzioni tutte comandate dalla schedina contenuta nel nunchuk

registrare il valore massimo e minimo della forza g e mostrali quando premo un pulsante del nunchuk

azzerare il minimo e il massimo alla pressione del secondo pulsante

poi ho sempre libero lo stick analogico con il quale potrei implementere altre cose

pero adeso vi chiedo se è possibile scrive in una sola istruzione lcd.print()+ parametri nella stessa funzione faccio un esempio:

lcd.print("MY= ");
lcd.print(maxy);

con queste 2 istruzioni quando premo il pulsante mostro sul display il valore nmassimo della forza g da quando è stato acceso l'arduino.
pero non vorrei usare 2 istruzioni per fare quasta azione ma vorrei usarne una sola ho porvato a fare
lcd.print("MY= ",maxy);
o
lcd.print("MY= "+maxy);

ma in entrambi i casi mi da sempre errore quindi vorrei sapere se esiste un modo per compattare tutto

grazie per la pazienza

ciao pdor90,

posso chiederti quale libreria hai utilizzato per la lettura dei dati del nunchuk? Io ho provato vari esempi trovati in rete

http://www.windmeadow.com/node/42
http://www.alfonsomartone.itb.it/rkxncv.html
http://todbot.com/blog/2008/02/18/wiichuck-wii-nunchuck-adapter-available/

Purtroppo, con tutte ho lo stesso problema: la libreria compila correttamente e se la carico su arduino mi mostra tutti i valori zero, ma se collego il nunchuk e faccio il reset, si interrompe e non fa nemmeno il setup. Ho verificato i collegamenti, e il mio nunchuck pare funzionare bene (provato su wii).

Spero di ricevere qualche suggerimento.

ecco il codice che ho usato :

#include <LiquidCrystal.h>

//
// nunchuck.pde
//

#include <Wire.h>
LiquidCrystal lcd(12, 11, 10, 5, 4, 3, 2);
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
double maxx=0,maxy=0,maxz=0;
double x,y,z,temperatura;

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
{
Serial.begin(9600);
int n;
digitalWrite(ledPin, HIGH); // turn on LED

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

Wire.begin(); // TWI init

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

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

for(int a =2;a<13;a++)
{
pinMode(a,OUTPUT);
if(a>1&&a<8)
{
digitalWrite(a,HIGH);
}
else
digitalWrite(a,LOW);
}
}

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(10); // wait 10msec before next loop
}
}

void printdata() //mostra i valori su lcd
{
int n; //variabile usata per i pulsanti

temperatura = (5.0 * analogRead(0) * 100.0)/1024.0;

x=(buf[2]<<2)+((buf[5]>>2)&3); // accel x
y=(buf[3]<<2)+((buf[5]>>4)&3); // accel Y acquisisco i valori
z=(buf[4]<<2)+((buf[5]>>6)&3); // accel z
z-=500;
x-=500;//centro lecordinate
y-=500;
z=z2/512;
x=x
2/512;//converto il valore numerico in valore G
y=y*2/512;
if(maxy<y)
{
maxy=y;
}
if(maxx<x)
{
maxx=x;
}
if(maxz<z)
{
maxz=z;
}
n=(buf[5]&2 );
if(n==0)
{
mostraminmax();
}

else
{
mostravalori();
}

delay(100);
}

void mostraminmax()
{
lcd.clear();
lcd.print("MY= ");
lcd.print(maxy);
lcd.setCursor(9, 0);
lcd.print("MZ= ");
lcd.print(maxz);
lcd.setCursor(0, 1);
lcd.print("MX= ");
lcd.print(maxx);
}

void mostravalori()
{
lcd.clear();
lcd.print("Y: ");
lcd.print(y);
lcd.setCursor(9, 0);
lcd.print("Z: ");
lcd.print(z);
lcd.setCursor(0, 1);
lcd.print("X: ");
lcd.print(x);
lcd.setCursor(9, 1);

}

qui è prensente anche la parte per visualizzare i valori della forza, mostrare i valori massimi alla pressione del pulsante sul nunchuk
e rilevo la tempreatura tramite un lm 35 e la mostro sul display pero quaesta ultima parte la sto scrivendo adesso

spero che ti sia utile

grazie mille! appena ho un attimo lo provo.

io ho usato la libreria del playground però con il mega non mi funziona...
appena inizializzo il nunchuc mi crasha tutto...
sul 2009 nessun problema.....

ho provato anche io la libreria del playground. il problema è sempre lo stesso, la libreria da sola compila e funziona, ma quando collego il nunchuk non va più. Se scollego pin analog 5 con la finestra di serial monitor aperta, allora l'output riprende.
boh...

UPDATE: utilizzo il duemilanove con ide 16.

stesso problema il programma parte ma quando collego o inizializzo crasha

bel problema. purtroppo non sono ancora pratico del linguaggio, così non so da dove iniziare per tentare un'update della libreria.

ma avete prpovato a usare il codiche chè ho trovato io su internet

a me sembra funzionare però nn conosco benissimo il linguaggio e in particolare come funziona l'i2c quinid aspetto vostri pareri

:slight_smile: :slight_smile:

ciao pdor90,

purtroppo, il codice che mi hai segnalato non funziona. Difatti, quella che tu presenti nel topic è una semplice implementazione del codice per la libreria liquidcrystal con questo sketch (http://www.alfonsomartone.itb.it/rkxncv.html), che ho segnalato qualche post più su come esempio per me non funzionante.

ADD: riporto di seguito una citazione dal topic all'indirizzo (“WiiChuck” Wii Nunchuck Adapter Available – todbot blog)

Hi Mau,
Are you using Arduino 0012? There have been some changes in Arduino 0012 that make it harder to use the nunchuck_funcs.h library (and other “libraries” contained in a .h file)

To get around this, either use Arduino 0011 (you can have both on your computer at the same time with no problem). The other way is to insert some code statements above the #include line, like this:

// beginning of sketch
int ledPin = 13;
#include "nunchuck_funcs.h"
// the rest of the code

premesso che non sono affatto certo delle affermazioni che ho letto, l'unica voce delle release notes (v. 012) che ho trovato e che pare influire nel codice postato è questa:

  • Moved insertion of #include <WProgram.h> to after any comments and #include
    statements in the main sketch file. This means that an #include <stdlib.h>
    now works.

e a me il codic e postato funziona e mi da i valori pero vorrei sapere da voi i valori che l'accelerometro vi da a me da 700 quando è sottoposto ad un g

500 quando e neutro

quinid sarà 1000 a 2 g

o a -2g

250 a -1 g

perche se è cosi allora il programma che io ho postato funziona

perche l'accelerometro mi fornisce

500 asse x

500 asse y

700/720 asse z

quindi sembra andare e nn si blocca
magari a me funziona perche il mii arduino ha l'atmega 328 ?

bo aspetto vosatre risoste

col 168 nemmeno si blocca...
a me si blocca col mega...

ciao a tutti,

oggi test di compilazione con arduino Duemilanove ATMega 328, IDE versione 0017, purtroppo non ho ottenuto risultati.

il file (versione playground) da solo funziona bene, si blocca quando aggiungo il cavetto giallo (clock) sul pin 5 e resetto.

(chiedo scusa a pdor90 per aver portato la discussione offtopic. non appena ne avrò la possibilità (quando anche il mio nunchuck si deciderà a funzionare) proverò a fare qualche test sulla questione G :P)

Io ho il primo Arduino ancora con ATmega 8 (credo ma vado a memoria) e a me il codice del Playground funziona e mi restituisce i valori perfettamente. Ho letto che voi resettate quando collegate il Nunchuck. Io resetto carico il programma in arduino e attacco il Nunchuck e funizona tutto, tant'è che che lo adopero sia collegato per comandare un servo sia per uscire su un joystick.

ciao
Braldt

arduino 0017 e il mega e tutto funziona
dopo problemi relativi alla cartella e il nome

io lo lascio attaccto e accendo
perchè sennò non prende il chuck.begin