venerdì 5 gennaio 2018

L'accelerometro a 3 assi

In attesa dell'arrivo dei componenti di controllo del motore brushless, credo sia opportuno guadagnare un po' di tempo ed iniziare a concretizzare l'algoritmo di controllo del movimento che dovrà essere eseguito da Arduino. Nelle settimane passate ho ragionato molto su come realizzare il controllo del movimento, senza arrivare ad un idea definitiva. Questo non sorprende, considerando che non ho alcuna esperienza pregressa di controllo del movimento e nemmeno una conoscenza diretta su come funzionano gli hoverboard. Ma è proprio questo il guadagno finale di questa sfida: aver fatto esperienza di qualcosa di nuovo.

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