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()
; Я пробовал каждый по отдельности.
@Jacksonkr, 👍5
Обсуждение3 ответа
Является ли это одной из многих терминологий, придуманных Arduino? Обычно функция возвращает НОЛЬ в случае успеха и -1 или положительное число, определяющее ошибку.
if(!accel.begin())
{ /* Возникла проблема с обнаружением LSM303... проверьте соединения */ Serial.println(F("Ой, LSM303 не обнаружен... Проверьте проводку!")); пока (1);
Разные функции возвращают разные вещи. Функции, обрабатывающие буферы, предоставленные вызывающей стороной, обычно возвращают указатель буфера вызывающей стороны в случае успеха или указатель NULL в случае ошибки, что является одним из многих контрпримеров. Вы не можете предположить, какой выбор сделал другой автор, не прочитав описание или сам код. Автор этой библиотеки написал функцию .begin() для возврата логического значения; TRUE в случае успеха и FALSE в противном случае. Это не редкость., @JRobert
Проверьте каждый свой условный оператор в
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);
}
комментируя других.
У меня была похожая проблема. Оказывается, это была неисправная проводка, вероятно, из-за дешевой макетной платы (как нуб, вы ожидаете идеального подключения от чего-то вроде макетной платы! Оказывается: совсем нет!)
Вот как я приступил к его отладке, используя сканер i2c для отладки подключения (найдите библиотеку + пример здесь) .
- удалить циклы
while(1)
, которые останавливают вашу программу, чтобы программа не останавливалась при ошибке - Используйте «переменную ошибки», например
fail
. Инициализируйте, например, какfail=0
в начале скрипта, чтобы он был глобальным. Добавьтеfail=1
для каждого случая oops вinitSensors()
- в
loop()
проверьте, еслиfail==0
, если да, продолжите вывод значений датчика 10DOF, если есть ошибка (fail ==1
) вызовитеinitSensors()
иi2cscanner()
, чтобы получить представление об отладке подключения. Это будет выглядеть так, как показано ниже, и будет продолжать вызывать функцию отладки, пока вы не подключите ее правильно.
Надеюсь, это было полезно или, по крайней мере, интересно для вас, удачи.
Скриншот сканера i2c:
- Как подключить несколько акселерометров MMA8451 (протокол I2C) с помощью одного Arduino Mega
- ADXL345 выдает ошибку проводки в режиме SPI
- Можно ли измерить скорость акселерометром? Насколько точно?
- В чем разница между акселерометром, гироскопом и датчиком магнитометра?
- OVF в последовательном мониторе вместо данных
- Построение графика данных датчика Arduino в реальном времени на Processing, MatLab или Python
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor
- Почему Adafruit motor shield не крутит моторы?
те же проблемы, заказал плату с AliExpress. Однако, используя этот код, я могу сообщить, что в моем случае плата не мертва и сообщает некоторые значения - она просто почему-то не распознается.
int yAxis = AnalogRead(A4); // Вывод акселерометра Серийный.принт(","); Serial.pr int(yAxis);
, @user2305193@user2305193 Увлекательно. Пожалуйста, дайте мне знать, как это получается!, @Jacksonkr