Kiihtyvyysanturit vertailussa: MPU-6050, ADXL345 vai BNO055?

Kiihtyvyysanturit näyttävät datalehdissä samanlaisilta, mutta käytännössä kyse on kolmesta eri hintaluokasta ja kolmesta täysin eri käyttötarkoituksesta. Väärä valinta tarkoittaa joko rikkoutunutta anturia (5 volttia ADXL345:n käyttöjännitenastaan), viikkoja suodatinmatematiikkaa tai 30 euron ylihintaa ominaisuuksista, joita et koskaan käytä. Tämä opas kertoo, mihin raja menee.

Lyhyt vastaus: jos tarvitset vain kallistuskulman, tärinämittauksen tai koputustunnistuksen, osta Fermion ADXL345 3-akselinen kiihtyvyysanturi. Jos rakennat tasapainottuvaa robottia tai tarvitset gyroskoopin edullisesti, ota MPU-6050 kiihtyvyysanturi- ja gyroskooppimoduuli. Jos tarvitset absoluuttisen suunnan eli myös kompassisuunnan ilman omaa suodatinkoodia, valitse Fermion BNO055 9-akselinen IMU-anturi.

Loppuosa tästä ostajan oppaasta kertoo, miksi valinta menee juuri noin: mitä kiihtyvyysanturit oikeasti mittaavat, miksi akselien määrä ratkaisee enemmän kuin bittitarkkuus, ja mitkä käytännön kompastuskivet kaatavat useimmat ensimmäiset IMU-projektit.

Sisällysluettelo

  1. Mitä kiihtyvyysanturit oikeasti mittaavat
  2. Miksi akselien määrä ratkaisee
  3. Vertailutaulukko: MPU-6050 vs ADXL345 vs BNO055
  4. Mikä niistä kannattaa ostaa – käyttökohteen mukaan
  5. Kytkentä ja esimerkkikoodi
  6. Yleisimmät virheet
  7. Piirien elinkaari – kannattaako välittää?
  8. Yhteenveto ja ostoslista

Mitä kiihtyvyysanturit, gyroskoopit ja magnetometrit mittaavat

Kiihtyvyysanturi mittaa kiihtyvyyttä (g tai m/s²) jokaisella akselilla. Se näkee sekä staattisen painovoiman että liikkeen aiheuttaman dynaamisen kiihtyvyyden. Painovoima on tässä korvaamattoman arvokas: se antaa vakaan, ryömimättömän vertailusuunnan sille, missä on ”alas”. Heikkous on se, että anturi ei osaa erottaa kallistusta kiihdytyksestä – jos robotti kiihdyttää eteenpäin, kiihtyvyysanturi väittää sen nokan nousseen. Lisäksi pystyakselin ympäri tapahtuvaa kääntymistä (yaw) kiihtyvyysanturi ei havaitse lainkaan, koska painovoimavektorin ympäri pyöriminen ei muuta lukemaa.

Gyroskooppi mittaa kulmanopeutta (°/s). Integroimalla kulmanopeus ajan yli saadaan kulman muutos. Gyro on nopea eikä välitä lineaarisesta kiihtyvyydestä, joten se hoitaa lyhyen aikavälin dynamiikan täydellisesti. Heikkous on ryömintä: pienikin nollapistevirhe kertyy integroinnissa jatkuvasti kasvavaksi kulmavirheeksi. Kalibroimattomalla MPU-6050:llä pöytätestissä nähdään tyypillisesti noin asteen ryömintä kymmenessä sekunnissa. Yksin gyroskoopilla ei ole mitään absoluuttista vertailusuuntaa.

Magnetometri mittaa magneettivuon tiheyttä (µT) ja toimii kompassina: se antaa absoluuttisen suunnan magneettiseen pohjoiseen. Heikkous on ympäristö. Neodyymimagneetit, teräsrunko, harjallisten moottorien harjat ja suuret virrat vääristävät kentän. Nyrkkisääntö on pitää IMU-anturi vähintään 5 cm päässä moottoreista, ESC:istä ja magneeteista – muuten magnetometrin kalibrointipallo litistyy ellipsoidiksi ja absoluuttinen suunta on pilalla.

Miksi akselien määrä ratkaisee

Markkinoinnissa puhutaan sekaisin akseleista ja vapausasteista (DoF): 6-akselinen IMU = 6 DoF, 9-akselinen IMU = 9 DoF. Käytännön ero on tämä:

  • 3-akselinen (ADXL345): pelkkä kiihtyvyys. Saat kallistuksen, iskut ja tärinän – et kääntymistä pystyakselin ympäri.
  • 6-akselinen IMU (MPU-6050): kiihtyvyys + gyro. Kun nämä yhdistetään anturifuusiolla, anturien heikkoudet kumoavat toisensa: kiihtyvyysanturi antaa pitkän aikavälin absoluuttisen pitch- ja roll-kulman, gyro antaa lyhyen aikavälin tasaisuuden. Yaw kuitenkin ryömii, koska sille ei ole absoluuttista vertailua.
  • 9-akselinen IMU (BNO055): kiihtyvyys + gyro + magnetometri. Magnetometri ankkuroi yaw-kulman, jolloin saat aidosti absoluuttisen asennon – kaikki kolme kulmaa ilman ryömintää.

Anturifuusio tarkoittaa käytännössä komplementaarista suodatinta (tyypillisesti noin 0,98 × gyrosta integroitu kulma + 0,02 × kiihtyvyysanturin kulma jokaisella kierroksella) tai Kalman-suodatinta. Tässä on kolmen anturin suurin todellinen ero: MPU-6050:llä sinä kirjoitat tai kopioit suodattimen isäntämikro-ohjaimelle (tai käytät piirin sisäistä DMP-yksikköä), kun taas BNO055 laskee fuusion itse omalla Cortex-M0+ -ytimellään ja syöttää valmiit Euler-kulmat ja kvaterniot I2C-väylälle.

Vertailutaulukko: MPU6050 vs ADXL345 vs BNO055

Ominaisuus MPU-6050 ADXL345 BNO055
Akselit 6 (3 kiiht. + 3 gyro) 3 (vain kiihtyvyys) 9 (kiiht. + gyro + magn.)
Hinta 4,89 € 14,90 € 34,90 €
SKU SEN-MPU-6050-IMU-MODULE SEN-ADXL345-FERMION SEN-BNO055-FERMION
Absoluuttinen asento suoraan? Ei – pitch/roll oman suodattimen jälkeen, yaw ryömii Ei – pelkkä kallistus Kyllä – Euler-kulmat ja kvaternio valmiina
Kiihtyvyysalue ±2/4/8/16 g ±2/4/8/16 g ±2/4/8/16 g
Kiiht. resoluutio 16 bittiä 13 bittiä @ ±16 g (4 mg/LSB) 14 bittiä
Gyro ±250…±2000 °/s, 16 bittiä ±125…±2000 °/s, 16 bittiä
Magnetometri Ei (ulkoinen XDA/XCL-apuväylän kautta) Ei ±1300 µT (X, Y), ±2500 µT (Z), n. 0,3 µT
Liitäntä Vain I2C (0x68/0x69, AD0) I2C (0x53/0x1D) ja SPI 3-/4-johtiminen I2C 0x28/0x29 (juotoshyppy)
Käyttöjännite 3–5 V (moduulissa 3,3 V regulaattori) 2,0–3,6 V, vain 3,3 V logiikka 3,3–5,5 V, 5 V-sietoinen I2C
Virrankulutus n. 3,9 mA n. 40 µA mittaustilassa, 0,1 µA valmiustilassa n. 12 mA NDOF-tilassa
Näytteenottotaajuus n. 1 kHz jopa 3200 Hz ODR fuusiolähtö 100 Hz
Erikoisominaisuudet DMP-liikeprosessori, lämpöanturi, apu-I2C-väylä Yksois-/kaksoiskoputus, vapaa pudotus, aktiivisuustunnistus, 32-tasoinen FIFO, 2 keskeytyslähtöä Sisäinen anturifuusio (NDOF, IMU, COMPASS, M4G, AMG), lineaarikiihtyvyys- ja painovoimavektori
Piikkirimat Valmiiksi juotettu Irtorima, juota itse Irtorima, juota itse
Koko n. 21 × 16 × 3 mm n. 20 × 15 mm 19 × 21 mm

