Obsah návodu9 kapitol
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.
- 1Stáhněte knihovnu jako ZIP z repozitáře na GitHubu.
- 2V Arduino IDE zvolte Sketch → Include Library → Add .ZIP Library a vyberte stažený soubor.
- 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 UnoGNDGNDspolečná zemSDAA4I²C dataSCLA5I²C hodinyCS—nechte nezapojený
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.
/*
* 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
- 1Připojte Arduino k počítači přes USB.
- 2Tools → Board → Arduino Uno.
- 3Tools → Port a vyberte správný COM port.
- 4Klikněte na Upload.
- 5Otevřete Serial Monitor a nastavte 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
azmá být blízko 1,0 g (gravitace) aax,ayblí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
aa modul postupně otočte do šesti stabilních poloh; v každé potvrďte znakemy. Naměřené hodnoty si také poznamenejte.
/*
* 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 UnoGNDGNDspolečná zemSID11MOSISOD12MISOSCKD13hodinyCSD10lze změnit
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:
/*
* 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.