Head track con Arduino e Nunchuk - BaroneRosso.it - Forum Modellismo

Torna indietro   BaroneRosso.it - Forum Modellismo > Elettronica > Circuiti Elettronici


Rispondi
 
Strumenti discussione Visualizzazione
Vecchio 30 ottobre 12, 18:08   #1 (permalink)  Top
User
 
L'avatar di faustog_2
 
Data registr.: 19-07-2008
Residenza: catania
Messaggi: 978
il primo

ciao ElNonino...

io devo sempre ringraziarti, perchè mi hai sempre illustrato tutto con chiarezzza, guarda ho fatto le prove io roteo il nunchuk e così rotea anche il servo! meglio di così ?

io di elettronica son una frana , come programmatore.. diciamo che ancora me la cavo. dunque per il momento posto i sorgenti in tutto sono tre:


il primo

#ifndef _NUNCHUK_H_
#define _NUNCHUK_H_

#define NUNCHUK_BUFFER_SIZE 6

class Nunchuk
{
public:
void initialize();
bool update();


//__________________________________________________ _____
int joystick_x() const
{
return _buffer[0];
}
//__________________________________________________ _____
int joystick_y() const
{
return _buffer[1];
}
//__________________________________________________ _____
int x_acceleration() const
{
return ((int) (_buffer[2]) << 2) | ((_buffer[5] >> 2) & 0x03);
}
//__________________________________________________ _____
int y_acceleration() const
{
return ((int) (_buffer[3]) << 2) | ((_buffer[5] >> 4) & 0x03);
}
//__________________________________________________ _____
int z_acceleration() const
{
return ((int) (_buffer[4]) << 2) | ((_buffer[5] >> 6) & 0x03);
}

bool z_button() const
{
return !(_buffer[5] & 0x01);
}
bool c_button() const
{
return !(_buffer[5] & 0x02);
}

private:

void request_data();
char decode_byte(const char);

unsigned char _buffer[NUNCHUK_BUFFER_SIZE];

};
#endif





Citazione:
Originalmente inviato da ElNonino Visualizza messaggio
Fausto direi che questa volta non ci siamo proprio, ti leggo sempre con attenzione ed apprezzo il tuo desiderio di comunicare i tuoi risultati ad altri però.......

Poichè in questo forum cercano suggerimenti e risposte molti niubbi ritengo doveroso correggere alcune imprecisioni.

Con un accelerometro a 3 assi come quello contenuto nel Nunchuck (originale) non è possibile rilevare la rotazione della testa per un head tracker, bensì solo le inclinazioni del capo fronte/retro e destra/sinistra come già ti scrissi in un altro post.

Se tu sei riuscito a leggere la rotazione sull'asse Z con un accelerometro ti sarei grato se postassi l'algoritmo utilizzato.

Anche il sistema di filtraggio del PWM con elettrolitici da 220uF è decisamente sbagliato, per convertire un PWM in tensione va utilizzato un apposito filtro passa-basso opportunamente dimensionato in base alla frequenza e durata impulso (min/Max) del PWM, filtro che deve tener conto anche della tempo di risposta all'impulso. (ad es. rotazione repentina della testa da dx a sx).

Questa tecnica è quella comunemente usata nei convertitori DAC, lo schema qui sotto mostra come sono solito convertire in alcune applicazioni un PWM in cc.



I componenti che formano il PB sono: R5, R8, R9 e C8, C9.

faustog_2 non è collegato   Rispondi citando
Vecchio 30 ottobre 12, 18:10   #2 (permalink)  Top
User
 
L'avatar di faustog_2
 
Data registr.: 19-07-2008
Residenza: catania
Messaggi: 978
il secondo

il primo era nunchuck.h il secondo nunchuck.cpp il terzo NunchuckDemo.ino


questo è il secondo:


#include <WProgram.h>
#include <Wire.h>

#include "nunchuk.h"

#define NUNCHUK_DEVICE_ID 0x52

void Nunchuk::initialize()
{
Wire.begin();
Wire.beginTransmission(NUNCHUK_DEVICE_ID);

Wire.write(0x40);
Wire.write(0x00);
Wire.endTransmission();
update();
}
bool Nunchuk::update()
{
//delay(1);
Wire.requestFrom(NUNCHUK_DEVICE_ID, NUNCHUK_BUFFER_SIZE);
int byte_counter = 0;

while(Wire.available() && byte_counter < NUNCHUK_BUFFER_SIZE)
{
_buffer[byte_counter++] = decode_byte(Wire.read());
}
request_data();

return byte_counter == NUNCHUK_BUFFER_SIZE;
}

