Sommario:

Un modo per utilizzare un'unità di misura inerziale?: 6 passaggi
Un modo per utilizzare un'unità di misura inerziale?: 6 passaggi

Video: Un modo per utilizzare un'unità di misura inerziale?: 6 passaggi

Video: Un modo per utilizzare un'unità di misura inerziale?: 6 passaggi
Video: Webinar - La revisione del Sistema Internazionale di Unità 2024, Dicembre
Anonim
Un modo per utilizzare un'unità di misura inerziale?
Un modo per utilizzare un'unità di misura inerziale?

Il contesto:

Sto costruendo per divertimento un robot che voglio muovere autonomamente all'interno di una casa.

È un lavoro lungo e lo sto facendo passo dopo passo.

Ho già pubblicato 2 istruttori su quell'argomento:

  • uno sulla creazione di un codificatore a ruota
  • uno sulla connessione wifi

Il mio robot è guidato da 2 motori CC con l'aiuto del mio codificatore a ruota fatto in casa.

Attualmente sto migliorando il controllo del movimento e ho passato un po' di tempo con giroscopio, accelerometro e IMU. Mi farebbe piacere condividere questa esperienza.

Vuoi saperne di più sulla localizzazione? Ecco un articolo su come combinare intelligenza artificiale e ultrasuoni per localizzare il robot

Passaggio 1: perché utilizzare un'unità di misura inerziale?

Perché utilizzare un'unità di misura inerziale?
Perché utilizzare un'unità di misura inerziale?

Allora perché ho usato un IMU?

La prima ragione era che se l'encoder della ruota è abbastanza preciso da controllare il movimento rettilineo, anche dopo la messa a punto non sono stato in grado di ottenere una precisione per la rotazione inferiore a +- 5 gradi e questo non è sufficiente.

Quindi ho provato 2 sensori diversi. Per prima cosa utilizzo un magnetometro (LSM303D). Il principio era semplice: prima della rotazione ottenere l'orientamento nord, calcolare l'obiettivo e regolare lo spostamento fino a raggiungere l'obiettivo. Era un po' meglio che con l'encoder ma con troppa dispersione. Successivamente ho provato a utilizzare un giroscopio (L3GD20). Il principio era proprio quello di integrare la velocità di rotazione fornita dal sensore per calcolare la rotazione. E ha funzionato bene. Sono stato in grado di controllare la rotazione a +- 1 grado.

Tuttavia ero curioso di provare qualche IMU. Scelgo un componente BNO055. Ho passato un po' di tempo per capire e testare questa IMU. Alla fine ho deciso di selezionare questo sensore per i seguenti motivi

  • Posso controllare la rotazione così come con L3GD20
  • Riesco a rilevare una leggera rotazione quando ci si sposta in linea retta
  • Ho bisogno di ottenere l'orientamento nord per la localizzazione del robot e la calibrazione della bussola del BNO055 è molto semplice

Passaggio 2: come utilizzare BNO055 per la localizzazione 2D?

Come utilizzare BNO055 per la localizzazione 2D?
Come utilizzare BNO055 per la localizzazione 2D?

BNO055 IMU è un sensore intelligente a 9 assi Bosch che potrebbe fornire un orientamento assoluto.

La scheda tecnica fornisce una documentazione completa. È un componente ad alta tecnologia è un prodotto piuttosto complesso e ho passato alcune ore per imparare come funziona e provare diversi modi di usarlo.

Penso che potrebbe essere utile condividere questa esperienza.

Per prima cosa ho utilizzato la libreria Adafruit che fornisce un buon strumento per calibrare e scoprire il sensore.

Alla fine e dopo tante prove ho deciso di

  • usa la libreria Adafruit solo per salvare la calibrazione
  • utilizzare 3 di tutte le possibili modalità di BNO055 (NDOF, IMU, Compss)
  • dedicare un Arduino Nano per calcolare la localizzazione basata su misurazioni BNO055

