Innholdsfortegnelse:

En måte å bruke en treghetsmåleenhet?: 6 trinn
En måte å bruke en treghetsmåleenhet?: 6 trinn

Video: En måte å bruke en treghetsmåleenhet?: 6 trinn

Video: En måte å bruke en treghetsmåleenhet?: 6 trinn
Video: Node-Red 77: En måte å bruke Powersaver.no noder til å styre, feks en termostat. ( REUPLOAD) 2024, November
Anonim
En måte å bruke en treghetsmåleenhet på?
En måte å bruke en treghetsmåleenhet på?

Sammenhengen:

Jeg bygger for moro skyld en robot som jeg vil flytte autonomt inne i et hus.

Det er et langt arbeid, og jeg gjør trinn for trinn.

Jeg har allerede publisert 2 instrukser om dette emnet:

  • en om å lage en hjulkoder
  • en om wifi -tilkobling

Roboten min drives av to DC -motorer ved hjelp av min hjemmelagde hjulkoder.

Jeg forbedrer for øyeblikket den bevegelige kontrollen og har brukt litt tid med gyroskop, akselerometer og IMU. Jeg vil gjerne dele denne opplevelsen.

Vil du vite mer om lokalisering? Her er en artikkel om hvordan du kombinerer kunstig intelligens og ultralyd for å lokalisere roboten

Trinn 1: Hvorfor bruke en treghetsmåleenhet?

Hvorfor bruke en treghetsmåleenhet?
Hvorfor bruke en treghetsmåleenhet?

Så hvorfor brukte jeg en IMU?

Den første grunnen var at hvis hjulkoderen er presis nok til å kontrollere rett bevegelse, selv etter tuning, var jeg ikke i stand til å få en presisjon for rotasjon mindre enn +- 5 degres, og det er ikke nok.

Så jeg prøvde 2 forskjellige sensorer. For det første bruker jeg et magnetometer (LSM303D). Prinsippet var enkelt: Før rotasjonen får du nord -orienteringen, beregner du målet og justerer trekket til målet er nådd. Det var litt bedre enn med koder, men med for spredning. Etter det prøvde jeg å bruke et gyroskop (L3GD20). Prinsippet var bare å integrere rotasjonshastigheten fra sensoren for å beregne rotasjonen. Og det fungerte bra. Jeg klarte å kontrollere rotasjonen på +- 1 grader.

Likevel var jeg nysgjerrig på å prøve noen IMU. Jeg velger en BNO055 -komponent. Jeg brukte litt tid på å forstå og teste denne IMU. På slutten bestemte jeg meg for å velge denne sensoren av følgende årsaker

  • Jeg kan kontrollere rotasjonen så vel som med L3GD20
  • Jeg kan oppdage svak rotasjon når jeg beveger meg rett
  • Jeg trenger å orientere meg nordover for robotlokalisering og kompasskalibreringen av BNO055 er veldig enkel

Trinn 2: Hvordan bruke BNO055 for 2D -lokalisering?

Hvordan bruke BNO055 for 2D -lokalisering?
Hvordan bruke BNO055 for 2D -lokalisering?

BNO055 IMU er en 9 -akset intelligent sensor fra Bosch som kan gi absolutt orientering.

Databladet gir en komplett dokumentasjon. Det er en høyteknologisk komponent, er det et ganske komplekst produkt, og jeg brukte noen timer på å lære hvordan det fungerer og prøve forskjellige måter å bruke det på.

Jeg tror det kan være nyttig å dele denne opplevelsen.

For det første brukte jeg Adafruit -biblioteket som gir et godt verktøy for å kalibrere og oppdage sensoren.

På slutten og etter mange tester bestemte jeg meg for det

  • bruk Adafruit -biblioteket bare for å lagre kalibrering
  • bruk 3 av alle mulige moduser for BNO055 (NDOF, IMU, Compss)
  • dedikere en Arduino Nano til å beregne lokalisering basert på BNO055 -målinger

Trinn 3: Hardware Point of Vue

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 er en I2C -komponent. Så den trenger strømforsyning, SDA og SCL for å kommunisere.

Bare vær forsiktig med Vdd -spenning i henhold til produktet du kjøpte. Bosch -brikken fungerer i området: 2,4V til 3,6V, og du kan finne 3,3v og 5v komponent.

Det er ingen problemer med å koble Nano og BNO055.

  • BNO055 drives av Nano
  • SDA og SCL er koblet til 2 x 2k pull-up motstander.
  • 3 LED koblet til Nano for diagnose (med motstander)
  • 2 kontakter som brukes til å definere modus etter oppstart
  • 1 kontakt mot BNO (Gnd, Vdd, Sda, Scl, Int)
  • 1 kontakt mot Robot/Mega (+9V, Gnd, sda, Scl, Pin11, Pin12)

Litt lodding og det er det!

Trinn 4: Hvordan fungerer det?

Hvordan virker det ?
Hvordan virker det ?

Fra kommunikasjonspunktet:

  • Nano er bussmester I2C
  • Roboten/Mega og BNO055 er I2C -slaver
  • Nano leser BNO055 -registrene permanent
  • Roboten/Mega gir et numerisk signal for å be om ordet fra Nano

Fra beregningspunktet: Nano kombinert med BNO055 leverer

  • Kompassoverskriften (brukes til lokalisering)
  • En relativ overskrift (brukes til å kontrollere rotasjoner)
  • Den absolutte kursen og posisjonen (brukes til å kontrollere trekk)

Fra funksjonelt synspunkt: Nano:

  • administrerer BNO055 -kalibreringen
  • administrerer BNO055 parametere og kommandoer

Delsystemet Nano & BNO055:

  • beregne den absolutte kursen og lokaliseringen for hvert robothjul (med en skalafaktor)
  • beregne den relative kursen under rotasjon av roboten

Trinn 5: Arkitektur og programvare

Arkitektur og programvare
Arkitektur og programvare

Hovedprogramvaren kjører på en Arduino Nano

  • Arkitektur er basert på I2C -kommunikasjon.
  • Jeg valgte å dedikere en Nano på grunn av det faktum at Atmega som driver roboten ganske allerede var lastet og denne arkitekturen gjør det enklest å gjenbruke andre steder.
  • Nano leser BNO055 -registre, beregner og lagrer overskrift og lokalisering i sine egne registre.
  • Arduino Atmega som kjører robotkoden, sender informasjon om hjulkodere til Nano og leser overskriftene og lokaliseringen inne i Nano -registerene.

Det er en delkode (Nano) tilgjengelig her på GitHub

Adafruit kalibreringsverktøy hvis her på GitHub (kalibrering lagres på eeproom)

Trinn 6: Hva lærte jeg?

Når det gjelder I2C

For det første prøvde jeg å ha 2 mestere (Arduino) og 1 slave (sensor) på samme buss, men på slutten er det mulig og enklest å bare sette Nano som master og bruke GPIO -tilkobling mellom de 2 Arduinoene for å "be om token".

Angående BNO055 for 2D -orientering

Jeg kan konsentrere meg om tre forskjellige løpemoduser: NDOF (kombinere gyroskop, akselerometer og kompas) når roboten er inaktiv, IMU (kombinere gyroskop, akselerometer) når roboten beveger seg og Kompass i lokaliseringsfasen. Det er enkelt og raskt å bytte mellom disse modusene.

For å redusere kodestørrelsen og beholde muligheten for å bruke BNO055 interrupt for å oppdage kollisjon, foretrekker jeg ikke å bruke Adafruit -biblioteket og gjøre det på egen hånd.

Anbefalt: