
|
![]() | #1 (permalink) Top | |
User 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:
| |
![]() | ![]() |
![]() | #2 (permalink) Top |
User 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; } |
![]() | ![]() |
![]() | #3 (permalink) Top |
User 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"); } } } |
![]() | ![]() |
![]() | #4 (permalink) Top |
User 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 |
![]() | ![]() |
![]() | #5 (permalink) Top |
User 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 Ultima modifica di faustog_2 : 30 ottobre 12 alle ore 19:27 |
![]() | ![]() |
![]() | #6 (permalink) Top |
Adv Moderator 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 |
![]() | ![]() |
![]() | #7 (permalink) Top | |
User 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:
| |
![]() | ![]() |
![]() | #8 (permalink) Top | |
User 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:
| |
![]() | ![]() |
![]() | #9 (permalink) Top |
Adv Moderator 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 |
![]() | ![]() |
![]() |
Bookmarks |
| |
![]() | ||||
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 |