TriSense Pro20 min čtení· středně pokročilé

TriSense Pro: gyroskop a akcelerometr

Jak rozchodit IMU čip ICM-42688-P na modulu TriSense Pro — zapojení přes I²C, čtení dat, kalibrace driftu gyroskopu a přechod na rychlé SPI s 20bitovým FIFO.

Obsah návodu9 kapitol
  1. 1Co budete potřebovat
  2. 2Instalace knihovny
  3. 3Zapojení přes I²C
  4. 4Testovací kód
  5. 5Nahrání a test
  6. 6Rychlost čtení: ODR a výkon desky
  7. 7Kalibrace gyroskopu a akcelerometru
  8. 8Zapojení přes SPI
  9. 9Řešení problémů

1Co budete potřebovat

TriSense Pro nese tři samostatné čipy: BMP580 pro tlak a teplotu, AK09918C pro magnetické pole a ICM-42688-P — 3osý akcelerometr a 3osý gyroskop. V tomto návodu rozchodíme právě to IMU.

Pro první testování ho zapojíme k Arduinu Uno přes I²C. Použijeme knihovnu Voltino-TriSense-Library, která umí efektivní čtení přes FIFO i automatickou kalibraci gyroskopu.

  • Modul Voltino TriSense Pro
  • Arduino Uno nebo kompatibilní deska
  • 4–6 propojovacích vodičů (samec–samice)
  • Počítač s Arduino IDE

2Instalace knihovny

Knihovna Voltino TriSense obsahuje třídu ICM42688P psanou přímo pro toto IMU — podporuje I²C i SPI, čtení z FIFO (včetně 20bitového high-res režimu) a správu offsetů. Stačí vložit hlavičku TriSense.h, která zpřístupní všechny tři čipy.

  1. 1Stáhněte knihovnu jako ZIP z repozitáře na GitHubu.
  2. 2V Arduino IDE zvolte Sketch → Include Library → Add .ZIP Library a vyberte stažený soubor.
  3. 3Restartujte Arduino IDE. Knihovna se objeví v File → Examples jako Voltino TriSense.

3Zapojení přes I²C

Modul se připojuje na I²C sběrnici mikrokontroléru. Adresa IMU je standardně 0x68.

VIN5Vlogika Arduina Uno
GNDGNDspolečná zem
SDAA4I²C data
SCLA5I²C hodiny
CSnechte nezapojený
Zapojení TriSense Pro k Raspberry Pi Pico přes I2C, pohled shora
TriSense Pro zapojený k Raspberry Pi Pico přes I²C.

4Testovací kód

Tento sketch inicializuje IMU, nastaví vzorkovací frekvenci na 500 Hz a ve smyčce tiskne zrychlení v g a úhlovou rychlost ve °/s.

ICM42688P_basic_I2C.inoposuňte doprava →
/*
 * Zakladni cteni pres I2C — knihovna Voltino TriSense 1.5.0
 * Pouziva zjednodusene beginI2C() a univerzalni readIMU().
 * Ve vychozim stavu bezi FIFO_NONE (prime cteni registru).
 */

#include <TriSense.h>

ICM42688P IMU;

void setup() {
  Serial.begin(115200);
  while (!Serial) delay(10);

  Serial.println("Starting I2C communication...");

  // Zapne varování knihovny (např. při překročení šířky pásma)
  IMU.setDebug(true);

  // Inicializace I2C. Bez argumentu se pouzije vychozi rychlost
  // knihovny a adresa ICM_ADDR_PRIMARY (0x68).
  // Pro ESP32 s vlastnimi piny:
  //   IMU.beginI2C(400000, ICM_ADDR_PRIMARY, SDA_PIN, SCL_PIN);
  if (!IMU.beginI2C()) {
    Serial.println("Sensor not found on I2C (check wiring or address)!");
    while (1);
  }

  IMU.setODR(ODR_500HZ);   // vzorkovací frekvence

  // --- SEM VLOŽTE KALIBRAČNÍ HODNOTY (až je změříte) ---
  // IMU.setAccelOffset(0.02, -0.01, 0.05);
  // IMU.setAccelScale(1.001, 0.999, 1.002);
  // IMU.setGyroOffset(0.5, -0.2, 0.1);

  Serial.println("Sensor OK. Reading data...");
}

void loop() {
  float ax, ay, az, gx, gy, gz;

  if (IMU.readIMU(ax, ay, az, gx, gy, gz)) {
    Serial.print("Accel [g]: ");
    Serial.print(ax, 3); Serial.print(", ");
    Serial.print(ay, 3); Serial.print(", ");
    Serial.print(az, 3);

    Serial.print(" | Gyro [dps]: ");
    Serial.print(gx, 2); Serial.print(", ");
    Serial.print(gy, 2); Serial.print(", ");
    Serial.println(gz, 2);
  }

  delay(10);
}

5Nahrání a test

  1. 1Připojte Arduino k počítači přes USB.
  2. 2Tools → Board → Arduino Uno.
  3. 3Tools → Port a vyberte správný COM port.
  4. 4Klikněte na Upload.
  5. 5Otevřete Serial Monitor a nastavte 115200 baud.
Serial Monitor · 115200 baud
Sensor OK. Reading data...
Accel [g]: 0.012, -0.004, 0.998 | Gyro [dps]: 0.42, -0.18, 0.07
Accel [g]: 0.011, -0.005, 0.999 | Gyro [dps]: 0.44, -0.17, 0.09
  • Akcelerometr: leží-li modul v klidu na stole, hodnota az má být blízko 1,0 g (gravitace) a ax, ay blízko 0,0 g.
  • Gyroskop: v klidu má být blízko 0 dps — malý offset je normální a odstraníte ho kalibrací. Při pohybu se hodnoty musí okamžitě měnit.

6Rychlost čtení: ODR a výkon desky

ICM-42688-P zvládne výstupní datovou rychlost (ODR) až 32 kHz. Ne každá deska ale takový tok stihne zpracovat.

  • Pro běžné ODR (500 Hz až 1 kHz) je Arduino Uno nebo Nano naprosto dostačující.
  • Nad 8 kHz doporučujeme výkonnější mikrokontrolér, který stihne rychle vyprazdňovat FIFO a nedojde k přetečení — například Raspberry Pi Pico (RP2040) nebo ESP32. Pro takové rychlosti navíc použijte SPI, ne I²C.

7Kalibrace gyroskopu a akcelerometru

Gyroskop má i v naprostém klidu drobnou odchylku — drift, který se při integraci úhlu postupně sčítá. Knihovna proto obsahuje kalibrační nástroj.

  • Příprava: položte modul na rovnou plochu a zajistěte naprostý klid.
  • Gyroskop: pošlete přes Serial znak g. Po chvíli se vypíšou offsety — zapište si je.
  • Akcelerometr: pošlete a a modul postupně otočte do šesti stabilních poloh; v každé potvrďte znakem y. Naměřené hodnoty si také poznamenejte.
ICM42688P_calibration.inoposuňte doprava →
/*
 * Kalibracni nastroj — knihovna Voltino TriSense 1.5.0
 * Změří biasy a škálovací chyby konkrétního kusu čipu.
 * Výsledné hodnoty zkopírujte do setup() svého hlavního programu.
 *
 * OVLÁDÁNÍ (přes Serial Monitor):
 *   'g' -> kalibrace gyroskopu (senzor musí být zcela v klidu)
 *   'a' -> šestibodová kalibrace akcelerometru
 *   'x' -> vynulování offsetů v RAM
 */

#include <TriSense.h>

const uint8_t  CS_PIN   = 17;
const uint32_t SPI_FREQ = 10000000;

ICM42688P IMU;

void setup() {
  Serial.begin(115200);
  while (!Serial) delay(10);

  // Používáte-li I2C, nahraďte tento řádek za IMU.beginI2C();
  if (!IMU.beginSPI(CS_PIN, SPI_FREQ)) {
    Serial.println("IMU not found!");
    while (1);
  }

  Serial.println("ICM-42688-P Connected.");

  // Vypnuté FIFO -> kalibrace běží synchronně v reálném čase
  IMU.setFIFOMode(FIFO_NONE);
  IMU.setODR(ODR_500HZ);

  Serial.println("--------------------------------------");
  Serial.println("Ready to calibrate.");
  Serial.println("Send 'g' to calibrate GYRO.");
  Serial.println("Send 'a' to calibrate ACCELEROMETER.");
  Serial.println("Send 'x' to RESET sensor offsets in RAM.");
  Serial.println("--------------------------------------");
}

