|
Registrazione | Gallery | FAQ | Lista utenti | Social Groups | Calendario | Cerca | I messaggi di oggi | Segna forums come letti |
| Strumenti discussione | Visualizzazione |
15 novembre 18, 16:37 | #11 (permalink) Top |
User Data registr.: 13-09-2012
Messaggi: 4.685
|
Grazie a tutti delle preziose informazioni. Sto sbattendo la testa per la prima volta con questi sensori e sto cercando a fatica di capire. Oramai ho capito come lavorare sul registro dell'integrato e mi sento già un passo avanti. Purtroppo non riesco più a stare alzato fino a tardi come qualche anno fa e la mia attività modellistica ne sta risentendo. Ora sto rifinendo il mio sketch che, al momento, fa uso di due soli assi dell'accelerometro. Devo inserire la calibrazione e registrare il valore nel registro dell'integrato. Per adesso non sto usando né DMP né librerie. Per quanto riguarda il giroscopio, da quello che ho capito e da quello che sto osservando nelle mie prove, il problema è che l'accelerometro è molto rumoroso e il filtro complementare (o altri) mixano i valori del gyro e dell'accelerometro per ottenere un dato pulito. Devo ancora implementare la lettura e la determinazione dell'angolo con il gyro, fatto quello potrò scoprire se il filtro funziona. Per adesso ho detto valori molto sporchi e variabili. Ho provato ad applicare un filtro passa basso con la libreria filter senza ottenerne nulla, probabilmente la frequenza di campionamento dell'integrato è troppo bassa. Sto facendo la media delle letture con calcolo della media ogni mezzo secondo ma i risultati sono ancora sporchissimi. Inviato dal mio Mi A1 utilizzando Tapatalk |
15 novembre 18, 16:53 | #12 (permalink) Top | |
User Data registr.: 18-04-2008 Residenza: milano
Messaggi: 405
| Citazione:
la sensor fusion con il gyro serve per migliorare la risposta in frequenza... se la misura è lenta allora la soluzione diventa banale e basta filtrare potentemente con filtro IIR le componeti del vettore accelerazione | |
15 novembre 18, 22:55 | #13 (permalink) Top | |
User | Citazione:
__________________ Peace & Love Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein) | |
16 novembre 18, 01:01 | #14 (permalink) Top | |
User Data registr.: 13-09-2012
Messaggi: 4.685
| Citazione:
Comunque stasera ho fatto diverse prove. Il filtro passabasso non mi ha portato a nessun miglioramento significativo, ho provato diverse frequenze ma il risultato non cambiava molto; forse ho sbagliato qualcosa. Facendo la media aritmetica dei campionamenti raccolti in un mezzo secondo il risultato si stabilizza molto anche se ci sono ancora oscillazioni alla seconda cifra decimale (se riuscissi ad avere una buona pulizia alla prima cifra decimale sarei parecchio contento). Avevo scelto di fare una media del genere perchè ho pensato di fare il refresh del display ogni mezzo secondo. Facendo una media in virgola mobile naturalmente il risultato migliora perchè perde gli scalini e gli sbalzi di una media aggiornata ogni 500millisecondi, però per poter ottenere un risultato decente ho usato degli array con 64 valori. Dovendo calcolare la media mobile su 3 array con 64 valori credo proprio che non potrò usare un algoritmo grezzo, altrimenti occupo il processore con il solo calcolo della media. | |
16 novembre 18, 07:31 | #15 (permalink) Top | |
User Data registr.: 13-09-2012
Messaggi: 4.685
| Citazione:
Bah... Alla notte dovrei dormire, non calcolare le medie.. Inviato dal mio Mi A1 utilizzando Tapatalk | |
16 novembre 18, 12:42 | #16 (permalink) Top |
User |
Ho dato un'occhiata al datasheet della MCU e mi pare che non abbia un filtro passa basso sull'accelerometro ma solo sul giroscopio, quindi necessita sicuramente filtrare il segnale nel microprocessore anche perchè questa MCU è indicata per giocattoli od applicazioni in cui non è richiesta molta precisione. Quando fai le prove controlla che la MCU non abbia vibrazioni, sia ben fissata ed usa i canali X ed Y non lo Z; poi controlla con un break point quali sono i valori nei due array per vedere se ci sono picchi od anomalie. La media mobile comporta solo pochissimi calcoli, in pratica una sottrazione, una somma ed un right shift quindi può essere chiamata spesso senza appesantire la CPU, un buon filtraggio lo puoi anche ottenere usando due medie mobili in cascata, comunque scordati di ottenere l'accuratezza di 1/100 di grado e sopratutto che con quella MCU sia affidabile nel tempo. Verifica anche che non ci siano perdite di dati nella comunicazione I2C o SPI.
__________________ Peace & Love Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein) |
16 novembre 18, 13:35 | #17 (permalink) Top | |
User Data registr.: 13-09-2012
Messaggi: 4.685
| Citazione:
Nelle prove che ho fatto non c'era NESSUNA differenza tra i valori filtrati e quelli non filtrati. Che frequenza di filtro mi consigli? Per la precisione credo che un decimo di grado sia più che sufficiente, per l'affidabilità metterò un algoritmo di calibrazione da richiamare ogni tanto. Se poi funziona bene posso anche pensare di trasformare il tutto per un sensore più preciso. Stasera devo mettere mano al minikosmo, che è più importante, domani vedo di andare avanti. Intanto grazie dell'interessamento. Inviato dal mio Mi A1 utilizzando Tapatalk | |
29 novembre 18, 11:17 | #18 (permalink) Top |
User Data registr.: 13-09-2012
Messaggi: 4.685
|
Sto andando avanti con il mio progettino ma ho un problemino con la gestione della media in virgola mobile. In pratica il risultato della media impiega parecchi secondi a stabilizzarsi ad ogni movimento del sensore. Non capisco perchè, sarà sicuramente una stupidata ma io non la vedo. Se posso approfitto della vostra competenza e vi allego il codice del loop per cercare di capire cosa non va. Considerate che la maggior parte del codice risiede nel void setup, compresa la parte della calibrazione che comprende la maggioranza delle righe di codice, ma non credo che quella interessi. Vi posto il codice note: tempodiciclo è impostato a 500millisecondi ( const int tempodiciclo=500; ) k è la dimensione dell'array per il calcolo della virgola mobile e vale 64 ( const int k=64; ) void loop(){ letturaMPU_0(); //funzione che riceve dati dal sensore MPU_0 e li memorizza nelle variabili // MPU_0_AcX, MPU_0_AcY e MPU_0_GyZ (i primi due sono accelerazioni, //l'ultimo e un dato di gyroscopio.) sommadegMPU_0-=degMPU_0[i]; degMPU_0[i] = ((atan2(MPU_0_AcY, MPU_0_AcX )) * 180.0) / PI; //calcolo tramite accelerometro sommadegMPU_0+=degMPU_0[i]; i++; if (i==k) {i=0;} tempodiciclo = millis()-startMillis; startMillis = millis(); //reset timer ciclorefresh+=tempodiciclo; deggyroMPU_0=deggyroMPU_0+(((MPU_0_GyZ/131)*tempodiciclo)/1000);//calcolo tramite gyro if(ciclorefresh >= lcdRefreshRate){ mediadegMPU_0 = sommadegMPU_0 / k ; ciclorefresh=0; } //fine if #ifdef debug {stampadebug(); #endif} //se il debug è acceso chiama la funzione per la stampa seriale dei valori } Ovviamente il valore dell'angolo calcolato tramite accelerometro cambia ogni 500 millisecondi sullo schermo del pc perchè così è impostato, però ad ogni movimento il valore impiega 4 o 5 secondi a raggiungere il valore reale. il tempo di ciclo lo stampo a video per vedere quanto vale ed è attorno agli 83 millisecondi. Ho scoperto che il tempo di ciclo varia in funzione di come modifico la funzione stampadebug() , evidentemente la stampa a video di valori e stringhe tramite Serial.print() richiede molto tempo. Stampando un pochino di valori per avere un'idea di come varino le variabili sono arrivato ad avere tempi di ciclo sui 250ms. |
29 novembre 18, 17:46 | #19 (permalink) Top | |
User | Citazione:
__________________ Peace & Love Fate le cose nel modo più semplice possibile, ma senza semplificare. (A. Einstein) | |
Bookmarks |
Strumenti discussione | |
Visualizzazione | |
| |
Discussioni simili | ||||
Discussione | Autore discussione | Forum | Commenti | Ultimo Commento |
Radiocomando 3 motori DC e 2 sensori di T con Arduino su trenino | spraity | Radiocomandi | 3 | 09 febbraio 17 15:07 |