Huomaa, että bittitarkkuus on tässä taulukossa vähiten merkittävä rivi. Kaikkien kolmen kohinataso on käytännössä suurempi kuin viimeisten bittien resoluutio, joten ADXL345:n 13 bittiä ei ole todellinen rajoite. Ratkaisevat rivit ovat akselit, absoluuttinen asento, käyttöjännite ja virrankulutus.

Mikä niistä kannattaa ostaa – käyttökohteen mukaan

Kallistus, koputus, pudotus ja paristokäyttö → ADXL345

Fermion ADXL345 3-akselinen kiihtyvyysanturi
Fermion ADXL345 3-akselinen kiihtyvyysanturi – kynnenkokoinen, 40 µA mittausvirta, I2C ja SPI. Paras valinta kallistukseen, tärinään ja paristokäyttöön.

ADXL345:n koputus-, kaksoiskoputus-, vapaapudotus- ja aktiivisuustunnistus toimivat raudassa ja nostavat keskeytyspiikin, joten mikro-ohjain voi nukkua ja herätä vasta liikkeestä. 40 µA mittausvirta tekee siitä ylivoimaisen paristokäyttöisissä loggereissa ja puettavassa elektroniikassa. Älä osta gyroskooppia, jota et käytä. Muista kuitenkin jännite: anturi ei siedä 5 volttia, joten pariksi kannattaa ottaa 3,3 voltin kortti, kuten ESP32-C6 DevKitC-1.

3D-tulostimen resonanssimittaus ja Klipperin input shaper → ADXL345 SPI-väylällä

Klipperissä on natiivituki ADXL345:lle, ja se on käytännössä standardianturi input shaper -kalibrointiin. Korkeat 1600/3200 Hz:n näytteenottotaajuudet vaativat SPI-väylän (vähintään 2 MHz), joten kytke anturi SPI:llä, älä I2C:llä. Fermion-kortti – kynnenkokoinen, ilman valmiiksi juotettuja rimoja ja lähes massaton – on juuri sitä, mitä tulostuspäähän halutaan.

Huomaa myös, että Klipperin resonanssimittaus on kertaluonteinen kalibrointi: sama anturi kiertää helposti useamman tulostimen välillä.

Tasapainottuva robotti, eleohjaus, edullinen asennonmittaus → MPU-6050

MPU-6050 kiihtyvyysanturi- ja gyroskooppimoduuli
MPU-6050 kiihtyvyysanturi- ja gyroskooppimoduuli – 6-akselinen IMU valmiiksi juotetuilla rimoilla ja 3–5 V syötöllä.

Tasapainottuva robotti tarvitsee vain yhden akselin kallistuskulman, ja se saadaan fuusioimalla kiihtyvyysanturi ja gyro. 4,89 eurolla tämä on halvin tapa saada gyroskooppi, ja oppimateriaalin määrä on vertaansa vailla: komplementaarinen suodatin, Kalman-koodi, PID-tasapainoesimerkit ja DMP-kirjastot löytyvät valmiina. Valmiiksi juotetut rimat, 3–5 V syöttö ja Dupont-hyppylangat tarkoittavat, että ensimmäinen lukema on minuuteissa. Moottorien ohjaukseen sopii samasta valikoimasta L298N duaali H-silta -ohjain. Hyväksy vain se, että suodatin on sinun vastuullasi ja että yaw ryömii.

Absoluuttinen suunta, gimbaalit, AHRS ja AR/VR → BNO055

Fermion BNO055 9-akselinen IMU-anturi
Fermion BNO055 9-akselinen IMU-anturi – sisäinen Cortex-M0+ laskee anturifuusion ja syöttää valmiit Euler-kulmat sekä kvaterniot.

BNO055 on kolmikosta ainoa, joka antaa pitch-, roll- ja yaw-kulmat asteina ilman ryömintää yhdellä I2C-luvulla ja ilman riviäkään suodatinkoodia. Lisäksi saat lineaarikiihtyvyyden (painovoima poistettuna), painovoimavektorin ja kvaterniot 100 Hz:n tahdilla. 34,90 € kannattaa maksaa täsmälleen silloin, kun vaihtoehto on viettää viikkoja fuusiomatematiikan kanssa. Kiinnitä kortti jäykästi metalloitujen kiinnitysreikien kautta ja pidä magneettinen hygienia kunnossa.

Päätössääntö kolmessa kysymyksessä: Pitääkö minun tietää, missä on pohjoinen? → BNO055. Tarvitsenko kulmanopeutta tai vakaata pitch/roll-kulmaa liikkeen aikana? → vähintään MPU-6050. Riittääkö, että tiedän, missä on alas, tai että jotain koputettiin, pudotettiin tai tärisi? → ADXL345.

Kytkentä ja esimerkkikoodi

Kiihtyvyysanturi Arduinoon: MPU-6050

Kytkentä Arduino Unoon: VCC→5 V, GND→GND, SCL→A5, SDA→A4, AD0 auki (osoite 0x68), INT→D2 jos haluat data-ready-keskeytyksen. Kevyt MPU6050_light-kirjasto laskee kallistuskulmat valmiiksi:

#include "Wire.h"
#include <MPU6050_light.h>
MPU6050 mpu(Wire);

void setup() {
  Serial.begin(115200);
  Wire.begin();
  byte status = mpu.begin();
  while (status != 0) { }          // pysähdy, jos anturia ei löydy
  Serial.println("Lasketaan offsetit, ala liikuta anturia");
  delay(1000);
  mpu.calcOffsets();               // gyron ja kiihtyvyysanturin nollapisteet
}

void loop() {
  mpu.update();
  Serial.print("X : "); Serial.print(mpu.getAngleX());
  Serial.print("\tY : "); Serial.println(mpu.getAngleY());
  delay(10);
}

ADXL345 ilman kirjastoa – suoraan rekistereistä

Kytkentä 3,3 V kortille: VCC→3V3, GND→GND, SDA→SDA, SCL→SCL, /CS→3V3 (I2C vaatii CS:n ylhäällä), SDO→GND osoitteelle 0x53. Datalehti on poikkeuksellisen luettava, joten pärjäät pelkällä Wire-kirjastolla:

#include <Wire.h>
#define ADXL345 0x53          // 7-bittinen I2C-osoite (SDO maahan)

void setup() {
  Serial.begin(115200);
  Wire.begin();
  Wire.beginTransmission(ADXL345);
  Wire.write(0x2D);           // POWER_CTL
  Wire.write(0x08);           // mittaustila
  Wire.endTransmission();
  Wire.beginTransmission(ADXL345);
  Wire.write(0x31);           // DATA_FORMAT
  Wire.write(0x0B);           // taysi resoluutio, +-16 g
  Wire.endTransmission();
}

void loop() {
  Wire.beginTransmission(ADXL345);
  Wire.write(0x32);                       // DATAX0, 6 databyten alku
  Wire.endTransmission(false);
  Wire.requestFrom(ADXL345, 6, true);
  int16_t x = Wire.read() | (Wire.read() << 8);
  int16_t y = Wire.read() | (Wire.read() << 8);
  int16_t z = Wire.read() | (Wire.read() << 8);
  float ax = x * 0.0039, ay = y * 0.0039, az = z * 0.0039;   // 3,9 mg/LSB -> g
  float roll  = atan2(ay, az) * 180.0 / PI;
  float pitch = atan2(-ax, sqrt(ay*ay + az*az)) * 180.0 / PI;
  Serial.print(roll); Serial.print("  "); Serial.println(pitch);
  delay(50);
}

Muut hyödylliset rekisterit: BW_RATE 0x2C (näytteenottotaajuus), THRESH_TAP 0x1D ja DUR 0x21 (koputus), THRESH_FF 0x28 ja TIME_FF 0x29 (vapaa pudotus), INT_ENABLE 0x2E ja INT_MAP 0x2F (keskeytysten ohjaus piikeille).

ADXL345 SPI-väylällä (Klipper / korkea näytteenotto)

Nelijohtiminen SPI vaatii, että DATA_FORMAT-rekisterin bitti 6 on nolla (SPI = 0 tarkoittaa nelijohtimista tilaa), ja kellotaajuuden on oltava enintään 5 MHz. Kytkentä esimerkiksi Raspberry Pi:hin:

  • VCC → 3V3 (pinni 1), GND → GND (pinni 6)
  • SDO (MISO) → GPIO9 / pinni 21
  • SDA (MOSI) → GPIO10 / pinni 19
  • SCL (SCLK) → GPIO11 / pinni 23
  • /CS → GPIO8 / pinni 24 (CE0)

Klipperin printer.cfg-osio näyttää tältä:

[mcu rpi]
serial: /tmp/klipper_host_mcu

[adxl345]
cs_pin: rpi:None
spi_bus: spidev0.0
axes_map: x,y,z

[resonance_tester]
probe_points: 100, 100, 20
accel_chip: adxl345

Testaa yhteys komennolla ACCELEROMETER_QUERY – anturin ollessa vaakatasossa lukemien pitäisi olla noin 0, 0 ja 9800 mm/s². Aja sen jälkeen SHAPER_CALIBRATE AXIS=X.

Komplementaarinen suodatin MPU-6050:lle omin käsin

Jos et halua kirjaston mustaa laatikkoa, tässä on koko anturifuusion ydin muutamalla rivillä. Gyro hoitaa nopeat muutokset, kiihtyvyysanturi korjaa hitaan ryöminnän:

const float ALPHA = 0.98;     // 0,98 gyrolle, 0,02 kiihtyvyysanturille
float pitch = 0;
unsigned long tPrev = 0;

void loop() {
  unsigned long tNow = micros();
  float dt = (tNow - tPrev) / 1000000.0;   // aika-askel sekunneissa
  tPrev = tNow;

  // ax, ay, az yksikössä g; gy yksikössä °/s (lue rekistereistä)
  float pitchAcc = atan2(-ax, sqrt(ay*ay + az*az)) * 180.0 / PI;
  pitch = ALPHA * (pitch + gy * dt) + (1.0 - ALPHA) * pitchAcc;

  Serial.println(pitch);
}

Aikavakio on tau = ALPHA * dt / (1 - ALPHA). Arvoilla ALPHA = 0,98 ja dt = 10 ms se on noin 0,5 s: sitä nopeammat muutokset tulevat gyrosta, hitaammat kiihtyvyysanturista. Jos kulma tuntuu laiskalta, pienennä ALPHA-arvoa; jos se tärisee kiihdytyksissä, kasvata sitä. Tämän vaiheen BNO055 tekee puolestasi.

BNO055: Euler-kulmat suoraan

Kytkentä Arduino Unoon: VCC→5 V, GND→GND, SCL→A5, SDA→A4. Asenna kirjastonhallinnasta ”Adafruit Unified Sensor” ja ”Adafruit BNO055” (myös DFRobot_BNO055 toimii).

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
#include <utility/imumaths.h>

Adafruit_BNO055 bno = Adafruit_BNO055(55);

void setup(void) {
  Serial.begin(9600);
  if (!bno.begin()) {
    Serial.print("BNO055 ei vastaa - tarkista kytkenta tai I2C-osoite!");
    while (1);
  }
  delay(1000);
  bno.setExtCrystalUse(true);   // ulkoinen kristalli, tarkempi ajoitus
}

void loop(void) {
  sensors_event_t event;
  bno.getEvent(&event);
  Serial.print("X: ");   Serial.print(event.orientation.x, 4);  // heading / yaw
  Serial.print("\tY: "); Serial.print(event.orientation.y, 4);  // roll
  Serial.print("\tZ: "); Serial.print(event.orientation.z, 4);  // pitch
  Serial.println("");
  delay(100);
}

Huomaa NDOF-tilan kalibrointilogiikka: kun järjestelmän kalibrointitila on 0, anturi ei ole vielä löytänyt magneettista pohjoista ja kulmat ovat suhteellisia, eivät absoluuttisia. Hylkää data siihen asti ja pyöritä korttia hitaina kahdeksikkoina, kunnes magnetometrin kalibrointitila on 3. Offsetit voi tallentaa ja palauttaa käynnistyksessä.

Kalibrointitilan lukeminen on yksi kutsu – lisää tämä aina ensimmäiseen prototyyppiin, muuten et tiedä, onko data luotettavaa:

uint8_t sys, gyroCal, accelCal, magCal;
bno.getCalibration(&sys, &gyroCal, &accelCal, &magCal);
Serial.print("SYS:"); Serial.print(sys);
Serial.print(" G:"); Serial.print(gyroCal);
Serial.print(" A:"); Serial.print(accelCal);
Serial.print(" M:"); Serial.println(magCal);
// 0 = kalibroimaton, 3 = täysin kalibroitu
if (bno.isFullyCalibrated()) {
  // vasta nyt Euler-kulmat ovat absoluuttisia
}

