BNO055: modalità di alimentazione, accelerometro e interrupt di movimento – 4

Spread the love

In questo articolo, esploreremo le modalità di alimentazione del BON055 e ci concentreremo sulle funzionalità e sulla gestione dell’accelerometro.

BNO055: power modes, accelerometer any/no motion interrupt
BNO055: power modes, accelerometer any/no motion interrupt

Il BNO055 è un System in Package (SiP), che integra un accelerometro triassiale a 14 bit, un giroscopio triassiale a 16 bit con un intervallo di ±2000 gradi al secondo, un sensore geomagnetico triassiale e un microcontrollore Cortex M0+ a 32 bit con sistema Bosch Software di fusione dei sensori Sensortec, in un unico pacchetto.

Architettura

Prendo questa immagine dal datasheet per ricordare che questo sensore ha 3 sensori e un microcontrollore con un “software di fusione” per gestire i dati e darti una posizione assoluta.

Architecture of bno055
Architecture of bno055

Piedinatura BNO055

Esistono molti moduli diversi di questo sensore, io scelgo il più piccolo ed economico.

Ecco i moduli Aliexpress

Tutti questi moduli hanno le stesse funzionalità, ma per abilitarli è necessario eseguire operazioni diverse.

Questo è il clone che uso:

BNO055 pinout mischianti
BNO055 pinout mischianti

Ed ecco quello di Adafruit:

Adafruit bno055 pinout specs
Adafruit bno055 pinout specs

Il sensore supporta un livello logico 3.3v, ma il modulo può essere alimentato da 5v.

Modalità di alimentazione

Il BNO055 supporta tre diverse modalità di alimentazione: modalità normale, modalità a basso consumo e modalità sospensione.

Modalità normale

In modalità normale, tutti i sensori necessari per la modalità operativa selezionata sono sempre accesi. La mappa dei registri dell’MCU e le periferiche interne sono sempre operative in questa modalità.

Gli esempi sopra sono tutti in questa modalità predefinita.

Modalità di sospensione

In modalità di sospensione, il sistema viene messo in pausa e tutti i sensori e il microcontrollore vengono messi in modalità di sospensione. Nessun valore nella mappa registro verrà aggiornato in questa modalità.

Ecco un semplice sketch che mette in modalità sospensione

	  bno055_set_powermode(POWER_MODE_SUSPEND);

e quindi ripristinare lo stato normale.

	  bno055_set_powermode(POWER_MODE_NORMAL);
	  //Configuration to NDoF mode
	  bno055_set_operation_mode(OPERATION_MODE_NDOF);

Lo sketch completo:

/**
 * An example that start bno055 in normal mode
 * than suspend It and restore after 5 secs
 *
 * by Renzo Mischianti <www.mischianti.org>
 *
 * https://mischianti.org/
 */

#include "BNO055_support.h"		//Contains the bridge code between the API and Arduino
#include <Wire.h>

//The device address is set to BNO055_I2C_ADDR2 in this example. You can change this in the BNO055.h file in the code segment shown below.
// /* bno055 I2C Address */
// #define BNO055_I2C_ADDR1                0x28
// #define BNO055_I2C_ADDR2                0x29
// #define BNO055_I2C_ADDR                 BNO055_I2C_ADDR2

//Pin assignments as tested on the Arduino Due.
//Vdd,Vddio : 3.3V
//GND : GND
//SDA/SCL : SDA/SCL
//PSO/PS1 : GND/GND (I2C mode)

//This structure contains the details of the BNO055 device that is connected. (Updated after initialization)
struct bno055_t myBNO;
struct bno055_euler myEulerData; //Structure to hold the Euler data

unsigned char accelCalibStatus = 0;		//Variable to hold the calibration status of the Accelerometer
unsigned char magCalibStatus = 0;		//Variable to hold the calibration status of the Magnetometer
unsigned char gyroCalibStatus = 0;		//Variable to hold the calibration status of the Gyroscope
unsigned char sysCalibStatus = 0;		//Variable to hold the calibration status of the System (BNO055's MCU)

unsigned long lastTime = 0;

/* Set the delay between fresh samples */
#define BNO055_SAMPLERATE_DELAY_MS (1000)

