ADXL345 подвешивает микроконтроллер по мере увеличения вибрации
Я использую акселерометр ADXL345 с библиотекой Adafruit_ADXL345 для измерения вибрации.
Я считываю ускорение по осям X, Y, Z датчика, размещенного на вибрирующей платформе.И последовательная отправка его на ПК со скоростью передачи данных в бодах 115200.
Когда вибрация низкая, датчик показывает вибрацию, но когда я увеличиваю вибрацию, последовательная передача, кажется, останавливается. Как показано на рисунке:(ось x=Образцы ось y=Значения )
Я подумал, что это может быть из-за слабых соединений, поэтому припаял его клеммы, но при более высоких вибрациях он вел себя точно так же. Вот код, который я использую.
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_ADXL345_U.h>
/* Одновременно назначьте этому датчику уникальный идентификатор */
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12);
int i=0;
struct measure
{
int timestamp;
float x; // ACC in x direction
float y; //ACC in y direction
float z; //ACC in z direction
};
sensors_event_t event;
struct measure measurements;
int timestamp = 0;
void setup(){
Serial.begin(115200);
Serial.println("Accelerometer Test"); Serial.println("");
/* Инициализация датчика */
if(!accel.begin())
{
/* Возникла проблема с обнаружением ADXL345 ... проверьте соединения */
Serial.println("Ooops, no ADXL345 detected ... Check your wiring!");
while(1);
}
accel.setDataRate(ADXL345_DATARATE_3200_HZ);
accel.setRange(ADXL345_RANGE_16_G);
pinMode(LED_BUILTIN, OUTPUT);
delay(2000);
}
void loop(){
accel.getEvent(&event);
measurements.timestamp = timestamp++;
measurements.x = event.acceleration.x;
measurements.y = event.acceleration.y;
measurements.z = event.acceleration.z;
if(measurements.timestamp%2==0)
digitalWrite(LED_BUILTIN, HIGH);
else
digitalWrite(LED_BUILTIN, LOW);
/* Отправка массива с данными через последовательный порт */
Serial.print(measurements.timestamp);
Serial.print(",");
Serial.print(measurements.x+0.06);
Serial.print(",");
Serial.print(measurements.y+0.7);
Serial.print(",");
Serial.println(measurements.z-10.10);
}
В чем заключается проблема? Как решить эту проблему?
Соединения цепи:
@Masood Salik, 👍0
Обсуждение1 ответ
Существует известная проблема с "проводной" библиотекой по умолчанию, когда, если определенный переход пропущен, код переходит в бесконечный цикл (вместо тайм-аута). Возможно, вы достигли такой ситуации. Возможная причина заключается в том, что вы печатаете номера с довольно высокой скоростью передачи данных. Печать может занимать так много времени (сама по себе вызывая последовательные прерывания по мере опустошения последовательного буфера), что код I2C не выполняет вовремя прерывание I2C.
Вы можете попробовать снизить скорость печати в бодах (что я обычно не рекомендую), что означает, что последовательные прерывания будут происходить реже.
Существует библиотека схем DSS, в которой есть тайм-аут для I2C, который может в определенной степени решить эту проблему:
http://dsscircuits.com/articles/arduino-i2c-master-library
Еще одна вещь, которую вы могли бы попробовать, - это обобщить данные (например, образец для 500 мс, а затем отправить среднее значение), что уменьшило бы количество последовательных сообщений.
Также вы можете попробовать более низкие значения для подтягивающих резисторов, например 4,7 к.
Итак, мои рекомендации таковы:
- Уменьшите скорость передачи данных (например, до 9600 бод) и посмотрите, исчезнет ли зависание
- Суммируйте данные, а не отправляйте каждое чтение
- Попробуйте 4.7 k подтягивающие резисторы
Если у вас есть логический анализатор, вы можете посмотреть на сигналы I2C и посмотреть, сможете ли вы определить, передаются ли данные так, как ожидалось, когда происходят вибрации.
Продам логические анализаторы, самый дешевый из которых 109 долларов. Я широко использую их (более дорогие) анализаторы для отладки такого рода вещей.
- Можно ли измерить скорость акселерометром? Насколько точно?
- В чем разница между акселерометром, гироскопом и датчиком магнитометра?
- OVF в последовательном мониторе вместо данных
- Построение графика данных датчика Arduino в реальном времени на Processing, MatLab или Python
- Как связаться с датчиком через порты RX/TX Arduino?
- Линейное ускорение от MPU 6050
- Как правильно определить крен, тангаж, перемещение?
- Правильный способ получить значения крена, тангажа и перемещения
После быстрого просмотра кода Adafruit я ожидаю, что он вернет ноль или мусор, даже если ADXL перестанет работать. Arduino также подвержен вибрации? Я бы попробовал удалить код акселерометра и просто передать " ABC " или что-то в этом роде и посмотреть, не остановится ли он все еще из-за аппаратной проблемы., @PeterJ
Если я удаляю код акселерометра и передаю что-либо, он отлично печатает без каких-либо проблем (с или без воздействия вибрации arduino), @Masood Salik
В примере с Adafruit есть задержка в конце цикла, а у вас ее нет. Возможно, вы передаете слишком много данных через последовательный порт. Если вы хотите максимальную скорость, попробуйте автобус SPI. Вы можете попробовать другую библиотеку, поиск по Github.com для adxl345. Что ты хочешь сделать ? Сколько образцов в секунду вы хотите ?, @Jot
Может быть, вибрация сотрясает ваши провода и нарушает связь..., @Majenko
@MasoodSalik - (a) Судя по быстрому чтению кода Arduino & Adafruit I2C, нет никакого "упрочнения", чтобы справиться с ошибками I2C. (б) я не вижу никаких доказательств того, что *микроконтроллер* висит-например, *код* может находиться в цикле без таймаута (например). Важно не винить MCU преждевременно. Я рекомендую вам просматривать сигналы I2C, в идеале используя оптический прицел, в противном случае-логический анализатор(LA), как до, так и после решения проблемы. Еще лучше, если ваш scope или LA могут сработать в самом начале проблемы. (c) *"x-axis=Samples y-axis=Samples"* Я сомневаюсь, что - возможно, x-axis = samples & y-axis = values?, @SamGibson
(d) Неясно, какую ось представляют красные (R), зеленые (G) и синие (B) линии и почему они центрированы на разных значениях, например R центрирован на +10, B центрирован на 0 и G центрирован на -8. Пожалуйста, объясните. (д) Сравните "застрявшие значения" на каждой оси после начала задачи в нескольких тестах. Всегда ли линия G "застревает" на совсем другом значении, чем R & B? (f) Было бы также интересно, если бы вы могли тестировать увеличение силы G на одной оси за раз и проверять реакцию датчика до тех пор, пока не возникнет проблема., @SamGibson
У меня также есть ваша проблема с adxl и микро, которую вы решили? Вы не могли бы мне помочь? моя электронная почта : [email protected], @Amir.kom