Jste zde

Sledování pohybu v 9-ti osách snadno a rychle

Díky rostoucímu počtu nositelné elektroniky rostou požadavky na implementaci funkce sledování pohybu. Existuje široké spektrum snímačů pohybu, ale jejich rychlá integrace do bateriových zařízení není jednoduchá obzvláště při současném využití dalších snímačů. Sledování pohybu si vyžaduje implementaci akcelerometru, gyroskopu, magnetometru a výkonného mikroprocesoru.

Tento článek představí řešení od společnosti TDK InvenSense, které pomůže s hardwarem i se softwarem. Ukážeme si, jak toto řešení usnadní vývoj komplexních nízkoenergetických multi-senzorových aplikací.

Efektivní sledování pohybu

Sledování pohybu není jednoduchá záležitost a často se setkáme s integračními problémy v hardware i v software. Na straně hardwaru se snažíme minimalizovat složitost, velikost a množství součástek. Na straně software musíme věnovat zvláštní pozornost tomu, abychom synchronizovali různorodé výstupy snímačů a vytvořili jednotný tok dat potřebný pro výpočetní algoritmy. Pomocí ICM-20948 od TDK InvenSense rychle vytvoříte aplikaci se sledováním pohybu.

Čip pro sledování pohybu

TDK InvenSense ICM-20948 měří pouze 3 x 3 x 1 mm. Jedná se o multi-čipový modul, který má v sobě integrovány všechny potřebné senzory, filtry, digitální převodníky a důležité obvody pro zjištění všech informací o pohybu daného zařízení (obrázek 1).

Obrázek 1: TDK InvenSense ICM-20948 umožňuje sledování pohybu prostřednictvím integrovaných senzorů, programovatelných filtrů, rozhraní a digitálního procesoru pohybu - DMP digital motion processor. (Zdroj obrázku: TDK InvenSense)

Spotřeba modulu je přibližně 3 mA v plném provozu. U bateriových aplikací lze využívat možnost vypnutí některých částí modulu, čímž se můžeme dostat až na spotřebu 8 μA - režim plného spánku. Výsledná spotřeba závisí na provozním napětí VDD, které se může pohybovat od 1,71V do 3,6 V.

V modulu jsou integrovány samostatné signálové cesty, které podporují každý kanál integrovaného tříosého akcelerometru, gyroskopu, magnetometru a také výstup z teplotního čidla. Každá signální cesta obsahuje vyrovnávací zesilovač a 16bitový analogově digitální převodník (ADC) spolu se specifickými obvody, jako jsou zdroje proudu pro ovládání modulu Hall Effect magnetometru.

Výstup magnetometru prochází aritmetickým obvodem pro základní zpracování signálu, zatímco výstupy z ostatních snímačů vstupují do vlastních upravovacích obvodů jako je například průměrování vzorků. Modul ICM-20948 může pro gyroskop nastavit průměrování ze 128 vzorků a pro akcelerometr nastavit průměrování ze 32 vzorků. Výsledky ze všech signálových cest jsou uloženy do sady definovaných registrů.

V srdci ICM-20948 se nachází proprietární digitální pohybový procesor (DMP), který nabízí širokou škálu funkcí. Například algoritmy pro zpracování pohybu, kalibrace a self-testy. Během normálního provozu DMP zpracovává data z definovaných registrů. Potom uloží výsledky do integrovaného modulu FIFO, kde jsou přístupna hostitelskému MCU prostřednictvím sběrnice I2C nebo SPI.

Kombinace DMP a FIFO hraje důležitou roli pro mnoho aplikací. Aby se snížila celková spotřeba energie, je možné hostitelský procesor uvést do stavu spánku. Algoritmy sledování pohybu však probíhají dále uvnitř modulu a výsledky se zapisují do příslušných registrů. Hostitelský procesor si je vyčte tehdy, kdy si o to aplikace požádá. Schopnost DMP udržovat vysokou míru aktualizací bez účasti hostitele pomáhá zajistit přesnost bez vysokých požadavků na výkon nebo spotřebu energie na samotnou hostitelskou aplikaci.

Jednoduchá integrace

Miniaturní rozměry, integrovaný systém vyhodnocení senzorů a nezávislý provoz činí model ICM-20948 zvlášť vhodný pro použití v mobilních bateriových zařízeních. Vysoká integrace modulu znamená, že sledování pohybu do svého návrhu implementujete pouze se třemi kondenzátory. TDK InvenSense doporučuje použit keramický kondenzátor X7R s hodnotou 0,1 μF na pin REGOUT pro filtrování regulátoru a na piny VDD a VDDIO pro filtrování napájení (obrázek 2).

Obrázek 2: Jednoduchá implementace ICM-20948. Komunikace mezi modulem a hostitelským MCU zajišťuje rozhraní SPI (zobrazeno na obrázku) nebo rozhraní I2C, které používá stejnou konfiguraci, ale s pinem 22(nCS) připojeným k VDDIO . (Zdroj obrázku: TDK InvenSense)

Mnohé aplikace požadují využívat data i s jiných typů senzorů. Pro realizaci aplikace s více senzory lze využít samostatné rozhraní I2C zabudované přímo v modulu ICM-20948 a pomocí něj připojit další externí senzory (obrázek 3).

Obrázek 3: Paralelně s SPI (nebo I2C) k hostitelskému MCU lze použít pomocné rozhraní I2C modulu TDK InvenSense ICM-20948 (AUX_CL a AUX_DA) pro připojení externích snímačů. Pro jejich správu lze využít speciální registry v  ICM-20948. (Zdroj obrázku: TDK InvenSense)

Při normálním provozu ICM-20948 funguje jako master na sběrnici I2C v komunikaci s externími senzory. Vývojáři nastaví sadu registrů, kde jsou uloženy adresy I2C externích zařízení, adresy pro uložení výstupních dat a další parametry přenosu. Díky tomu může modul číst data z externího snímače a ukládat je do FIFO paměti bez pomoci hostitelského procesoru.

ICM-20948 poskytuje další funkce navržené speciálně pro koordinování časování mezi ICM-20948 a externími snímači. Kromě používání pinu přerušení INT (interrupt) můžeme také řídit pin FSYNC pro přerušení nebo synchronizaci s externím snímačem. Například v aplikaci pro stabilizaci obrazu lze použít synchronizační výstup snímače obrazu pro synchronizaci obrazových dat se snímači v ICM-20948. Pomocí registru FSYNC_CONFIG můžeme nakonfigurovat modul tak, aby změřil čas mezi událostí na pinu FSYNC externího snímače a datovou událostí ICM-20948, což zajistí přesnější synchronizaci mezi obrazovými a pohybovými daty.

Modul ICM-20948 není schopen nakonfigurovat externí senzory. Proto modul poskytuje režim průchodu pomocí integrovaného multiplexeru pro propojení hostitelského systémového procesoru přímo s externím čidlem. V režimu průchodu modul používá integrované analogové spínače k ​​připojení I2C pinů AUX_CL (pin 7) a AUX_DA (pin 21) přímo na hostitelskou sběrnici I2C (kolíky 23 a 24). Tento speciální režim nabízí jednoduchou cestu, která umožňuje hostitelskému procesoru provést konfiguraci každého externího senzoru. Po inicializaci se deaktivuje tento bypass, aby ICM-20948 převzal opět komunikaci s externím senzorem.

Rychlý vývoj

Ačkoli implementace ICM-20948 je jednoduchá, někdy je vhodné zvolit i hotové hardwarové řešení. Vývojová deska TDK InvenSense DK-20948 poskytuje vývojovou platformu, která obsahuje hostitelské MCU, integrovaný debugger, rozhraní USB a mnoho konektorů pro připojení dalších senzorů nebo bezdrátové konektivity (obr. 4).