void setup() //This code is executed once
{
  //Initialize I2C communication
  Wire.begin();

  //Initialization of the BNO055
  BNO_Init(&myBNO); //Assigning the structure to hold information about the device

  //Configuration to NDoF mode
  bno055_set_operation_mode(OPERATION_MODE_NDOF);

  delay(1);

  //Initialize the Serial Port to view information on the Serial Monitor
  Serial.begin(115200);
}

bool suspended = false;
bool reactivated = false;

void loop() //This code is looped forever
{
  if ((millis() - lastTime) >= BNO055_SAMPLERATE_DELAY_MS) //To stream at 10Hz without using additional timers
  {
    lastTime = millis();

    bno055_read_euler_hrp(&myEulerData);			//Update Euler data into the structure

    /* The WebSerial 3D Model Viewer expects data as heading, pitch, roll */
    Serial.print(F("Orientation: "));
    Serial.print(360-(float(myEulerData.h) / 16.00));
    Serial.print(F(", "));
    Serial.print(360-(float(myEulerData.p) / 16.00));
    Serial.print(F(", "));
    Serial.print(360-(float(myEulerData.r) / 16.00));
    Serial.println(F(""));

	bno055_get_accelcalib_status(&accelCalibStatus);
	bno055_get_gyrocalib_status(&gyroCalibStatus);
	bno055_get_syscalib_status(&sysCalibStatus);
	bno055_get_magcalib_status(&magCalibStatus);

	Serial.print(F("Calibration: "));
	Serial.print(sysCalibStatus, DEC);
	Serial.print(F(", "));
	Serial.print(gyroCalibStatus, DEC);
	Serial.print(F(", "));
	Serial.print(accelCalibStatus, DEC);
	Serial.print(F(", "));
	Serial.print(magCalibStatus, DEC);
	Serial.println(F(""));


  }
  if (millis() > 10000 && suspended == false) {
	  Serial.println("SUSPENDED!");
	  bno055_set_powermode(POWER_MODE_SUSPEND);
	  suspended = true;
  }

  if (millis() > 15000 && reactivated == false) {
	  Serial.println("REACTIVATED!");
	  bno055_set_powermode(POWER_MODE_NORMAL);
	  //Configuration to NDoF mode
	  bno055_set_operation_mode(OPERATION_MODE_NDOF);

	  reactivated = true;
  }

}

E questo è il risultato:

Orientation: 280.37, 344.56, 325.44
Calibration: 0, 3, 3, 3
Orientation: 265.69, 334.94, 399.44
Calibration: 0, 3, 3, 3
Orientation: 285.50, 364.25, 326.12
Calibration: 0, 3, 3, 3
Orientation: 272.62, 327.37, 422.31
Calibration: 0, 3, 3, 3
Orientation: 272.37, 333.19, 420.56
Calibration: 0, 3, 3, 3
Orientation: 272.75, 335.37, 419.87
Calibration: 0, 3, 3, 3
Orientation: 276.62, 356.37, 344.31
Calibration: 0, 3, 3, 3
SUSPENDED!
Orientation: 360.00, 360.00, 360.00
Calibration: 0, 0, 0, 0
Orientation: 360.00, 360.00, 360.00
Calibration: 0, 0, 0, 0
Orientation: 360.00, 360.00, 360.00
Calibration: 0, 0, 0, 0
Orientation: 360.00, 360.00, 360.00
Calibration: 0, 0, 0, 0
Orientation: 360.00, 360.00, 360.00
Calibration: 0, 0, 0, 0
REACTIVATED!
Orientation: 276.87, 358.00, 357.69
Calibration: 0, 3, 3, 3
Orientation: 274.69, 343.81, 393.12
Calibration: 0, 3, 3, 3
Orientation: 277.25, 345.75, 412.94

Modalità a basso consumo

Se non viene rilevata alcuna attività (cioè nessun movimento) per una durata configurabile (predefinita 5 secondi), il BNO055 entra in modalità a basso consumo. In questa modalità è attivo solo l’accelerometro. Una volta rilevato il movimento (ovvero l’accelerometro segnala un’interruzione di qualsiasi movimento), il sistema viene riattivato e viene attivata la modalità normale . Sono possibili le seguenti impostazioni.

DescrizioneParametroValore
Entrare in modalità di sospensione:
NESSUNA interruzione del movimento
Detection TypeNo Motion
Detection Axis
ParamsDuration
Threshold
DescrizioneParametroValore
Sveglia: qualsiasi interruzione del movimentoDetection TypeDetection Axis
ParamsDuration
Threshold