void loop() {
  if (Serial.available()) {
    char c = Serial.read();

    if (c == 'g') {
      IMU.autoCalibrateGyro(1000);   // 1000 vzorků
    }
    else if (c == 'a') {
      IMU.autoCalibrateAccel();      // interaktivní 6bodová kalibrace
    }
    else if (c == 'x') {
      IMU.setGyroOffset(0, 0, 0);
      IMU.setAccelOffset(0, 0, 0);
      IMU.setAccelScale(1, 1, 1);
      Serial.println("All offsets reset to zero.");
    }
  }
}

8Zapojení přes SPI

Potřebujete-li vyšší rychlost komunikace, použijte SPI. Vyžaduje čtyři datové piny včetně CS (Chip Select) — v příkladu je CS na pinu D10, ale lze ho změnit.

VIN5Vlogika Arduina Uno
GNDGNDspolečná zem
SID11MOSI
SOD12MISO
SCKD13hodiny
CSD10lze změnit
Zapojení TriSense Pro k Raspberry Pi Pico přes SPI, pohled shora
TriSense Pro zapojený k Raspberry Pi Pico přes SPI.

Pro SPI použijte stejný kód jako v kroku 4, jen v setup() zaměňte inicializaci. Tento příklad navíc zapíná 20bitové FIFO s vysokým rozlišením:

ICM42688P_SPI_hires.inoposuňte doprava →
/*
 * SPI s 20bitovym HIRES FIFO — knihovna Voltino TriSense 1.5.0
 * Ukazuje zapnutí režimu vysokého rozlišení a efektivní
 * vyprazdňování hardwarového bufferu.
 */

#include <TriSense.h>

// CS pin podle desky (17 pro Raspberry Pi Pico, 10 pro Arduino Uno)
const uint8_t CS_PIN = 17;

// 10 MHz vyhovuje ESP32/RP2040. Pro klasická AVR Arduina použijte 4000000.
const uint32_t SPI_FREQ = 10000000;

ICM42688P IMU;

void setup() {
  Serial.begin(115200);
  while (!Serial) delay(10);

  IMU.setDebug(true);

  if (!IMU.beginSPI(CS_PIN, SPI_FREQ)) {
    Serial.println("SPI Communication Error! Check connections.");
    while (1);
  }

  // 20bitové FIFO s vysokým rozlišením
  // Pozor: automaticky zamkne rozsahy na 16 g a 2000 dps
  IMU.setFIFOMode(FIFO_20BIT_HIRES);

  // Je-li požadované ODR nad kapacitu sběrnice,
  // knihovna ho sama sníží na bezpečnou hodnotu.
  IMU.setODR(ODR_1KHZ);

  Serial.print("Actual Output Data Rate applied: ");
  Serial.print(IMU.getODRHz());
  Serial.println(" Hz");
  Serial.println("Setup complete. Starting loop.");
}

void loop() {
  float ax, ay, az, gx, gy, gz;

  // Smyčka while je u FIFO zásadní — rychle vyprázdní buffer,
  // pokud byl mikrokontrolér chvíli zaneprázdněný.
  while (IMU.readIMU(ax, ay, az, gx, gy, gz)) {
    static unsigned long lastPrint = 0;

    // Tiskneme 10x za sekundu, aby se Serial Monitor nezahltil
    if (millis() - lastPrint >= 100) {
      lastPrint = millis();

      Serial.print("A: ");
      Serial.print(ax, 5); Serial.print(", ");   // 5 desetinných míst = 20bit přesnost
      Serial.print(ay, 5); Serial.print(", ");
      Serial.print(az, 5);

      Serial.print(" | G: ");
      Serial.print(gx, 3); Serial.print(", ");
      Serial.print(gy, 3); Serial.print(", ");
      Serial.println(gz, 3);
    }
  }
}

9Řešení problémů

  • „IMU not detected!“: zkontrolujte VCC a GND, ověřte, že napětí na VIN odpovídá logice desky (5 V pro Uno, 3,3 V pro Pico/ESP32), a že nemáte prohozené SDA a SCL.
  • Přetečení FIFO nebo nepravidelná data: ověřte, že Serial Monitor běží na 115200 baud. Nad ODR 8 kHz přejděte na výkonnější desku, nebo frekvenci snižte přes IMU.setODR().
  • Špatná kalibrace: během autoCalibrateGyro() se modul nesmí ani pohnout — i lehké chvění zkreslí výsledek.

Máte data z IMU — co dál?

Samotný gyroskop v čase ujíždí, akcelerometr zase reaguje na každý otřes. Spojením obou (a magnetometru) získáte stabilní orientaci.