Obrázek 4: Deska TDK InvenSense DK-20948 poskytuje kompletní řešení snímání pohybu. Obsahuje modul ICM-20948 s ATSAMG55J19B od Microchip Technology (levá strana) a integrovaný debugger založený na AT32UC3A4256  (umístěném na zadní straně desky). (Zdroj obrázku: TDK InvenSense)

Základ desky DK-20948 tvoří ATSAMG55J19B MCU a představuje kompletní řešení sledování pohybu pomocí ICM-20948. Dále obsahuje desku AT32UC3A4256 MCU, která poskytuje možnost ladění celého systému, čímž eliminuje potřebu externích nástrojů při práci s hostitelským ATSAMG55. Vývojáři mohou ihned začít využívat vlastnosti modulu ICM-20948 a rozšířit tento hardware pomocí dostupných desek. Pro vyzkoušení různých konfigurací a jejich dopad na výsledná data o pohybu je k dispozici nástroj MotionLink GUI a softwarový balíček, který se většinou později stane hlavním zdrojem informací.

Vlastní software

Softwarový balíček TDK InvenSense eMD obsahuje dokumentaci API rozhraní, zdrojový kód driveru a přednastavený firmware pro DMP. Součástí balíčku jsou také nástroje pro příkazovou řádku pro komunikaci s deskou. Je navržen pro použití s ​​Atmel / Microchip Technology Atmel Studio. Software eMD obsahuje dva typy Atmel Studia: Core a App. Core obsahuje ovladače, firmware potřebný pro programování a ovládání ICM-20948, speciální algoritmy a matematické soubory pro hostitelský MCU ATSAMG55J19B. App obsahuje ukázkovou aplikaci, která demonstruje použití core balíčku. Například jak hlavní rutina inicializuje ICM-20948 a získává potřebná data (výpis 1).

int main (void)
{
   . . .
  
    /* Initialize icm20948 serif structure */
   struct inv_icm20948_serif icm20948_serif;
   icm20948_serif.context   = 0; /* no need */
   icm20948_serif.read_reg  = idd_io_hal_read_reg;
   icm20948_serif.write_reg = idd_io_hal_write_reg;
   icm20948_serif.max_read  = 1024*16; /* max num bytes allowed per serial read */
   icm20948_serif.max_write = 1024*16; /* max num bytes allowed per serial write */
 
   icm20948_serif.is_spi    = interface_is_SPI();
 
   . . .
  
    * Setup the icm20948 device */
   icm20948_sensor_setup();
 
   /*
    * Now that Icm20948 device was initialized, proceed with DMP image loading
    * This step is mandatory as DMP image are not store in non volatile memory
    */
 
   load_dmp3();
 
   /*
    * Initialize Dynamic protocol stuff
    */
   DynProTransportUart_init(&transport, iddwrapper_transport_event_cb, 0);
   DynProtocol_init(&protocol, iddwrapper_protocol_event_cb, 0);
 
   /*
    * Initializes the default sensor ODR in order to properly init the algorithms
    */
   sensor_configure_odr(period_us);
 
   InvScheduler_init(&scheduler);
 
   . . .
  
   while (1) {
      InvScheduler_dispatchTasks(&scheduler);
 
      if (irq_from_device == 1) {
         inv_icm20948_poll_sensor(&icm_device, (void *)0, build_sensor_event_data);
 
         __disable_irq();
         irq_from_device = 0;
         __enable_irq();
      }
   }
 
   return 0;
}

Výpis 1: Ukázkový zdrojový kód uvedený v softwarovém balíčku DK-20948 eMD SmartMotion je určen k seznámení se s klíčovými funkcemi, jako je inicializace ICM-20948 a funkce k dotazování snímačů (Zdroj kódu: TDK InvenSense)

Při programování ICM-20948 se často setkáme se složitou konfigurací a s velkým počtem softwarových komponent potřebných pro efektivní ovládání. Core balíček eMD do značné míry eliminuje tuto složitost prostřednictvím řady softwarových struktur a servisní vrstvy. Například klíčová struktura softwaru inv_icm20948 shromažďuje všechna data a metadata potřebná k ovládání ICM-20948 včetně definice sériového rozhraní (výpis 2).

/** @brief ICM20948 serial interface */
struct inv_icm20948_serif {
       void *     context;
       int      (*read_reg)(void * context, uint8_t reg, uint8_t * buf, uint32_t len);
       int      (*write_reg)(void * context, uint8_t reg, const uint8_t * buf, uint32_t len);
       uint32_t   max_read;
       uint32_t   max_write;
       inv_bool_t is_spi;
};

Výpis 2: Core balíček softwaru DK-20948 eMD SmartMotion snižuje složitost softwaru pomocí funkcí v jazyce C, jako je tato, která slouží k nastavení sériového rozhraní ICM-20948 pro čtení a zápis na sběrnici I2C nebo SPI. (Zdroj kódu: TDK InvenSense)

Po implementaci struktur eMD a inicializaci samotného zařízení můžeme volat rutinu inv_icm20948_poll_sensor (), která používá instanci struktury inv_icm20948 k čtení senzorů a zpracování dat pomocí DMP. Více než 900 řádků dlouhá zdokumentovaná rutina nabízí vývojářům podrobnou ukázku využití základních funkcí pro provoz senzorů, správu FIFO a využití DMP.

Pokud budete mít zájem proniknout hlouběji a pochopit operace ICM-20948 na nejnižší úrovni, můžete prozkoumat rutiny Icm20948SelfTest.c, které se používají pro automatické self testy. Rutiny int inv_do_test_accelgyro znázorňují typické operace s registry pro ovládání zařízení (Výpis 3).

static int inv_do_test_accelgyro(struct inv_icm20948 * s, enum INV_SENSORS sensorType, int *meanValue, int *stMeanValue)
{
   . . .
 
    // Set Self-Test Bit
    if (sensorType == INV_SENSOR_GYRO)
    {
        // Enable gyroscope Self-Test by setting register User Bank 2, Register Address 02 (02h) Bit [5:3] to b111
        result = inv_icm20948_write_single_mems_reg(s, REG_GYRO_CONFIG_2, BIT_GYRO_CTEN | SELFTEST_GYRO_AVGCFG);
    } else
    {
        result = inv_icm20948_write_single_mems_reg(s, REG_ACCEL_CONFIG_2, BIT_ACCEL_CTEN | SELFTEST_ACCEL_DEC3_CFG);
    }
 
   . . .
}

Výpis 3: Rutina Icm20948SelfTest.c, která pracuje na nízké úrovni – práce s registry. (Zdroj kódu: TDK InvenSense)

Funkce inv_icm20948_write_single_mems_reg () z vyšší vrstvy volá rutinu inv_icm20948_write_reg () z nižší vrstvy. Společná struktura inv_icm20948 se postupně dostane až ke spodní vrstvě, kde se skutečně provede operace zápisu. Tato konečná funkce nízké úrovně používá ukazatel na rutinu registru zápisu, který byl nadefinován během inicializace sériového rozhraní inv_icm20948_serif zobrazené ve výpisu 2. Tento vrstvený přístup je nezbytný pro minimalizaci složitosti softwaru a maximalizaci výkonu.

Pro vývojáře poskytuje architektura eMD SmartMotion flexibilní framework postavený z klíčových struktur a funkcí. S balíčkem eMD mohou vývojáři pracovat na vysoké úrovni a zároveň se mohou snadno vrhnout do nižších vrstev, aby mohli implementovat vlastní funkce, aniž by ztratili konzistenci se softwarem vyšší úrovně.

Závěr

Modul TDK InvenSense ICM-20948 poskytuje plně integrované řešení pro snímání pohybu. Softwarový balíček eMD SmartMotion a vývojová deska DK-20948 nabízejí komplexní platformu pro rychlý vývoj aplikací se snímáním pohybu. Dále splňují požadavky na minimální velikost a spotřebu energie.

 

Článek vyšel v originále "Take a Simpler Route to Low-Power, 9-Axis Motion Tracking" na webu DigiKey.com

Hodnocení článku: