Il modo migliore per gestire la complessità è sempre quello di risolvere un problema alla volta. Dato che dispongo già di uno dei componenti chiave del mio progetto, inizierò da quello.
Si tratta di un accelerometro integrato, per la precisione un MPU-6050, un dispositivo davvero avanzato, descritto dalla casa costruttrice come accelerometro/giroscopio a 6 assi (ovvero 3 + 3). Utilizza la tecnologia dei MEMS (Micro Eletro-Mechanical Systems) per fornire funzionalità di controllo del moto molto potenti. Oltre alle normali funzioni di accelerometro e giroscopio, dispone anche di un vero e proprio pre-processore numerico delle misure che permetterebbe di condizionare e raffinare le misure già dal dispositivo, senza dover appesantire la scheda di controllo con algoritmi di elaborazione numerica. Peccato però che queste funzioni di pre-processamento non sono documentate dal costruttore, per cui chi si volesse avventurare sul loro uso è costretto a fare del reverse engineering con l'aiuto di esperienze analoghe prese da Internet.
Io per ora mi accontenterò delle misure dirette, per non aumentare la già grande complessità.
L'MPU-6050 si trova già integrato su di una schedina breakout che fornisce i piedini principali della sua interfaccia di utilizzo. E' quella che vedere sulla breadboard nella foto del post. Le misure sono fornite in maniera digitale attraverso un'interfaccia I2C.
Fortunatamente è un dispositivo che viene spesso usato in congiunzione con progetti maker di controllo del moto, e questo è confermato dall'esistenza di una libreria dedicata per Arduino che premette di leggere i dati in modo molto semplice.
I test effettuati da me hanno mostrato che l'MPU-6050 è facile da usare, ma fornisce misure molto rumorose, per cui è necessario operare una media sulle ultime letture per poter avere misure utilizzabili. Ovviamente mediare un numero sufficientemente grande di misure ha degli inconvenienti:
- Appesantisce e rallenta il codice della scheda di controllo (Arduino). Capisco quindi la comodità di avere già un preprocessamento nell'MPU, se solo fosse documentato...
- Rende il controllo meno reattivo a variazioni brusche della pendenza - anche se spero che questa non sia una circostanza comune nel moto dell'hoverboard.
Dopo aver effettuato delle prove su breadboad con Arduino e l'MPU-6050, ritengo che fare una media delle ultime 20 misure sia un buon compromesso tra accuratezza e velocità di risposta.
La soluzione che vorrei applicare i riassume nelle seguenti istruzioni per Arduino.
void leggi_accelerometro(void)
{
//Esegue la procedura di accesso all'MPU-6050
leggi_mpu6050();
//aggiorna i campioni delle accelerazioni
somma_z_acc += (z_acc - serie_z[ultimo_campione]);
somma_y_acc += (y_acc - serie_y[ultimo_campione]);
serie_z[ultimo_campione] = z_acc;
serie_y[ultimo_campione] = y_acc;
}
L'idea, per non appesantire Arduino con pesanti calcoli di medie ad ogni ciclo, è quella di tenere gli ultimi N (20) campioni in vettori (organizzati come memorie circolari) e di volta in volta aggiornare la somma dei campioni aggiungendo il nuovo campione e togliendo il vecchio. La media si ottiene dividendo la somma aggiornata per N (cioè per 20). In questo modo la media è sempre disponibile, per ogni misura, con una sottrazione, una somma ed una divisione.
Il codice che sto scrivendo è disponibile su github.com all'indirizzo https://github.com/albtrentadue/ArduSBSkoot
Avrete anche notato che sto considerando solo l'asse Y e l'asse Z dell'accelerometro. In effetto l'hoverboard ha solo due gradi di libertà: la rotazione dell'asse delle ruote ed il movimento avanti-indietro. Perciò la misura dell'accelerazione sull'asse X (cioè destra-sinistra) non è necessaria.
Nessun commento:
Posta un commento