BNO055 per esp32, esp8266 e Arduino: cablaggio e libreria Bosch avanzata – 2

Spread the love

Questo è il secondo articolo sul BNO055. Se hai bisogno di una gestione di base, puoi fare riferimento all’articolo precedente, “BNO055 accelerometro, giroscopio, magnetometro con la semplice libreria Adafruit“, ma se hai bisogno di una gestione avanzata (e più complessa) con interrupt, devi leggere anche questo articolo.

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

BNO055: ESP32, esp8266, rp2040, stm32, and Arduino wiring and Bosch library
BNO055: ESP32, esp8266, rp2040, stm32, and Arduino wiring and Bosch library

Il BNO055 può emettere i seguenti dati del sensore:

  • Orientamento assoluto (Vettore di Eulero, 100Hz) Dati di orientamento a tre assi basati su una sfera a 360°
  • Orientamento assoluto (quaternione, 100Hz) Uscita quaternione a quattro punti per una manipolazione dei dati più accurata
  • Angular Velocity Vector (100Hz) Tre assi di ‘velocità di rotazione’ in rad/s
  • Acceleration Vector (100Hz) Tre assi di accelerazione (gravità + movimento lineare) in m/s^2
  • Vettore di intensità del campo magnetico (20Hz) Rilevamento a tre assi del campo magnetico in micro Tesla (uT)
  • Vettore di accelerazione lineare (100 Hz) Tre assi di dati di accelerazione lineare (accelerazione meno gravità) in m/s^2
  • Vettore di gravità (100 Hz) Tre assi di accelerazione gravitazionale (meno qualsiasi movimento) in m/s^2
  • Temperatura (1Hz) Temperatura ambiente in gradi centigradi

Pinout BNO055

Esistono molte versioni dei moduli di questo sensore, scelgo il più piccolo ed economico.

Ecco il modulo Aliexpress

Tutti i moduli avevano le stesse caratteristiche, 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.

Puoi comunicare tramite i2c (opzione di default) e tramite UART, per attivare l’ultima modalità devi dissaldare PS1.

PS1PS0Functionality
00Standard/Fast I2C Interface
01HID over I2C
10UART Interface
11Reserved

Nella modalità i2c standard, puoi selezionare due indirizzi. Di default, in questo modulo, l’indirizzo 0x29 è attivo. Se metti su GND il pin ADD, l’indirizzo diventa 0x28.

i2c configurationADDI2C address
SlaveHIGH0x29
SlaveLOW (default)0x28
HID-I2C0x40

INT è configurato come un pin di interrupt per segnalare un’interruzione all’host. Il trigger di interruzione è configurato come un 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 viene ripristinato dall’host .

Connessioni di base

Per l’utilizzo di base di i2c, devi solo connettere VCC, GND, SDA e SCL.

Cablaggio Arduino UNO

La versione Adafruit del sensore è ben documentata e supporta pienamente il livello logico 5v.

Arduino UNO bno055 adafruit wiring breadboard
Arduino UNO bno055 adafruit wiring breadboard

La versione clone non era chiaro se supporti completamente un livello logico 5v, ma sicuramente supporta un’alimentazione 5v. Ho usato un Arduino UNO e funziona correttamente senza LLC.

Arduino UNO bno055 clone wiring breadboard
Arduino UNO bno055 clone wiring breadboard

Ecco le schede Arduino Arduino UNO - Arduino MEGA 2560 R3 - Arduino Nano - Arduino Pro Mini

Cablaggio esp32

ESP32 DOIT DEV KIT v1 pinout
ESP32 DOIT DEV KIT v1 pinout

L’esp32 funziona a 3.3v, quindi il cablaggio è stato più semplice.

esp32 bno055 adafruit wiring breadboard
esp32 bno055 adafruit wiring breadboard

E qui il clone.

esp32 bno055 clone wiring breadboard
esp32 bno055 clone wiring breadboard

Ecco la mia selezione di esp32 ESP32 Dev Kit v1 - TTGO T-Display 1.14 ESP32 - NodeMCU V3 V2 ESP8266 Lolin32 - NodeMCU ESP-32S - WeMos Lolin32 - WeMos Lolin32 mini - ESP32-CAM programmer - ESP32-CAM bundle - ESP32-WROOM-32 - ESP32-S

Cablaggio esp8266

WeMos D1 mini esp8266 pinout mischianti low resolution
WeMos D1 mini esp8266 pinout

L’esp8266 come esp32 funziona a 3.3v, quindi il cablaggio è lineare.

esp8266 WeMos D1 mini bno055 adafruit wiring
esp8266 WeMos D1 mini bno055 adafruit wiring

E ora il clone.

esp8266 WeMos D1 mini bno055 clone wiring
esp8266 WeMos D1 mini bno055 clone wiring

Qui la mia selezione di schede esp8266 WeMos D1 mini - NodeMCU V2 V2.1 V3 - esp01 - esp01 programmer

Libreria Bosch

Bosh offre una libreria completa ma non documentata e non strutturata.

Puoi scaricare la libreria da GitHub qui. Oppure puoi scaricarlo direttamente dal gestore delle librerie IDE di Arduino.

bno055 bosch library interrupt Arduino IDE
bno055 bosch library interrupt Arduino IDE

Sketch di esempio di imbardata, rollio e beccheggio

Quando abbiamo bisogno di controllare la robotica, l’aerodinamica o la macchina, la soluzione migliore è usare imbardata, rollio e beccheggio. Ho aggiunto alcune cifre per capire dove sono posizionati questi valori.

Airplane yaw roll pitch axis
Airplane yaw roll pitch axis

Il sensore bosh può fornire dati elaborati, un esempio è Euler_Streaming sulla libreria BNO055.

/*
 ***************************************************************************

    Euler_Streaming.pde - part of sample SW for using BNO055 with Arduino

   (C) All rights reserved by ROBERT BOSCH GMBH

   Copyright (C) 2014 Bosch Sensortec GmbH

 	This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.

 **************************************************************************/
/*	Date: 2014/01/07
 	 Revision: 1.2

*/

#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;

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);
}

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

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

    Serial.print("Time Stamp: ");				//To read out the Time Stamp
    Serial.println(lastTime);

    Serial.print("Heading(Yaw): ");				//To read out the Heading (Yaw)
    Serial.println(float(myEulerData.h) / 16.00);		//Convert to degrees

    Serial.print("Roll: ");					//To read out the Roll
    Serial.println(float(myEulerData.r) / 16.00);		//Convert to degrees

    Serial.print("Pitch: ");				//To read out the Pitch
    Serial.println(float(myEulerData.p) / 16.00);		//Convert to degrees

    Serial.println();					//Extra line to differentiate between packets
  }
}

E il risultato nell’output seriale è:

Car yaw roll pitch axis
Car yaw roll pitch axis
Time Stamp: 6500
Heading(Yaw): 182.50
Roll: -3.44
Pitch: -26.00

Time Stamp: 6600
Heading(Yaw): 187.69
Roll: -16.37
Pitch: -18.69

Time Stamp: 6700
Heading(Yaw): 193.50
Roll: -27.75
Pitch: -8.25

Time Stamp: 6800
Heading(Yaw): 197.44
Roll: -34.81
Pitch: 1.19

Time Stamp: 6900
Heading(Yaw): 199.87
Roll: -37.25
Pitch: 9.00

Time Stamp: 7000
Heading(Yaw): 201.25
Roll: -36.88
Pitch: 16.25

Time Stamp: 7100
Heading(Yaw): 199.94
Roll: -30.75
Pitch: 21.94

Time Stamp: 7200
Heading(Yaw): 198.25
Roll: -20.62
Pitch: 27.50

Time Stamp: 7300
Heading(Yaw): 196.50
Roll: -12.44
Pitch: 30.31

Time Stamp: 7400
Heading(Yaw): 196.19
Roll: -4.06
Pitch: 31.44

Time Stamp: 7500
Heading(Yaw): 194.31
Roll: 4.50
Pitch: 31.31

Time Stamp: 7600
Heading(Yaw): 190.56
Roll: 12.75
Pitch: 28.00

Time Stamp: 7700
Heading(Yaw): 186.87
Roll: 22.94
Pitch: 23.12

Time Stamp: 7800
Heading(Yaw): 184.62
Roll: 29.81
Pitch: 19.37

Time Stamp: 7900
Heading(Yaw): 182.75
Roll: 35.19
Pitch: 15.94

Time Stamp: 8000
Heading(Yaw): 181.12
Roll: 42.63
Pitch: 11.63

Time Stamp: 8100
Heading(Yaw): 180.37
Roll: 47.56
Pitch: 9.13

Time Stamp: 8200
Heading(Yaw): 181.69
Roll: 53.44
Pitch: 4.12

Time Stamp: 8300
Heading(Yaw): 184.31
Roll: 57.81
Pitch: -0.94

Time Stamp: 8400
Heading(Yaw): 183.44
Roll: 60.81
Pitch: -3.62

Questi valori erano gli elementi base per tutte le macchine, come automobili o barche.

Boat yaw roll pitch axis
Boat yaw roll pitch axis

E può essere gestito con frequenze 10Hz. Ho anche controllato che il rumore fosse gestito bene.

Sposta il coniglietto 3d con WebGL e posizione assoluta.

Qui scrivo un semplice schizzo come quello di Adafruit (controlla il precedente articolo BNO055) che legge i dati seriali e li converte in una rotazione 3D per farlo in modo semplice utilizzando l’API Web Serial per il browser Chrome.

Quindi, prima, hai bisogno del browser Chrome.

Poi devi abilitare l’API WebSerial e, per farlo, devi inserire l’URL di input del browser chrome://flags quindi cercare (con Ctrl + f) le funzionalità della piattaforma Web sperimentale e abilitarlo.

Chrome enable Experimental Web Platform features
Chrome enables Experimental Web Platform features.

Quindi carica l’esempio.

/**
 * Simple example with bosch library for bno055 to work with
 * Adafruit webGL example with euler angles
 * https://adafruit.github.io/Adafruit_WebSerial_3DModelViewer/
 *
 * 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 (100)

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);
}

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(""));


  }
}

Ora apri nel browser questo URL:

https://adafruit.github.io/Adafruit_WebSerial_3DModelViewer/

Seleziona 115200 baud, fai clic su Connetti e selezionare la porta seriale del dispositivo.

Il risultato è che puoi cambiare l’orientamento del coniglietto con il movimento del bno055.

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 *