Проблема с подключением датчика BNO055 к ESP32

Дети решили построить балансирующего робота. Сделали модель шасси. Прикрутили плату esp32. Драйвера шаговых моторов и сами шаговики Nema17.

В качестве гироскопа использовали mpu6050.

4 аккумулятора 18650 соединенных последовательно.

Сделали небольшую програмку для управления моторами. Но похоже не хватает крутящего момента у шаговиков. Заказали коллекторные моторчики с редукторами.

Собрали все в новое шасси а вместо датчика mpu6050 установили bno055.

И вот вчера весь вечер пытались подключить этот датчик. Как только он подключается к шине i2c сразу перестает работать другой датчик vl530x (определяет расстояние). И на i2c искажается сигнал. Смотрели осцилографом при работе датчика vl530 и отдельно при подключении bno055.

BNO055 подключен на vcc, gnd, sda, scl. Другие пины не подключали. Заменили датчик и второй так же себя ведет. Кто встречался с подобной проблемой? Куда копать? Может как-то явно нужно указать тип интерфейса?

В цирке по канату будет ходить?

Ездить по дорожке с треком в виде черной полосы

  1. В каком месте «тележка на колёсиках» является «балансирующим роботом»? Вы хоть разницу понимаете?
  2. Если у вас проблема с подключением какого либо датчика, то:
    2.1. Называйте тему в соответствии с проблемой, так шанс получить решение кратно возрастает.
    2.2. Прикладывайте к теме СХЕМУ (минимальную, но полную), которая воспроизводит проблему.
    2.3. Прикладывайте к теме минимальный код, с которым воспроизводится проблема.
  3. Если вы намерены оскорбиться первыми двумя пунктами - помощи вы тут не найдёте, не тратьте своё и наше время.

Прикрепите скриншоты данных измерений.

А заодно можно сканером прочитать адреса датчиков по отдельности и немножечко удивиться. :slightly_smiling_face:

Не исключено ))

на модуле вывод AD0 соедините с землей и используйте адрес 0х28 для него.

Тележка/шасси на двух колесиках.
Извиняюсь за недостаточную информацию.

Тему балансирующего робота намеренно создал. Множество вопросов появилось на первом прототипе. постараюсь подробно описать.

Контроллер Esp32. На шине i2c сейчас подключен лазерный датчик расстояния vl530. Получаем с него данные.

На ту же шину i2c подключаю датчик bno055. Как только подключается датчик bno055 - перестает работать датчик vl530. То, что удалось понять - при подключении датчика bno055 на шине i2c (scl/sda) появляются помехи и сама форма сигналов не похожа на работу шины. Как будто при подключении bno055 нарушается работа шины i2c.

Вот такая конструкция робота

Си

Сигнал SDA при работе датчика расстояния VL530.

А это сигнал SDA при подключении bno055

Заодно о важности схемы: а на кой вы датчики от 5 вольт питаете при работе с ESP?

Тут не в адресе дело. Нарушается работа самой шины.

Я бы списал на неисправность датчика. Подключил второй. Такая же картина.

Читал на зарубежных ресурсах, что есть пины которые должны переключать интерфейс датчика i2c/uart. Явных контактов не нашел. Вот тут видно что-то похожее на перемычки. Быть может в них дело

ну видимо вам виднее.

я картинку прикрепил, там все расписано.

На плате распаяны пины для подключения устройств к i2c и да там 5v.

Переставлял на 3,3 в. Ни чего не поменялось. И в описании датчика указано питание 3,3-5в. Пины esp32 из описания так же толерантны к 5в логике.

Попробуем сегодня сменить адрес.

Мы отключали vl530, что бы на шине оставался только bno055. Но на шине такой-же мусор не похожий на сигналы

А вот тут о важности предоставления скетча и использованных библиотек: ничего что при совпадении адреса программа будет пытаться работать с гироскопом как с дальномером?!
Но хто мы такие, шобы спорить. :roll_eyes:

А можно увидеть это описание со сылкой на еспрессиф систем?

Про конфликт я думал. Отключал vl530 оставляя на шине только bno055. И как только подключал 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
  }
}

При загруженной программе чтения дальномера, (и подключенном vl530) просто подключаю bno055 без программной обработки и сразу же получаю помехи на шине i2c и как следствие vl530 перестает передавать данные. Висит на ошибке инициализации/

vl530


#include "vl530.h"

void setup() {
  Serial.begin(115200);
  while ( !InitVL53L0X() ) {
    delay(500);
  };

}


void loop() {
  updateVL53L0X();
  Serial.println(ReadVL53L0X());
  delay(100);
}

vl530.h

#ifndef VL53L0X_H
#define VL53L0X_H

bool InitVL53L0X(void);
int ReadVL53L0X(void);
void updateVL53L0X(void);

#endif

vl530.cpp

#include <Wire.h>
#include <VL53L0X.h>
#include "vl530.h"

#define WIRE_SPEED 400000  // скорость i2c 400 кГц

// Статические переменные — доступны только внутри этого файла
static VL53L0X sensor;
static volatile int vl53l0x_distance = 0;  // -1 — признак неинициализированного состояния

bool InitVL53L0X(void) {
    Wire.begin();
    Wire.setClock(WIRE_SPEED);      // 400kHz I2C clock

    sensor.setTimeout(500);
    if (!sensor.init()) {
        Serial.print("Failed to detect and initialize VL53L0X sensor!\n");
        return false;
    }
    sensor.startContinuous();
    Serial.print("VL53L0X initialized successfully\n");
    return true;
}

void updateVL53L0X(void) {
    vl53l0x_distance = sensor.readRangeContinuousMillimeters();
}

int ReadVL53L0X(void) {
    return vl53l0x_distance;
}

На еспрессиф не нашел такого. Вы правы.

повелся на описание платы

из какого куска платы можно сделать вывод о толерантности к 5в?

на самом деле пины толерантны (есть исключения), об этом раньше было написано в даташите, потом это дело убрали от туда, защитив себя от дурака.
источник тут
как говорится, за что купил.

Я переподключал питание на 3,3в. Картинка на шине i2c не менялась от этого. Разве, что амплитуда сигнала меньше была.

Либо второй датчик так же не исправен. Или все же у нужно как-то принудительно выбрать интерфейс i2c