Cuprins:

O modalitate de a utiliza o unitate de măsurare inerțială?: 6 pași
O modalitate de a utiliza o unitate de măsurare inerțială?: 6 pași

Video: O modalitate de a utiliza o unitate de măsurare inerțială?: 6 pași

Video: O modalitate de a utiliza o unitate de măsurare inerțială?: 6 pași
Video: IMU (Unitate de măsură inerțială) | Arduino Nano 33 Ble Sense [10] 2024, Noiembrie
Anonim
O modalitate de a utiliza o unitate de măsurare inerțială?
O modalitate de a utiliza o unitate de măsurare inerțială?

Contextul:

Construiesc pentru distracție un robot pe care vreau să îl mișc autonom în interiorul unei case.

Este o muncă lungă și o fac pas cu pas.

Am publicat deja 2 instructabile pe acest subiect:

  • una despre realizarea unui codificator de roți
  • una despre conexiunea wifi

Robotul meu este acționat de către 2 motoare de curent continuu cu ajutorul codificatorului meu de roți de casă.

În prezent îmbunătățesc controlul mișcării și am petrecut ceva timp cu giroscopul, accelerometrul și IMU. Mi-ar plăcea să împărtășesc această experiență.

Doriți să aflați mai multe despre localizare? Iată un articol despre cum să combinați inteligența artificială și ultrasunetele pentru a localiza robotul

Pasul 1: De ce să utilizați o unitate de măsurare inerțială?

De ce să folosiți o unitate de măsurare inerțială?
De ce să folosiți o unitate de măsurare inerțială?

Deci, de ce am folosit un IMU?

Primul motiv a fost că, dacă codificatorul roții este suficient de precis pentru a controla mișcarea dreaptă, chiar și după reglare nu am putut obține o precizie pentru rotație mai mică de + - 5 grade și acest lucru nu este suficient.

Așa că am încercat 2 senzori diferiți. În primul rând, folosesc un magnetometru (LSM303D). Principiul a fost simplu: înainte de rotație, obțineți orientarea spre nord, calculați ținta și reglați mișcarea până la atingerea țintei. A fost puțin mai bine decât cu codificatorul, dar cu o dispersie prea mare. După aceea, am încercat să folosesc un giroscop (L3GD20). Principiul a fost doar de a integra viteza de rotație furnizată de senzor pentru a calcula rotația. Și a funcționat bine. Am reușit să controlez rotația la + - 1 grad.

Cu toate acestea, am fost curios să încerc câteva IMU. Aleg o componentă BNO055. Am petrecut ceva timp să înțeleg și să testez acest IMU. La final, am decis să selectez acest senzor din următoarele motive

  • Pot controla rotația, precum și cu L3GD20
  • Pot detecta o ușoară rotație când mă mișc direct
  • Trebuie să obțin orientarea spre nord pentru localizarea robotului, iar calibrarea busolei BNO055 este foarte simplă

Pasul 2: Cum se utilizează BNO055 pentru localizarea 2D?

Cum se folosește BNO055 pentru localizare 2D?
Cum se folosește BNO055 pentru localizare 2D?

BNO055 IMU este un senzor inteligent Bosch pe 9 axe care ar putea oferi o orientare absolută.

Fișa tehnică oferă o documentație completă. Este o componentă de înaltă tehnologie, este un produs destul de complex și am petrecut câteva ore să învăț cum funcționează și să încerc diferite moduri de utilizare.

Cred că ar putea fi util să împărtășim această experiență.

În primul rând am folosit biblioteca Adafruit care oferă un instrument bun pentru calibrarea și descoperirea senzorului.

La final și după o mulțime de teste am decis să fac asta

  • utilizați biblioteca Adafruit doar pentru salvarea calibrării
  • utilizați 3 dintre toate modurile posibile ale BNO055 (NDOF, IMU, Compss)
  • dedicați un Arduino Nano pentru a calcula localizarea bazată pe măsurători BNO055

Pasul 3: Punct de vedere hardware

Hardware Point of Vue
Hardware Point of Vue
Hardware Point of Vue
Hardware Point of Vue
Hardware Point of Vue
Hardware Point of Vue

BNO055 este o componentă I2C. Deci are nevoie de sursă de alimentare, SDA și SCL pentru a comunica.

Doar aveți grijă la tensiunea Vdd în funcție de produsul pe care l-ați cumpărat. Cipul Bosch funcționează în intervalul: 2.4V până la 3.6V și puteți găsi componente de 3.3v și 5v.

Nu există dificultăți pentru conectarea Nano și BNO055.

  • BNO055 este alimentat de Nano
  • SDA și SCL sunt conectate cu rezistențe de tragere 2 x 2k.
  • 3 LED-uri conectate la Nano pentru diagnostic (cu rezistențe)
  • 2 conectori utilizați pentru a defini modul după pornire
  • 1 conector către BNO (Gnd, Vdd, Sda, Scl, Int)
  • 1 conector către Robot / Mega (+ 9V, Gnd, sda, Scl, Pin11, Pin12)

Un pic de lipit și gata!

Pasul 4: Cum funcționează?

Cum functioneazã ?
Cum functioneazã ?

Din punctul de vedere al comunicării:

  • Nano este maestrul autobuzului I2C
  • Robotul / Mega și BNO055 sunt sclavi I2C
  • Nano a citit permanent registrele BNO055
  • Robotul / Mega ridică un semnal numeric pentru a solicita cuvântul de la Nano

Din punctul de vedere calcul: Nano combinat cu BNO055 livrează

  • Antetul busolei (utilizat pentru localizare)
  • Un titlu relativ (folosit pentru controlul rotațiilor)
  • Poziția și poziția absolută (utilizate pentru a controla mișcările)

Din punct de vedere funcțional: Nano:

  • gestionează calibrarea BNO055
  • gestionează parametrii și comenzile BNO055

Subsistemul Nano și BNO055:

  • calculați pentru fiecare roată robot direcția absolută și localizarea (cu un factor de scară)
  • calculați poziția relativă în timpul rotației robotului

Pasul 5: Arhitectură și software

Arhitectura și software-ul
Arhitectura și software-ul

Principalul software rulează pe un Arduino Nano

  • Arhitectura se bazează pe comunicarea I2C.
  • Am ales să dedic un Nano datorită faptului că Atmega care rulează robotul era mai degrabă deja încărcat, iar această arhitectură face cel mai ușor reutilizarea în altă parte.
  • Nano citește registrele BNO055, calculează și stochează titlurile și localizarea în propriile registre.
  • Arduino Atmega care rulează codul robotului, trimite informații de codare a roților către Nano și citește titlurile și localizarea din registrele Nano.

Acolo cod subsytem (Nano) este disponibil aici pe GitHub

Instrumentul de calibrare Adafruit dacă este aici pe GitHub (calibrarea va fi stocată pe eeproom)

Pasul 6: Ce am învățat?

În ceea ce privește I2C

În primul rând, am încercat să am 2 master (Arduino) și 1 slave (senzor) pe aceeași magistrală, dar la sfârșit este posibil și cel mai simplu să setezi doar Nano ca master și să folosesc conexiunea GPIO între cele 2 Arduino pentru a „solicita simbolul”..

În ceea ce privește BNO055 pentru orientare 2D

Mă pot concentra pe 3 moduri de funcționare diferite: NDOF (combina giroscopul, accelerometrul și compas) când robotul este inactiv, IMU (combina giroscopul, accelerometrul) când robotul se deplasează și Busola în timpul fazei de localizare. Comutarea între aceste moduri este ușoară și rapidă.

Pentru a reduce dimensiunea codului și a păstra posibilitatea de a utiliza întreruperea BNO055 pentru a detecta coliziunea, prefer să nu folosesc biblioteca Adafruit și să o fac pe cont propriu.

Recomandat: