Guide till gyro och accelerometer med Arduino inklusive Kalman filtrering



denna guide var först postat på forumet Arduino, och kan hittas här: http://arduino.cc/forum/index.php/topic, 58048.0.html

Jag återuppfört bara den, så ännu mer kommer att få användning av den. Koden kan hittas här:
https://github.com/TKJElectronics/example-sketch-for-IMU-including-Kalman-filter

Hallo alla
Jag köpte nyligen denna analoga 6DOF (sex frihetsgrader) IMU styrelse (http://www.sparkfun.com/products/10010) från watterott.com. Det använder tre gyron och tre accelerometrar för att beräkna vinklar i tre dimensioner.

Jag tittade en stund för lite kod online och hur du ansluter med dem. Jag lyckades efter många timmar av forskning att göra af exakt mätning av vinklar i två riktningar. Jag bestämde mig att skriva en kort guide för andra elektroniska entusiaster.
Det huvudsakliga syftet med denna guide är att lära andra att få några användbara data från deras IMU eller bara en gyro eller accelerometer. Koden för Arduino kan hittas på github: https://github.com/TKJElectronics/Example-Sketch-for-IMU-including-Kalman-filter. Det borde vara ganska lätt att genomföra min kod till din egen sensor. Jag kommer inte beskriva alla detaljer om teorin bakom, istället kan du titta på källorna för mer information.

Innan du börjar måste du ansluta IMU enligt följande:

Acc_Gyro Arduino
3.3V <> — 3.3V
GND <> — GND
Gx4 X <> — AN0
Gx4 Y <> — AN1
Gx4 Z <> — AN2
ACC X <> — AN3
ACC Y <> — AN4
ACC Z <> — AN5

Också ansluta 3.3V till AREF stiftet på Arduino för mer precision.
Det är mycket viktigt att du inte ansluter sensorn till 5V - detta kommer att förstöra sensorn.

Nu du är redo för att läsa data från sensorn.

Att kommunicera med sensor är enkelt:
Gyrot mäter grader per sekund medan accelerometern mäter acceleration (Gustafssons) i tre dimensioner. Båda utgångarna mätningarna som en analog signal.
För att få detta översatt till grader måste du göra vissa koder:

Gyrot
Först måste du översätta quids (en siffra från 0-1023) till något användbart (detta är för en ADC med en 10 bitars upplösning, till exempel detta bör 4095 (2 ^ 12-1 = 4095) för 12 bitars ADC). Det gör använda jag bara den här enkel ekvation:
gyroRate = (gyroAdc-gyroZero) / känslighet - där gyroAdc är readed värdet från vår sensor, gyroZero är värdet när den är stillastående (detta görs i kod - titta i avsnittet "Installation") medan känslighet är känsligheten i databladet, men översatt till quids.

Om du tittar i de två gyron datablad (http://www.sparkfun.com/datasheets/Sensors/IMU/lpr530al.pdf och http://www.sparkfun.com/datasheets/Sensors/IMU/LY530ALH.pdf) kommer du se att känsligheten är 3.33mV/deg/s för 4xOUT. Att översätta dessa till quids är ganska enkelt: känslighet / 3.3 * 1023.
Så i detta exempel får jag:
0.00333/3.3*1023=1.0323.

Obs: för att översätta mV-V enkla delar bara med tusen.

Den sista ekvationen ut så här:
gyroRate = (gyroAdc-gryoZero) / 1.0323

Resultatet kommer att komma ut som grader per sekund. Att översätta detta till grader du måste veta den exakta tiden efter sista öglan. Lyckligtvis Arduino fick en enkel befalla till göra det: millis(). Genom att använda det, kan en beräkna skillnaden (delta tid) och därmed beräkna vinkeln på gyrot. Den sista ekvationen ut så här:
gyroAngle += gyroRate * dtime/1000

Tyvärr, gyrot drivor över tiden. Det innebär att det inte kan vara betrodda för en längre tid som gått, men det är mycket exakt för en kort tid. Detta är när accelerometern är praktiskt. Det har inte någon drift, men det är alltför instabil för kortare tid. Jag kommer att beskriva hur man kombinerar dessa mätningar på ett tag, men först kommer jag att beskriva hur man översätter avläsningarna från accelerometern till något användbart.

Accelerometern
Accelerometern mäter acceleration (Gustafssons) i tre dimensioner. För att översätta analog avläsningar i grader behöver du bara läsa axel och subtrahera noll offset som så:
accVal = accAdc-accZero

Där accAdc är den analoga avläsningen och accZero är värdet när den läser 0g - detta kan beräknas i början av koden, titta i avsnittet "Installation". Nollvärdet kan också hittas i databladet: http://www.sparkfun.com/datasheets/Components/SMD/adxl335.pdf. Du kommer att se att den noll spänningen på 0g är cirka 1.5V, att översätta detta till quids, du har igen att använda denna ekvation: zeroVoltage / 3.3 * 1023.
Så i detta exempel får jag:
1.5/3.3*1023=465.

Du kan då beräkna planen och rulla med hjälp av följande ekvationer:
pitch = ARCTAN2 (accYval, accZval) + PI
rulle = ARCTAN2 (accXval, accZval) + PI

ARCTAN2 har utgång intervallet - π till π (se http://en.wikipedia.org/wiki/Atan2), jag helt enkelt lägga till π, så spänna det konverteras till 0 till 2π.
Att konvertera den från radianer till grader vi helt enkelt multiplicera resultatet med 57.295779513082320876798154814105 - detta är fördefinierade i Arduino IDE som RAD_TO_DEG.

Kalmanfilter
Som jag förklarade tidigare gyrot är mycket exakt, men tenderar att glida. Accelerometern är lite instabil, men glida inte. Du kan beräkna den exakta vinkeln med hjälp av något som kallas en Kalmanfilter. En detaljerad guide om hur det genomförs finns på min blogg: http://blog.tkjelectronics.dk/2012/09/a-practical-approach-to-kalman-filter-and-how-to-implement-it/.

Om du vill använda något lite mer enkelt, kan du använda vad som kallas ett kompletterande Filter. Det är ganska lätt att förstå och matten är mycket enklare, eftersom det fungerar bara i ett enda steg.
Ekvationen kan till exempel se ut så här:
vinkel = 0,98 *(angle+gyro*dt) + 0,02 * acc - du kan finjustera numrerar till vad du vill. Kom bara ihåg att summan måste vara 1.
För mig var resultatet från kompletterande filtret mycket nära (eller nästan samma) som som beräknats av Kalman-filter.

Du har nu lärt sig (förhoppningsvis) att få analog data från IMU och översätta det till något nyttigt. Jag har fäst min egen kod för min 6DOF IMU (http://www.sparkfun.com/products/10010), men med några lite ändringar, jag är ganska säker på att det är möjligt att använda den med någon analog gyro/accelerometer.

Om du har någon fråga, föll fritt att skriva en kommentar nedan.

Källor:

http://www.Arduino.cc/cgi-bin/yabb2/YaBB.pl?NUM=1284738418
http://www.x-Firm.com/?page_id=148
http://Web.MIT.edu/First/Segway/

Uppdatering
Jag har precis avslutat en behandling kod som skriver ut data från Arduino på en fin graf. Som ni kan se i videon nedan är filtreringen avsluta effektivt. Ljus blå linjen är accelerometern, den lila linjen är gyrot, den svarta linjen är vinkeln beräknas av kompletterande filtret och den röda linjen är vinkeln beräknas av Kalmanfilter. Som ni kanske ser Kalmanfilter är bara lite mer exakt (jag vet att det är svårt att se i videon) än den kompletterande Filter, särskilt när jag skakar den.
Jag har bifogat min kod, både uppdaterad koden för Arduino och bearbetning koden. Det är också möjligt att se data från y-axeln. Kommentera bara bort drawAxisY(); i koden.

Nyaste firmware
Jag beslutat att lägga all källkod på github, eftersom det är mycket lättare att underhålla.
Nyaste koden finns nu på github: https://github.com/TKJElectronics/Example-Sketch-for-IMU-including-Kalman-filter

Min Balancing robot
Nedan är en video av min balanserande robot. Den använder samma IMU och algoritmen som beskrivs i inlägget ovan.

Kickstarter
Jag har just släppt min balanserande robot på kicken: http://www.kickstarter.com/projects/tkjelectronics/balanduino-balancing-robot-kit
Överväg att stödja projektet.

Relaterade Ämnen

Nybörjarens guide till ESP8266 och tweeting med ESP8266

Jag lärde mig om Arduino 2 år sedan. Så började jag spela runt med enkla saker som lysdioder, knappar, motorer etc. Då tänkte jag skulle inte det vara häftigt att ansluta för att göra saker som visar dagens väder, aktiekurser, träna timings på en LCD...

GY-521 MPU6050 3 axel gyroskop och Accelerometer med Arduino

Denna video tutorial går över installation och konfiguration av en GY-521 styrelse med MPU6050 3 axel gyroskop och Accelerometer med en Arduino. Efter några inledande felsökning med kunde jag få komponent fungerar. Först hade jag problem med lös skär...

En svävar sfär roterar lyser och blinkar med Arduino

En svävar lite Dödsstjärnan i Instructables bjöd in mig till det nya projektet med Arduino. Tre principer var beslutat och höll för att skilja den från föregångaren.Gör det själv med någon (eller mindre) färdiga.Hålla roterande.Göra glöd och blinka u...

DH11 Temperatur och luftfuktighetsgivare med Arduino

Detta är en Tutorial på hur man använder DH11 temperatur och luftfuktighetsgivare med Arduino.Steg 1: Titta på denna Video (detta är en fullständig handledning)Denna video visar det fullständiga förfarandet om hur du använder denna Sensor.Steg 2: Ins...

Kolla fuktighet, temperatur och daggpunkt med Arduino

Kolla fuktighet, temperatur och daggpunkt med Arduino uno med DHT11 Sensor genom seriella Monitor.Steg 1: DHT11 givare (luftfuktighet Sensor)Anslutning av tråd.Röd = VCC 5VGrön = Data stiftSvart = jordPIN-konfiguration:Röd = 5VGrön = stift 7Svart = j...

Använda en Accelerometer och gyroskop med Arduino

jag köpte nyligen en kombination 3 axlig accelerometer och 2 axis gyroskop från Sparkfun och jag ville lägga upp några av koden jag brukade få det igång. Jag planerar att använda den i en Arduino baserad MIDI-controller som jag kommer att utstationer...

Seriella Servo Controller w/Arduino - kontroll upp till 12 servon samtidigt med Arduino och en USB-anslutning

jag kommer att visa dig hur du använder din Arduino för att styra upp till 12 servon på en gång med minimal jitter. Med ett enkelt seriellt gränssnitt kan du kontrollera positionen för upp till 12 servo kanaler. Upp till 10 ögonblicksbild positioner...

Steg för steg guide till Micro trollkarl robot controller (Arduino kompatibel)

Micro trollkarl från DAGU är en låg kostnad Arduino kompatibel controller speciellt för nybörjare som vill bygga en liten robot. Styrelsen har ett antal användbara tillbehör inbyggd så att i de flesta fall sköldar är inte obligatoriska och yttre ledn...

16mm Bluetooth + 6/9 DOF gyroskop Wearable styrelsen tala till telefon och programmering med öppen källa redskapen

Du är förmodligen nog av stor volym Arduino validering prototyp och vill du hoppa till nästa steg--bygga en mini/micro storlek riktiga kläder.Dock bränner verktyg som AD att designa din egen PCB kan vara knepigt och iterationer som pengar och tid, es...

Nybörjare guide till installera och konfigurera Octoprint på en Raspberry pi för 3D utskrift

Om du har läst någon av mina andra instructables, mest namnkunniga komplett nybörjare steg för steg, 3D-skrivare med alla delar listor, vet du att jag kommer ihåg min egen frustration på ofullständiga instruktioner och guider även efter jag äntligen...

En trådlös Smart Home (var: hem simulator och larm med Arduino eller Atmega328 (Uppdaterad maj 2016))

Obs: det nu är en android bluetooth kontroll app ibble för detta projektObs: Även om det började som ett projekt simulera min närvaro i hemmet, det har vuxit till ett smart hem, därav titeln jag detta InstructableNär folk är på semester, eller ibland...

Airsoft: En guide till taktik och vård utifrån personliga erfarenheter.

MIssion uttalandeDetta instructable följer min första och har som främsta mål att gå förbi den första vecka eller månad av sporten i airsoft. Jag undvek att kalla det en mellanliggande guide eftersom detta område är mycket vaga; Jag anser inte mig sj...

Hur till hacka EEGEN leksaker med arduino

jag hade hört några år tillbaka om möjligheten för upphakning leksak EEGs så du kan gränssnitt dem med din dator.Jag blev påmind om detta för ett projekt som jag ville göra för en klass (instructable kommer snart ;-)), och jag hittade också en "Star...

Untethered taligenkänning och syntes med Arduino

MOVI står för "Min egen röst Interface" och är en kickstarter-backed Arduino Shield som gör det mycket enkelt att bygga din egen tal dialoger att styra enheter inom Arduino IDE. Denna snabba instructable visar dig hur du kommer igång att inrätta...

Taligenkänning och syntes med Arduino

I min tidigare Instructable visade jag hur man styr ett par lysdioder med en Arduino ombord och BitVoicer Server. I detta Instructable ska jag göra saker lite mer komplicerat. Jag kommer också att syntetisera tal med Arduino DUEdigital till analog om...

Guide till gymnasiet och tonåring liv

livet som tonåring kan vara svårt. Här är en guide till navigera denna period av liv.Steg 1: A.Guide till tonåren, speciellt High School Här är en infographic som innehåller förslag för att lyckas på tonåring liv. Full res version är @ https://drive....

Helgen projektet klocka datum termometer och luftfuktighet med Arduino mega

killar, jag vill dela min helg projekt på att skapa en klocka med fukt och temperaturgivare,Det är med DHT11 sensor, RTC DS1307, LCD 16 x 2 och Arduino Mega 2560,Hålla läsning och lycka tillSteg 1: Förbered alla delar behövs... i detta experiment beh...

Torrent dataöverföring 101 - en guide till VPN och Torrenting.

I denna guide, ska jag lära dig hur du använder en VPN för säkert ladda ner torrents och allmänna spindelväv beter, en offentlig wifi, samt använder geo-låst/begränsade tjänster som Netflix, Hulu, Amazon, Facebook, Songza och alla andra stora webbpla...

Ansluta Raspberry pi till MacOS och Linux med SSH

Du kan använda SSH för att ansluta till din Raspberry Pi från en Linux-dator eller Mac (eller en annan Pi) från terminalen, utan att installera ytterligare programvara.Detta är verkligen användbart om du vill köra din Pi som en "huvudlösa" maski...