Inoltre, i pin di interrupt possono anche essere configurati per fornire interrupt HW all’host.

Il BNO055 è, per impostazione predefinita, configurato per avere valori ottimali per entrare in modalità di sospensione e svegliarsi. Per ripristinare questi valori, attivare un ripristino del sistema mediante un ripristino del software.

Ci sono alcune limitazioni per ottenere le prestazioni della modalità a basso consumo:

  • Sono applicabili solo gli interrupt di movimento No e Any e gli interrupt High-G e slow motion non sono applicabili in modalità a basso consumo.
  • La modalità a basso consumo non è applicabile se l’accelerometro non è utilizzato.

Interrupts

bno055 interrupts

INT è configurato come pin di interruzione per segnalare un’interruzione all’host. Il trigger di interrupt è configurato come raising edge ed è agganciato al pin INT. Una volta che si verifica un’interruzione, il pin INT viene impostato su alto e rimarrà alto fino a quando non verrà ripristinato dall’host. Questo può essere fatto impostando RST_INT nel registro SYS_TRIGGER.

bno055_set_reset_int(1);

Gli interrupt possono essere abilitati impostando il bit corrispondente nel registro di abilitazione degli interrupt (INT_EN) e disabilitati quando viene azzerato.

bno055_get_int_gyro_anymotion(&gyro_am);
bno055_set_int_gyro_anymotion(1);
bno055_get_int_gyro_highrate(&gyro_hr);
bno055_set_int_gyro_highrate(1);
bno055_get_int_accel_high_g(&accel_hg);
bno055_set_int_accel_high_g(1);
bno055_get_int_accel_anymotion(&accel_am);
bno055_set_int_accel_anymotion(1);
bno055_get_int_accel_nomotion(&accel_nm);
bno055_set_int_accel_nomotion(1);

Mascheramento dei pin di interruzione

bno055_get_intmsk_gyro_anymotion(1);
bno055_set_intmsk_gyro_anymotion(1);
bno055_get_intmsk_gyro_highrate(1);
bno055_set_intmsk_gyro_highrate(1);
bno055_get_intmsk_accel_high_g(1);
bno055_set_intmsk_accel_high_g(1);
bno055_get_intmsk_accel_anymotion(1);
bno055_set_intmsk_accel_anymotion(1);
bno055_get_intmsk_accel_nomotion(1);
bno055_set_intmsk_accel_nomotion(1);

Gli interrupt possono essere indirizzati al pin INT impostando il corrispondente bit di interrupt nel registro INT_MSK.

Stato dell’interrupt

Le occorrenze di interrupt vengono memorizzate nel registro di stato dell’interrupt (INT_STA). Tutti i bit in questo registro vengono cancellati durante la lettura.

bno055_get_interrupt_status_gyro_anymotion(&gyr_anymotion);
bno055_get_interrupt_status_gyro_highrate(&gyr_highrate);
bno055_get_interrupt_status_accel_highg(&acc_highg);
bno055_get_interrupt_status_accel_anymotion(&acc_anymotion);
bno055_get_interrupt_status_accel_nomotion(&acc_nomotion);

Impostazioni di interruzione

Interruzione dati pronti (DRDY INT)

Data Ready Interrupt è un segnale all’host sulla disponibilità dei dati nella mappa del registro, in modo che l’host possa leggere immediatamente i dati del sensore quando i dati del sensore sono disponibili nella mappa del registro.

Sono disponibili i seguenti interrupt pronti per i dati,

  1. Accelerometro o interruzione dei dati di fusione pronti (ACC_BSX_DRDY)
  2. Interrupt dati pronti magnetometro (MAG_DRDY)
  3. Interruzione dati giroscopio pronti (GYR_DRDY)

In modalità non fusione:

  • In modalità non fusione, l’interruzione dati pronti viene segnalata in base alle velocità dati dei singoli sensori configurate per i sensori.
  • L’interrupt dati pronti “ACC_BSX_DRDY” viene impostato/attivato quando i dati dell’accelerometro sono disponibili nella mappa dei registri alla velocità dati configurata del sensore nella modalità operativa in cui l’accelerometro è attivo.
  • L’interrupt dati pronti “MAG_DRDY” viene impostato/attivato quando i dati del magnetometro sono disponibili nella mappa del registro alla velocità dati configurata del sensore nella modalità operativa in cui il magnetometro è attivo.

In modalità fusione:

  • In modalità fusione, l’interrupt data-ready viene segnalato in base alla velocità dati del sensore primario. L’interrupt dati pronti “ACC_BSX_DRDY” viene impostato/attivato quando i dati calibrati/di fusione sono disponibili nella mappa di registro alla frequenza primaria del sensore.

Comportamento dell’interruzione dei dati pronti:

Una volta che si verifica un’interruzione, il pin INT viene impostato su alto e rimarrà alto fino a quando non verrà ripristinato o letto dall’host. L’INT è impostato su basso e alto immediatamente quando si verificano più interruzioni prima che l’host venga reimpostato o letto.

Accelerometro Slow/No Motion Interrupt

ParametriValori
Detection TypeNo Motion
 Slow Motion
Interrupt ParametersThreshold
 Duration
Axis selectionX-axis
 Y-axis
 Z-axis

Lo slow-motion/no-motion interrupt engine può essere configurato in due modalità.

Puoi selezionare slow-motion con questo comando:

bno055_set_accel_slow_no_motion_enable(0);

o no-motion con questo:

bno055_set_accel_slow_no_motion_enable(1);

L’interruzione slow-motion viene attivata quando la pendenza misurata di almeno un asse abilitato supera la soglia di pendenza programmabile per un numero programmabile di campioni.

Per ottenere il valore corrente della soglia

unsigned char accel_slow_no_thr = 0;
bno055_get_accel_slow_no_threshold(&accel_slow_no_thr);

o da impostare

bno055_set_accel_slow_no_threshold(10);

Quindi il motore si comporta in modo simile all’interruzione di qualsiasi movimento ma con un diverso insieme di parametri. Per sopprimere i falsi trigger, l’interruzione viene generata (cancellata) solo se un certo numero di punti dati di pendenza consecutivi è maggiore (minore) della soglia di pendenza data dal numero = + 1.

In modalità senza movimento, viene generato un interrupt se la pendenza su tutti gli assi selezionati rimane inferiore a una soglia programmabile per un tempo di ritardo programmabile .

bno055 chart to understand slow motion interrupt
bno055 chart to understand no motion interrupt

La scalatura del valore di soglia è identica a quella slow-motion interrupt.

Per ottenere la durata, puoi usare questo comando:

  unsigned char accel_am_dur = 0;
  bno055_get_accel_anymotion_duration(&accel_am_dur);

e per impostare, puoi usare

bno055_set_accel_anymotion_duration(3); // to set 4secs

Tuttavia, in modalità no-motion, il registro slo_no_mot_dur definisce il tempo di ritardo prima che venga attivato l’interrupt no-motion.

ValoreRitardo
01 s
12 s
23 s
1415 s
1516 s
1640 s
1748 s
1856 s
1964 s.
2072 s
2180 s
3288 s
3396 s
34104 s
62328 s
63336 s
No-motion time-out periods

Accelerometro qualsiasi interruzione di movimento

ParametriValori
Interrupt ParametersThreshold
 Duration
Axis selectionX-axis
 Y-axis
 Z-axis

L’any-motion interrupt utilizza la pendenza tra segnali di accelerazione successivi per rilevare i cambiamenti nel movimento. Viene generato un interrupt quando la pendenza (valore assoluto della differenza di accelerazione) supera una soglia preimpostata. Viene liberato non appena la pendenza scende sotto la soglia.

bno055 accelerometer principle of any motion detection chart
bno055 accelerometer principle of any motion detection chart

Qualsiasi rilevamento del movimento può essere abilitato (disabilitato) per ciascun asse separatamente. I criteri per qualsiasi rilevamento del movimento sono soddisfatti e l’interruzione della pendenza viene generata se la pendenza di uno qualsiasi degli assi abilitati supera la soglia per un insieme di volte consecutive. Non appena le pendenze di tutti gli assi abilitati scendono o rimangono al di sotto di questa soglia per un insieme di volte consecutive, l’interruzione viene cancellata a meno che il segnale di interruzione non sia bloccato.

Come descritto, gli interrupt senza movimento sono l’interrupt di base in modalità LOW POWER; per impostazione predefinita, no-motion e any motion sono abilitati per impostazione predefinita, ma non l’interrupt bit mask per reindirizzare anche l’interrupt sul pin INT .

Interrupts sui registri

