Ooops, no LSM303 detected ... Check your wiring!

История

У меня есть Adafruit 10DOF IMU Breakout , который некоторое время работал над моей Mega. Сегодня утром моя программа не запустилась, поэтому я начал устранение неполадок.

Сценарий

В конце концов я подключил IMU к моему Uno с помощью стандартной программы чтения акселерометров от Adafruit. Вот тогда я и начал видеть

К сожалению, LSM303 не обнаружен... Проверьте проводку!

И после тщательного осмотра убедились, что все провода находятся в правильном месте.


Вопрос

Как устранить эту проблему? Кроме того, я начинаю думать, что IMU может быть сломан. Как это проверить?


* Готовая программа AHRS от Adafruit:

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_LSM303_U.h>
#include <Adafruit_BMP085_U.h>
#include <Adafruit_L3GD20_U.h>
#include <Adafruit_10DOF.h>

/* Assign a unique ID to the sensors */
Adafruit_10DOF                dof   = Adafruit_10DOF();
Adafruit_LSM303_Accel_Unified accel = Adafruit_LSM303_Accel_Unified(30301);
Adafruit_LSM303_Mag_Unified   mag   = Adafruit_LSM303_Mag_Unified(30302);
Adafruit_BMP085_Unified       bmp   = Adafruit_BMP085_Unified(18001);

/* Update this with the correct SLP for accurate altitude measurements */
float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA;

/**************************************************************************/
/*!
    @brief  Initialises all the sensors used by this example
*/
/**************************************************************************/
void initSensors()
{
  if(!accel.begin())
  {
    /* There was a problem detecting the LSM303 ... check your connections */
    Serial.println(F("Ooops, no LSM303 detected ... Check your wiring!"));
    while(1);
  }
  if(!mag.begin())
  {
    /* There was a problem detecting the LSM303 ... check your connections */
    Serial.println("Ooops, no LSM303 detected ... Check your wiring!");
    while(1);
  }
  if(!bmp.begin())
  {
    /* There was a problem detecting the BMP180 ... check your connections */
    Serial.println("Ooops, no BMP180 detected ... Check your wiring!");
    while(1);
  }
}

/**************************************************************************/
/*!

*/
/**************************************************************************/
void setup(void)
{
  Serial.begin(115200);
  Serial.println(F("Adafruit 10 DOF Pitch/Roll/Heading Example")); Serial.println("");
  
  /* Initialise the sensors */
  initSensors();
}

/**************************************************************************/
/*!
    @brief  Constantly check the roll/pitch/heading/altitude/temperature
*/
/**************************************************************************/
void loop(void)
{
  sensors_event_t accel_event;
  sensors_event_t mag_event;
  sensors_event_t bmp_event;
  sensors_vec_t   orientation;

  /* Read the accelerometer and magnetometer */
  accel.getEvent(&accel_event);
  mag.getEvent(&mag_event);

  /* Use the new fusionGetOrientation function to merge accel/mag data */  
  if (dof.fusionGetOrientation(&accel_event, &mag_event, &orientation))
  {
    /* 'orientation' should have valid .roll and .pitch fields */
    Serial.print(F("Orientation: "));
    Serial.print(orientation.roll);
    Serial.print(F(" "));
    Serial.print(orientation.pitch);
    Serial.print(F(" "));
    Serial.print(orientation.heading);
    Serial.println(F(""));
  }

  /* Previous code removed handling accel and mag data separately */
  // /* Расчет тангажа и крена по необработанным данным акселерометра */
  // Serial.print(F("Ориентация: "));
  // accel.getEvent(&accel_event);
  // если (dof.accelGetOrientation(&accel_event, &ориентация))
  // {
  // /* 'ориентация' должна иметь корректные поля .roll и .pitch */
  // Serial.print(ориентация.рулон);
  // Serial.print(F(" "));
  // Serial.print(ориентация.шаг);
  // Serial.print(F(" "));
  // }
  //
  // /* Расчет курса по магнитометру */
  // mag.getEvent(&mag_event);
  // if (dof.magGetOrientation(SENSOR_AXIS_Z, &mag_event, &ориентация))
  // {
  // /* Теперь 'ориентация' должна иметь действительные данные .heading */
  // Serial.print(ориентация.заголовок);
  // }
  // Serial.println(F(""));

  /* Calculate the altitude using the barometric pressure sensor */
  bmp.getEvent(&bmp_event);
  if (bmp_event.pressure)
  {
    /* Get ambient temperature in C */
    float temperature;
    bmp.getTemperature(&temperature);
    /* Convert atmospheric pressure, SLP and temp to altitude */
    Serial.print(F("Alt: "));
    Serial.print(bmp.pressureToAltitude(seaLevelPressure,
                                        bmp_event.pressure,
                                        temperature)); 
    Serial.println(F(""));
    /* Display the temperature */
    Serial.print(F("Temp: "));
    Serial.print(temperature);
    Serial.println(F(""));
  }
  
  delay(100);
}

-- ИЗМЕНЕНО --

Я почти уверен, что плата мертва. Программа останавливается на accel.begin(), mag.begin() или bmp.begin(); Я пробовал каждый по отдельности.

, 👍5

Обсуждение

те же проблемы, заказал плату с AliExpress. Однако, используя этот код, я могу сообщить, что в моем случае плата не мертва и сообщает некоторые значения - она просто почему-то не распознается. int yAxis = AnalogRead(A4); // Вывод акселерометра Серийный.принт(","); Serial.pr int(yAxis);, @user2305193

@user2305193 Увлекательно. Пожалуйста, дайте мне знать, как это получается!, @Jacksonkr


3 ответа


0

Является ли это одной из многих терминологий, придуманных Arduino? Обычно функция возвращает НОЛЬ в случае успеха и -1 или положительное число, определяющее ошибку.

if(!accel.begin())

{ /* Возникла проблема с обнаружением LSM303... проверьте соединения */ Serial.println(F("Ой, LSM303 не обнаружен... Проверьте проводку!")); пока (1);

,

Разные функции возвращают разные вещи. Функции, обрабатывающие буферы, предоставленные вызывающей стороной, обычно возвращают указатель буфера вызывающей стороны в случае успеха или указатель NULL в случае ошибки, что является одним из многих контрпримеров. Вы не можете предположить, какой выбор сделал другой автор, не прочитав описание или сам код. Автор этой библиотеки написал функцию .begin() для возврата логического значения; TRUE в случае успеха и FALSE в противном случае. Это не редкость., @JRobert


1

Проверьте каждый свой условный оператор в

if(!accel.begin())
  {
    /* There was a problem detecting the LSM303 ... check your connections */
    Serial.println(F("Ooops, no LSM303 detected ... Check your wiring!"));
    while(1);
  }
  if(!mag.begin())
  {
    /* There was a problem detecting the LSM303 ... check your connections */
    Serial.println("Ooops, no LSM303 detected ... Check your wiring!");
    while(1);
  }
  if(!bmp.begin())
  {
    /* There was a problem detecting the BMP180 ... check your connections */
    Serial.println("Ooops, no BMP180 detected ... Check your wiring!");
    while(1);
  }

комментируя других.

,

1

У меня была похожая проблема. Оказывается, это была неисправная проводка, вероятно, из-за дешевой макетной платы (как нуб, вы ожидаете идеального подключения от чего-то вроде макетной платы! Оказывается: совсем нет!)

Вот как я приступил к его отладке, используя сканер i2c для отладки подключения (найдите библиотеку + пример здесь) .

  1. удалить циклы while(1), которые останавливают вашу программу, чтобы программа не останавливалась при ошибке
  2. Используйте «переменную ошибки», например fail. Инициализируйте, например, как fail=0 в начале скрипта, чтобы он был глобальным. Добавьте fail=1 для каждого случая oops в initSensors()
  3. в loop() проверьте, если fail==0, если да, продолжите вывод значений датчика 10DOF, если есть ошибка (fail ==1) вызовите initSensors() и i2cscanner(), чтобы получить представление об отладке подключения. Это будет выглядеть так, как показано ниже, и будет продолжать вызывать функцию отладки, пока вы не подключите ее правильно.

Надеюсь, это было полезно или, по крайней мере, интересно для вас, удачи.

Скриншот сканера i2c:

,