Gyro kalibroituu itsestään, kun kortti on hetken paikallaan. Kiihtyvyysanturi vaatii kortin kääntämistä kuudessa eri asennossa (kukin sivu alaspäin, muutama sekunti kerrallaan). Magnetometri kalibroituu hitailla kahdeksikoilla ilmassa. Kun isFullyCalibrated() palauttaa toden, lue offsetit getSensorOffsets()-kutsulla EEPROMiin ja palauta ne käynnistyksessä – säästät käyttäjältä kahdeksikkotanssin jokaisella boottauksella.

Yleisimmät virheet ostajan tarkistuslistana

  1. Jännite. ADXL345 kestää enintään 3,6 V. Sen kytkeminen Arduino Unon 5 voltin nastaan rikkoo anturin. MPU-6050-moduuli ja BNO055 sietävät 5 V.
  2. Piikkirimat. Fermion-kortit (ADXL345 ja BNO055) toimitetaan irrallisen piikkiriman kanssa – tarvitset juotoskolvin. MPU-6050 on valmiiksi juotettu ja lähtee suoraan hyppylangoilla.
  3. I2C-osoitteet. 0x68/0x69, 0x53/0x1D ja 0x28/0x29 – kaikki kolme mahtuvat samalle väylälle ilman törmäystä.
  4. BNO055 ja multiplekserit. Piirin I2C-toteutus rikkoo protokollaa joissain tilanteissa eikä toimi luotettavasti I2C-multiplekserin (esim. TCA9548A) takana.
  5. Kalibrointi. MPU-6050 tarvitsee offsettien laskennan vaakasuoralla alustalla käynnistyksessä, BNO055 magnetometrin kahdeksikot.
  6. Mekaaninen jäykkyys. Kaikki kiinnityksen löysyys näkyy kohinana kulmadatassa. Käytä kiinnitysreikiä – kuumaliima ja löysällä lepattavat johdot pilaavat asentodatan.
  7. Magneettinen hygienia. BNO055 vähintään 5 cm päähän moottoreista, ESC:istä, kaiuttimista ja neodyymimagneeteista; älä käytä terästä kiinnikkeenä.
  8. Väylänopeus vs. näytteenotto. Älä valitse ADXL345:lle 1600/3200 Hz:n näytteenottotaajuutta I2C:llä – näytteitä katoaa. Käytä SPI:tä.

Piirien elinkaari – kannattaako välittää?

Rehellisyyden nimissä: TDK on merkinnyt MPU-6050:n vanhentuneeksi (suositeltu korvaaja on ICM-42670-P) ja Bosch on siirtänyt BNO055:n ”not recommended for new designs” -tilaan. ADXL345 on kolmikosta ainoa normaalissa tuotannossa. Harrastajalle tai kurssiprojektille tämä ei tarkoita mitään: moduuleja valmistetaan edelleen massoittain, eikä piirin elinkaarimerkintä tee olemassa olevasta kortista yhtään huonompaa siinä, mitä se tekee. Merkitystä on vain, jos suunnittelet kaupallista tuotetta, jonka komponenttien saatavuuden pitää kestää 5–10 vuotta – siinä tapauksessa älä rakenna tuotetta näiden kahden piirin varaan.

Yhteenveto ja ostoslista

Kiihtyvyysanturit eivät ole keskenään vaihtokelpoisia komponentteja vaan kolme eri työkalua. Valitse akselimäärä sen mukaan, mitä fysikaalista suuretta oikeasti tarvitset – ei sen mukaan, mikä on halvin tai kallein. Epävarmassa tilanteessa aloita MPU-6050:stä: viidellä eurolla opit anturifuusion perusteet, ja jos huomaat tarvitsevasi absoluuttisen suunnan, BNO055 on aina saatavilla.

Kaikki kolme anturia sekä niihin sopivat kortit, hyppylangat ja moottoriohjaimet löytyvät varastostamme. Tutustu valikoimaamme ja lisää tarvitsemasi suoraan koriin:

Tarvitsetko apua valinnassa tai kytkennässä? Selaa koko anturivalikoimaamme Protocachessa – varastotuotteet lähtevät nopeasti Suomen sisällä.