Quindi, se eseguiremo questo semplice sketch:

/**
 * bno055 simple interrupt management
 * enable only register interrupt for any motion and
 * no motion in LOW POWER mode
 * no bit mask for interrupt pin
 *
 * by Renzo Mischianti <www.mischianti.org>
 *
 * https://mischianti.org/
 */
#include "BNO055_support.h"		//Contains the bridge code between the API and Arduino
#include <Wire.h>
//The device address is set to BNO055_I2C_ADDR2 in this example. You can change this in the BNO055.h file in the code segment shown below.
// /* bno055 I2C Address */
// #define BNO055_I2C_ADDR1                0x28
// #define BNO055_I2C_ADDR2                0x29
// #define BNO055_I2C_ADDR                 BNO055_I2C_ADDR2
//Pin assignments as tested on the Arduino Due.
//Vdd,Vddio : 3.3V
//GND : GND
//SDA/SCL : SDA/SCL
//PSO/PS1 : GND/GND (I2C mode)
//This structure contains the details of the BNO055 device that is connected. (Updated after initialization)
struct bno055_t myBNO;
struct bno055_euler myEulerData; //Structure to hold the Euler data
unsigned long lastTime = 0;
/* Set the delay between fresh samples */
#define BNO055_SAMPLERATE_DELAY_MS (1000)
void getIntInterruptEnabled();
void getIntInterruptBitMaskEnabled();
void getInterruptStatusEnabled(bool synthetic = false);
void printSlowMotionNoMotionParameters();
void setup() //This code is executed once
{
  //Initialize I2C communication
  Wire.begin();
  //Initialization of the BNO055
  BNO_Init(&myBNO); //Assigning the structure to hold information about the device
//  bno055_set_reset_sys(1);
  delay(1500);
  bno055_set_powermode(POWER_MODE_LOW_POWER);
  //Configuration to NDoF mode
  bno055_set_operation_mode(OPERATION_MODE_NDOF);
  // Activate SLOW MOTION
  //  bno055_set_accel_slow_no_motion_enable(0);
  // Activate NO MOTION (default)
  bno055_set_accel_slow_no_motion_enable(1);
  delay(1);
  //Initialize the Serial Port to view information on the Serial Monitor
  Serial.begin(115200);
  delay(1000);
  getIntInterruptEnabled();
  getIntInterruptBitMaskEnabled();
  printSlowMotionNoMotionParameters();
}
bool suspended = false;
bool reactivated = false;
void loop() //This code is looped forever
{
  if ((millis() - lastTime) >= BNO055_SAMPLERATE_DELAY_MS) //To stream at 10Hz without using additional timers
  {
    lastTime = millis();
    bno055_read_euler_hrp(&myEulerData);			//Update Euler data into the structure
    Serial.print(millis()/1000); Serial.print("Secs - ");
    /* The WebSerial 3D Model Viewer expects data as heading, pitch, roll */
    Serial.print(F("Orientation: "));
    Serial.print(360-(float(myEulerData.h) / 16.00));
    Serial.print(F(", "));
    Serial.print(360-(float(myEulerData.p) / 16.00));
    Serial.print(F(", "));
    Serial.print(360-(float(myEulerData.r) / 16.00));
    Serial.print(F("   -    "));
	getInterruptStatusEnabled(true);
  }
}
/*
 * Print the interrupt enabled
 */
void getIntInterruptEnabled() {
	unsigned char gyro_am = 0;
	unsigned char gyro_hr = 0;
	unsigned char accel_hg = 0;
	unsigned char accel_am = 0;
	unsigned char accel_nm = 0;
	bno055_get_int_gyro_anymotion(&gyro_am);
	bno055_get_int_gyro_highrate(&gyro_hr);
	bno055_get_int_accel_high_g(&accel_hg);
	bno055_get_int_accel_anymotion(&accel_am);
	bno055_get_int_accel_nomotion(&accel_nm);
	Serial.println( "---- Interrupt enabled ----" );
	Serial.print( "Gyro Any Motion  " );
	Serial.println( gyro_am );
	Serial.print( "Gyro High Rate   " );
	Serial.println( gyro_hr );
	Serial.print( "Accel High G     " );
	Serial.println( accel_hg );
	Serial.print( "Accel Any Motion " );
	Serial.println( accel_am );
	Serial.print( "Accel No Motion  " );
	Serial.println( accel_nm );
	Serial.println( "---------------------------" );
}
/*
 * Print the interrupt to send on interrupt pin
 */
void getIntInterruptBitMaskEnabled() {
	unsigned char gyro_am = 0;
	unsigned char gyro_hr = 0;
	unsigned char accel_hg = 0;
	unsigned char accel_am = 0;
	unsigned char accel_nm = 0;
	bno055_get_intmsk_gyro_anymotion(&gyro_am);
	bno055_get_intmsk_gyro_highrate(&gyro_hr);
	bno055_get_intmsk_accel_high_g(&accel_hg);
	bno055_get_intmsk_accel_anymotion(&accel_am);
	bno055_get_intmsk_accel_nomotion(&accel_nm);
	Serial.println( "---- Interrupt bitmask ----" );
	Serial.print( "Gyro Any Motion  " );
	Serial.println( gyro_am );
	Serial.print( "Gyro High Rate   " );
	Serial.println( gyro_hr );
	Serial.print( "Accel High G     " );
	Serial.println( accel_hg );
	Serial.print( "Accel Any Motion " );
	Serial.println( accel_am );
	Serial.print( "Accel No Motion  " );
	Serial.println( accel_nm );
	Serial.println( "---------------------------" );
}
/*
 * Print the interrupt status
 */
void getInterruptStatusEnabled(bool synthetic) {
	// 37 	INT_STA 	0x00	ACC_NM	ACC_AM	ACC_HIGH_G	GYR_DRDY	GYR_HIGH_RATE	GYRO_AM	MAG_DRDY	ACC_BSX_DRDY
		#pragma pack(push, 1)
			struct StatusInterrupt {
				byte accel_bsx_drdy		: 1;
				byte mag_drdy			: 1;
				byte gyro_am			: 1;
				byte gyro_high_rate	  	: 1;
				byte gyro_drdy	  		: 1;
				byte accel_high_g 		: 1;
				byte accel_am	  		: 1;
				byte accel_nm	  		: 1;
			};
		#pragma pack(pop)
		StatusInterrupt registerByte = {0};
		// Read all tht INT_STA addr to get all interrupt status in one read
		// after the read the register is cleared
		BNO055_RETURN_FUNCTION_TYPE res = bno055_read_register(BNO055_INT_STA_ADDR, (unsigned char *)(®isterByte), 1);
		if (res == 0) {
			if (synthetic){
				Serial.print("Anm Aam Ahg Grd Ggr Gam Mrd Abr --> ");
				Serial.print( registerByte.accel_nm );
				Serial.print( registerByte.accel_am );
				Serial.print( registerByte.accel_high_g );
				Serial.print( registerByte.gyro_drdy );
				Serial.print( registerByte.gyro_high_rate );
				Serial.print( registerByte.gyro_am );
				Serial.print( registerByte.mag_drdy );
				Serial.println( registerByte.accel_bsx_drdy );
			}else{
				Serial.print( "Gyro Any Motion  " );
				Serial.println( registerByte.gyro_am );
				Serial.print( "Gyro High Rate   " );
				Serial.println( registerByte.gyro_high_rate );
				Serial.print( "Accel High G     " );
				Serial.println( registerByte.accel_high_g );
				Serial.print( "Accel Any Motion " );
				Serial.println( registerByte.accel_am );
				Serial.print( "Accel No Motion  " );
				Serial.println( registerByte.accel_nm );
			}
		} else {
			Serial.println("Error status!");
		}
	}
void printSlowMotionNoMotionParameters(){
	  unsigned char accel_slow_no_thr = 0;
	  bno055_get_accel_slow_no_threshold(&accel_slow_no_thr);
	  Serial.print("Slow motion/no motion threshold: ");
	  Serial.println(accel_slow_no_thr);
	  unsigned char accel_am_dur = 0;
	  bno055_get_accel_anymotion_duration(&accel_am_dur);
	  Serial.print("Slow motion/no motion duration: ");
	  Serial.println(accel_am_dur);
}

Ecco l’output seriale; gli interrupt abilitati su POWER_MODE_LOW_POWER sono Any motion e No Motion come scritto nel paragrafo che descrive la modalità a basso consumo.

---- Interrupt enabled ----
Gyro Any Motion  0
Gyro High Rate   0
Accel High G     0
Accel Any Motion 1
Accel No Motion  1
---------------------------
---- Interrupt bitmask ----
Gyro Any Motion  0
Gyro High Rate   0
Accel High G     0
Accel Any Motion 0
Accel No Motion  0
---------------------------
Slow motion/no motion threshold: 10
Slow motion/no motion duration: 3
2Secs - Orientation: 168.00, 363.25, 354.19   -    Anm Aam Ahg Grd Ggr Gam Mrd Abr --> 00000000
3Secs - Orientation: 168.00, 363.19, 354.12   -    Anm Aam Ahg Grd Ggr Gam Mrd Abr --> 00000000
4Secs - Orientation: 168.00, 363.19, 354.12   -    Anm Aam Ahg Grd Ggr Gam Mrd Abr --> 00000000
5Secs - Orientation: 173.62, 363.00, 353.94   -    Anm Aam Ahg Grd Ggr Gam Mrd Abr --> 01000000
6Secs - Orientation: 163.19, 362.94, 353.25   -    Anm Aam Ahg Grd Ggr Gam Mrd Abr --> 01000000
7Secs - Orientation: 163.19, 362.94, 353.25   -    Anm Aam Ahg Grd Ggr Gam Mrd Abr --> 00000000
8Secs - Orientation: 163.19, 362.94, 353.25   -    Anm Aam Ahg Grd Ggr Gam Mrd Abr --> 00000000
9Secs - Orientation: 163.19, 362.94, 353.25   -    Anm Aam Ahg Grd Ggr Gam Mrd Abr --> 00000000
10Secs - Orientation: 163.19, 362.94, 353.25   -    Anm Aam Ahg Grd Ggr Gam Mrd Abr --> 00000000
11Secs - Orientation: 163.19, 362.94, 353.25   -    Anm Aam Ahg Grd Ggr Gam Mrd Abr --> 00000000
12Secs - Orientation: 163.19, 362.94, 353.25   -    Anm Aam Ahg Grd Ggr Gam Mrd Abr --> 00000000
13Secs - Orientation: 163.19, 362.94, 353.25   -    Anm Aam Ahg Grd Ggr Gam Mrd Abr --> 10000000
14Secs - Orientation: 163.19, 362.94, 353.25   -    Anm Aam Ahg Grd Ggr Gam Mrd Abr --> 00000000
15Secs - Orientation: 163.19, 362.94, 353.25   -    Anm Aam Ahg Grd Ggr Gam Mrd Abr --> 00000000
16Secs - Orientation: 163.19, 362.94, 353.25   -    Anm Aam Ahg Grd Ggr Gam Mrd Abr --> 00000000

Quando scuoto il bno055, solleva il perno di qualsiasi movimento 2 volte,

Anm Aam Ahg Grd Ggr Gam Mrd Abr --> 01000000

quindi smetto di spostarlo e, dopo 6 secondi, non viene generata alcuna interruzione del movimento.

Anm Aam Ahg Grd Ggr Gam Mrd Abr --> 10000000

The sketch was very simple, but as you can see, I must redò the function that read the status of interrupt, the implementation of the library

bno055_get_interrupt_status_gyro_anymotion(&gyr_anymotion);
bno055_get_interrupt_status_gyro_highrate(&gyr_highrate);
bno055_get_interrupt_status_accel_highg(&acc_highg);
bno055_get_interrupt_status_accel_anymotion(&acc_anymotion);
bno055_get_interrupt_status_accel_nomotion(&acc_nomotion);

Non risulta molto efficiente perché puoi solo leggere un parametro di interrupt; dopo la prima lettura del registro, tutti i dati vengono cancellati e non puoi sapere se vengono sollevati altri interrupt, quindi ottengo tutti i bit in una lettura e poi stampo lo stato di tutti gli interrupt .

Grazie

  1. BNO055 accelerometro, giroscopio, magnetometro con la semplice libreria Adafruit
  2. BNO055 per esp32, esp8266 e Arduino: cablaggio e libreria Bosch avanzata
  3. BNO055 per esp32, esp8266 e Arduino: caratteristiche, configurazione e rimappatura assi
  4. BNO055: modalità di alimentazione, accelerometro e interrupt di movimento
  5. BNO055 per esp32, esp8266 e Arduino: abilitare il pin INT e High G Interrupt dell’accelerometro
  6. BNO055 per esp32, esp8266 e Arduino: giroscopio ad alta velocità e interrupt per ogni movimento

Spread the love

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *