Прорыв LSM9DS1 - Как увеличить скорость
Что касается прорыва Adafruit LSM9DS1: введите здесь описание ссылки
И с помощью библиотеки: введите здесь описание ссылки
Я пытаюсь увеличить частоту дискретизации или скорость этого чипа. Я использую Sparkfun Pro Micro 5V
С библиотекой adafruit вам нужно одновременно запросить акселерометр, гироскоп, магнитометр и температуру, и все, что мне нужно, это значения акселерометра. Я надеюсь, выяснив, как запрашивать только значения ускорения, это ускорит цикл. Но кроме того, должен быть какой-то другой параметр, который мог бы увеличить частоту дискретизации?
Буду признателен за любую помощь!
мой код сейчас:
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_LSM9DS1.h>
#include <Adafruit_Sensor.h> // в этой демонстрации не используется, но необходим!
Adafruit_LSM9DS1 lsm = Adafruit_LSM9DS1();
#define LSM9DS1_SCK A5
#define LSM9DS1_MISO 12
#define LSM9DS1_MOSI A4
#define LSM9DS1_XGCS 6
#define LSM9DS1_MCS 5
void setupSensor()
{
// 1.) Установить диапазон акселерометра
lsm.setupAccel(lsm.LSM9DS1_ACCELRANGE_2G);
//lsm.setupAccel(lsm.LSM9DS1_ACCELRANGE_4G);
//lsm.setupAccel(lsm.LSM9DS1_ACCELRANGE_8G);
//lsm.setupAccel(lsm.LSM9DS1_ACCELRANGE_16G);
// 2.) Установить чувствительность магнитометра
lsm.setupMag(lsm.LSM9DS1_MAGGAIN_4GAUSS);
//lsm.setupMag(lsm.LSM9DS1_MAGGAIN_8GAUSS);
//lsm.setupMag(lsm.LSM9DS1_MAGGAIN_12GAUSS);
//lsm.setupMag(lsm.LSM9DS1_MAGGAIN_16GAUSS);
// 3.) Настраиваем гироскоп
lsm.setupGyro(lsm.LSM9DS1_GYROSCALE_245DPS);
//lsm.setupGyro(lsm.LSM9DS1_GYROSCALE_500DPS);
//lsm.setupGyro(lsm.LSM9DS1_GYROSCALE_2000DPS);
}
double accelX = 0;
double accelY = 0;
double accelZ = 0;
double rms = 0;
void setup()
{
Serial.begin(115200);
// Попытаться инициализировать и предупредить, если мы не смогли обнаружить чип
if (!lsm.begin())
{
Serial.println("Oops ... unable to initialize the LSM9DS1. Check your
wiring!");
while (1);
}
Serial.println("Found LSM9DS1 9DOF");
setupSensor();
delay(5000);//стабилизация программы
}
void loop()
{
lsm.read();
sensors_event_t a, m, g, temp;
lsm.getEvent(&a, &m, &g, &temp);
accelX = a.acceleration.x;
accelY = a.acceleration.y;
accelZ = a.acceleration.z;
rms = (accelX*accelX)+(accelY*accelY)+(accelZ*accelZ);
Serial.println(rms);
}
@MattG, 👍0
2 ответа
Лучший ответ:
Проверьте заголовок библиотеки,
вы найдете readAccel
readMag
readGyro
и readTemp
в отдельных общедоступных функциях и посмотрите на реализация read
, он просто вызывает эти 4 последовательно. readAccel
обновит поле члена accelData
.
Таким образом, вы можете просто вызвать lsm.readAccel()
в цикле, а затем напрямую получить lsm.accelData
и игнорировать все остальное.
void loop()
{
lsm.readAccel();
accelX = lsm.accelData.x;
accelY = lsm.accelData.y;
accelZ = lsm.accelData.z;
rms = (accelX*accelX)+(accelY*accelY)+(accelZ*accelZ);
Serial.println(rms);
}
Вот ссылка на техническое описание LSM9DS1. В главе 3 описывается, как перевести устройство в режим только акселерометра. При быстром просмотре я понял, что там также была информация о времени, но, по крайней мере, зная, как это сделать, вы могли бы сделать свои собственные измерения времени.
Я вижу, вы можете перевести устройство только в режим ускорения, но, к сожалению, я не понимаю, как на самом деле реализовать инструкции. Это то, что будет изменено в файлах библиотеки?, @MattG
В Adafruit_LSM9DS1.h библиотеки Adafruit в строке 243 находится несколько функций для чтения отдельных датчиков (например, Sensor& getAccel (void) { return _accelSensor; }). Чтобы получить преимущество во времени, вам может потребоваться перевести устройство в режим только ускорения, что, да, потребует некоторого изучения файла .cpp библиотеки, чтобы выяснить, как это сделать или где добавить возможность. Я также вижу, что есть несколько доступных вариантов скорости передачи данных. Но это все, что я знаю об этом устройстве. Больше нужно будет посмотреть код библиотеки и таблицу данных., @JRobert
хорошо, спасибо за вклад и помощь @jrobert!, @MattG
- В чем разница между акселерометром, гироскопом и датчиком магнитометра?
- Как прочитать необработанные данные с модуля GY-85?
- Значения кватерниона из 9-осевого щита движения Arduino кажутся очень неправильными
- Arduino Pro Micro, получить данные с контакта Tx?
- Преобразование трехосевого магнитометра в Градусы
- Что означает “LSB на градус в секунду” (LSB per degree per second)?
- Отправка мультимедийных клавиш клавиатуры с помощью библиотеки клавиатур
- Распиновка аналога Arduino Pro Micro
Спасибо! Я попробую это, надеюсь, это немного ускорит выборку., @MattG
Это сработало, теперь частота дискретизации значительно выше, когда я реализовал приведенный выше код от @ratchet freak., @MattG
@MattG, изучив код более подробно, понял, что
getEvent
также сделалread()
. Таким образом, ваш исходный код выполнял полное чтение дважды и использовал данные только для половины фактически считанных образцов., @ratchet freakэто имеет смысл, теперь, когда я реализовал ваши предложения, это значительно быстрее. Еще раз спасибо., @MattG