void Nunchuk::request_data()
{
Wire.beginTransmission(NUNCHUK_DEVICE_ID);

Wire.write(0x00);
Wire.endTransmission();
}

char Nunchuk::decode_byte(const char b)
{
return (b ^ 0x17) + 0x17;
}
faustog_2 non è collegato   Rispondi citando
Vecchio 30 ottobre 12, 18:11   #3 (permalink)  Top
User
 
L'avatar di faustog_2
 
Data registr.: 19-07-2008
Residenza: catania
Messaggi: 978
il terzo:

ecco il terzo NunchuckDEmo.ino



include <Wire.h>
#include "nunchuk.h"

const unsigned int BAUD_RATE = 9600;
const unsigned int MIN = 304;
const unsigned int MAX = 712;

const unsigned int MIN_OUT = 0;
const unsigned int MAX_OUT = 255;

Nunchuk nunchuk;

int buffer_x = 0;
int buffer_y = 0;
int buffer_z = 0;


int out_x_value = 0;


void setup()
{
Serial.begin(BAUD_RATE);
nunchuk.initialize();

}

void loop()
{
analogWrite(3,out_x_value);


if(nunchuk.update())
{
buffer_x = map(nunchuk.x_acceleration(), MIN,MAX,MIN_OUT,MAX_OUT);
buffer_y = map(nunchuk.y_acceleration(), MIN,MAX,MIN_OUT,MAX_OUT);
buffer_z = map(nunchuk.z_acceleration(), MIN,MAX,MIN_OUT,MAX_OUT);
}

if(nunchuk.update())
{
if( buffer_x != map(nunchuk.x_acceleration(), MIN,MAX,MIN_OUT,MAX_OUT) || buffer_y != map(nunchuk.y_acceleration(), MIN,MAX,MIN_OUT,MAX_OUT) || buffer_z != map(nunchuk.z_acceleration(), MIN,MAX,MIN_OUT,MAX_OUT))
{

out_x_value = map(nunchuk.x_acceleration(), MIN,MAX,MIN_OUT,MAX_OUT);
Serial.print(out_x_value);


Serial.print(",");

Serial.print(map(nunchuk.y_acceleration(), MIN,MAX,MIN_OUT,MAX_OUT));
Serial.print(",");

Serial.print(map(nunchuk.z_acceleration(), MIN,MAX,MIN_OUT,MAX_OUT));
Serial.print("\n\r");

}
}
}
faustog_2 non è collegato   Rispondi citando
Vecchio 30 ottobre 12, 18:19   #4 (permalink)  Top
User
 
L'avatar di faustog_2
 
Data registr.: 19-07-2008
Residenza: catania
Messaggi: 978
ok

ovviamente si tratta di una demo... appena ho tempo mi ci rimetto per migliorare e metterlo a posto, allo stato attuale converte solo uno dei due assi... infatti invoca solo una volta analogWrite, visto che sono in una fase sperimentale. Per il discorso del DAC avevo pensato di usarlo ho in casa il DAC0808 quindi approvo perfettamente il tuo discorso.... ..però mi son detto prima provo ad usare direttamente il PWM !! facendo le prove mi son imbattuto con il problema della vibrazione del servo, ho capito che si trattava dell'effetto frequenza. Ho provato pure a usare una fotoresistenza al posto del potenziometro, la foto resistenza inserita a calza con un termo restingente , dove dentro ho messo un led pilotato appunto dal PWM di Arduino. Anche in questo caso il risultato ottimo! Comunque la cosa piu semplice è appunto usare il PWM prodotto da Arduino con analogWrite(pin, value) due condensatori da 220 uF 35 V il servo non vibra più e adesso segue perfettamente la roteazione del Nunchuck.

Ultima modifica di faustog_2 : 30 ottobre 12 alle ore 18:24
faustog_2 non è collegato   Rispondi citando
Vecchio 30 ottobre 12, 19:21   #5 (permalink)  Top
User
 
L'avatar di faustog_2
 
Data registr.: 19-07-2008
Residenza: catania
Messaggi: 978
ciao ancora Elnonino..

anch'io tempo fa avevo fatto una discussione sul fatto che il Nunchuk avesse due assi piuttosto che tre come spesso viene spacciato, ricordo anche che alcuni colleghi mi dissero che erano tre assi e che dovevo indagare meglio. Eccola

http://www.baronerosso.it/forum/circ...-tre-assi.html


Bene in realtà sono solo due come la mia affermazione fatta tempo fa il terzo coincide con il secondo esegue un conteggio sfasato di 90 gradi di inclinazione ma confermo che è sono due assi.

Per rendere chiaro tutto metto le foto per far capire quali roteazioni sente il nunchuk,
la prima foto e l'ultima mostrano la roteazione x, mentre la seconda e la terza foto mostrano la roteazione y.
L'asse z per Nunchuk invece è un invenzione dei marziani!

a dopo
fausto
Icone allegate
Head track  con Arduino e Nunchuk-gopr4741.jpg   Head track  con Arduino e Nunchuk-gopr4739.jpg   Head track  con Arduino e Nunchuk-gopr4743.jpg   Head track  con Arduino e Nunchuk-gopr4745.jpg  

Ultima modifica di faustog_2 : 30 ottobre 12 alle ore 19:27
faustog_2 non è collegato   Rispondi citando
Vecchio 30 ottobre 12, 19:47   #6 (permalink)  Top
Adv Moderator
 
L'avatar di romoloman
 
Data registr.: 15-08-2007
Residenza: sto a Massa ma sono molto Positivo
Messaggi: 12.071
Fausto scusa ma non ci siamo... non ti riesco a seguire.
Il nunchuck contiene tre accelerometri, il problema è che tu lo stai utilizzando per leggere una rotazione...

Dato il sistema di riferimento XYZ con Z parallelo a G (forza di gravità) mentre effettivamente puoi capire una rotazione sugli assi x e y mediante una composizione in seno e coseno di G non potrai mai capire una rotazione attorno a Z poiché le componenti di G su X e Y non cambiano e la componente Z rimane costante.

Non è il nunchuck che non va, è la base che ci sta dietro, per capire una rotazione attorno a Z serve o una bussola magnetica o un giroscopio.
__________________
Vivere in qeusto mondo e molto belo belo e vale la pena starci ma a volte in questa UNICA vita che ci apartiene posono succedere cose brute brute alora mi chiedo perche siete incazziati domani pole esere anche lultimo
Grazie "TRANQUILLO"
FAI 15766
romoloman non è collegato   Rispondi citando
Vecchio 31 ottobre 12, 09:44   #7 (permalink)  Top
User
 
L'avatar di faustog_2
 
Data registr.: 19-07-2008
Residenza: catania
Messaggi: 978
ok ho capito

scusa romoloman.... ...è vero ho sto difetto... sei stato bravo ad attirarmi nell'attenzione... ...comunque adesso che sono stato attento ...ho capito! quindi non potrò mai misurare la posizione angolare secondo l'asse z tenendo conto he questo asse sia parallelo alla forza di gravità ovvero verso il basso, per questo nn è possibile rilevare la roteazione destra/sinistra della testa, ma solo sopra/sotto, diciamo se dovessi usare un disco musicale ( di quelli in vinile di una volta) il nunchick non potrebbe mai informarci della posizione , invece su una ruota di bicicletta potrebbe informarci istante per istante la sua posizione angolare!

In altre parole, Il nunchuk potrebbe essere utilizzato come stabilizzatore d'assetto, rollio e beccheggio di aereo, ma non di direzione... per questo dovrebbe intervenire un sensore magnetico...

Comuque adesso lascio l'esperimento in corso Head Track ma continuo a studiare per ottenere maggiori competenze con questo Nunchuck , poi passerò ai gyroscopi.

a dopo
fausto

Quindi i definitiva l'asse z dovrebbe rispondere alle accellùerazioni verso il basso, ovviamente se porto su oppure giù con rapidità o diciamo appunto con un accelerazione.


Citazione:
Originalmente inviato da romoloman Visualizza messaggio
Fausto scusa ma non ci siamo... non ti riesco a seguire.
Il nunchuck contiene tre accelerometri, il problema è che tu lo stai utilizzando per leggere una rotazione...

Dato il sistema di riferimento XYZ con Z parallelo a G (forza di gravità) mentre effettivamente puoi capire una rotazione sugli assi x e y mediante una composizione in seno e coseno di G non potrai mai capire una rotazione attorno a Z poiché le componenti di G su X e Y non cambiano e la componente Z rimane costante.

Non è il nunchuck che non va, è la base che ci sta dietro, per capire una rotazione attorno a Z serve o una bussola magnetica o un giroscopio.
faustog_2 non è collegato   Rispondi citando
Vecchio 30 ottobre 12, 19:59   #8 (permalink)  Top
User
 
L'avatar di faustog_2
 
Data registr.: 19-07-2008
Residenza: catania
Messaggi: 978
nota

il software .ino che ho scritto

ha una particolarità se andiamo a variare
const unsigned int MIN_OUT = 0;
const unsigned int MAX_OUT = 50;

quindi riduciamo il range operativo, lo rendiamo meno sensibile! in questo modo sarà piu facile osservare che esso invierà i dati solo se cambiano.. per esempio supponendo che io voglia creare un sistema di livellamento, non posso occupare costantemtne la seriale, ma solo se ci sono variazioni..

per cui ho creato un firmware che si presta anche per altri esperimenti.


a dopo
fausto




Citazione:
Originalmente inviato da faustog_2 Visualizza messaggio
ciao ancora Elnonino..

anch'io tempo fa avevo fatto una discussione sul fatto che il Nunchuk avesse due assi piuttosto che tre come spesso viene spacciato, ricordo anche che alcuni colleghi mi dissero che erano tre assi e che dovevo indagare meglio. Eccola

http://www.baronerosso.it/forum/circ...-tre-assi.html


Bene in realtà sono solo due come la mia affermazione fatta tempo fa il terzo coincide con il secondo esegue un conteggio sfasato di 90 gradi di inclinazione ma confermo che è sono due assi.

Per rendere chiaro tutto metto le foto per far capire quali roteazioni sente il nunchuk,
la prima foto e l'ultima mostrano la roteazione x, mentre la seconda e la terza foto mostrano la roteazione y.
L'asse z per Nunchuk invece è un invenzione dei marziani!

a dopo
fausto
faustog_2 non è collegato   Rispondi citando
Vecchio 30 ottobre 12, 22:37   #9 (permalink)  Top
Adv Moderator
 
L'avatar di romoloman
 
Data registr.: 15-08-2007
Residenza: sto a Massa ma sono molto Positivo
Messaggi: 12.071
Fausto, a volte è difficile capire se leggi le risposte o continui per la tua strada imperterrito.....
Bello il tuo lavoro di divulgazione ma almeno provare a capire quello che io e El Nonino ti stiamo dicendo renderebbe i tuoi post un po' meno da blog personale e un po' più da forum...
__________________
Vivere in qeusto mondo e molto belo belo e vale la pena starci ma a volte in questa UNICA vita che ci apartiene posono succedere cose brute brute alora mi chiedo perche siete incazziati domani pole esere anche lultimo
Grazie "TRANQUILLO"
FAI 15766
romoloman non è collegato   Rispondi citando
Rispondi

Bookmarks




Regole di scrittura
Non puoi creare nuove discussioni
Non puoi rispondere alle discussioni
Non puoi inserire allegati
Non puoi modificare i tuoi messaggi

BB code è Attivato
Le faccine sono Attivato
Il codice [IMG] è Attivato
Il codice HTML è Disattivato
Trackbacks è Disattivato
Pingbacks è Disattivato
Refbacks è Disattivato


Discussioni simili
Discussione Autore discussione Forum Commenti Ultimo Commento
Qualcuno sperimenta con Arduino? Tom_1971 Circuiti Elettronici 192 21 dicembre 13 11:07
Nunchuk e wireless geppino Circuiti Elettronici 4 19 settembre 12 10:53
A-Day - una giornata con Arduino DiScienza Incontri Modellistici 0 19 marzo 12 20:39
quadricottero con arduino 2009 sailormann26 Aeromodellismo Progettazione e Costruzione 0 27 dicembre 10 23:12



Tutti gli orari sono GMT +2. Adesso sono le 22:40.


Basato su: vBulletin versione 3.8.11
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
E' vietata la riproduzione, anche solo in parte, di contenuti e grafica. Copyright 1998/2019 - K-Bits P.I. 09395831002