Passaggio 3: punto di vista hardware

Punto di forza dell'hardware
Punto di forza dell'hardware
Punto di forza dell'hardware
Punto di forza dell'hardware
Punto di forza dell'hardware
Punto di forza dell'hardware

BNO055 è un componente I2C. Quindi ha bisogno di alimentazione, SDA e SCL per comunicare.

Basta fare attenzione alla tensione Vdd in base al prodotto che hai acquistato. Il chip Bosch funziona nella gamma: da 2,4 V a 3,6 V e puoi trovare componenti da 3,3 V e 5 V.

Non ci sono difficoltà per collegare il Nano e il BNO055.

  • Il BNO055 è alimentato dal Nano
  • SDA e SCL sono collegati con resistori di pull-up 2 x 2k.
  • 3 LED collegati al Nano per diagnosi (con resistenze)
  • 2 connettori utilizzati per definire la modalità dopo l'avvio
  • 1 connettore verso il BNO (Gnd, Vdd, Sda, Scl, Int)
  • 1 connettore verso Robot/Mega (+9V, Gnd, sda, Scl, Pin11, Pin12)

Un po' di saldatura e il gioco è fatto!

Passaggio 4: come funziona?

Come funziona ?
Come funziona ?

Dal punto di vista della comunicazione:

  • Il Nano è il master del bus I2C
  • Il Robot/Mega e il BNO055 sono slave I2C
  • Il Nano legge permanentemente i registri BNO055
  • Il Robot/Mega emette un segnale numerico per richiedere la parola al Nano

Dal punto di vista del calcolo: il Nano combinato con il BNO055 offre

  • La direzione della bussola (usata per la localizzazione)
  • Un titolo relativo (usato per controllare le rotazioni)
  • La rotta e la posizione assolute (utilizzate per controllare le mosse)

Dal punto di vista funzionale: Il Nano:

  • gestisce la calibrazione BNO055
  • gestisce i parametri e i comandi del BNO055

Il sottosistema Nano & BNO055:

  • calcolare per ogni ruota robot la rotta assoluta e la localizzazione (con un fattore di scala)
  • calcolare la rotta relativa durante la rotazione del robot

Passaggio 5: l'architettura e il software

L'architettura e il software
L'architettura e il software

Il software principale è in esecuzione su un Arduino Nano

  • L'architettura si basa sulla comunicazione I2C.
  • Ho scelto di dedicare un Nano per il fatto che l'Atmega che gestisce il robot era piuttosto già caricato e questa architettura lo rende più facile da riutilizzare altrove.
  • Il Nano legge i registri BNO055, calcola e memorizza l'intestazione e la localizzazione nei propri registri.
  • L'Arduino Atmega che esegue il codice del robot, invia le informazioni degli encoder delle ruote al Nano e legge le intestazioni e la localizzazione all'interno dei registri Nano.

Il codice del sottosistema (Nano) è disponibile qui su GitHub

Lo strumento di calibrazione Adafruit se qui su GitHub (la calibrazione verrà archiviata su eeproom)

Passaggio 6: cosa ho imparato?

Per quanto riguarda I2C

Per prima cosa ho provato ad avere 2 master (Arduino) e 1 slave (sensore) sullo stesso bus ma alla fine è possibile e più semplice impostare solo il Nano come master e utilizzare la connessione GPIO tra i 2 Arduino per "richiedere il token".

Per quanto riguarda BNO055 per l'orientamento 2D

Posso concentrarmi su 3 diverse modalità di funzionamento: NDOF (combina giroscopio, accelerometro e Compas) quando il robot è fermo, IMU (combina giroscopio, accelerometro) quando il robot è in movimento e Compass durante la fase di localizzazione. Il passaggio tra queste modalità è facile e veloce.

Per ridurre la dimensione del codice e mantenere la possibilità di utilizzare l'interrupt BNO055 per rilevare la collisione, preferisco non utilizzare la libreria Adafruit e farlo da solo.

Consigliato: