Как имитировать акселерометр?
Я новичок в Arduino. Я хочу смоделировать схему, в которой используются акселерометр ADXL335 и двигатель постоянного тока. Если в показаниях акселерометра наблюдается какое-либо отклонение, я хочу, чтобы мотор вращался. Есть ли способ смоделировать его работу в программном обеспечении, не реализуя его?
1 ответ
Лучший ответ:
Ваш датчик выдает аналоговый сигнал в диапазоне от 0 В для -3g до 3,3 В для +3g.
Это означает, что у вас есть среднее значение сигнала «338» при чтении с помощью функции Arduino analogRead()
с пиками в любом направлении при изменении ускорения.
Вам понадобится код, который даст вам переменную, колеблющуюся в районе «338», со случайными скачками ускорения, вносимыми в любом направлении. Это может выглядеть примерно так:
int16_t num_zerog = (3.3 / 5) * 512;
int16_t num_xaxis = num_zerog;
uint8_t num_random = 0;
void setup() {
Serial.begin(115200);
}
void loop() {
// put your main code here, to run repeatedly:
num_random = random(256);
if (num_random == 255) {
num_xaxis += 200;
}
else if (num_random == 0) {
num_xaxis -= 200;
}
else if (num_random < 100) {
num_xaxis += 1;
}
else if (num_random > 155) {
num_xaxis += 1;
}
else {
num_xaxis += (num_zerog - num_xaxis) / 4;
}
if(num_xaxis < 0 || num_xaxis > 675) {
num_xaxis = num_zerog;
}
Serial.println(num_xaxis);
delay(10);
}
Пояснение: Во-первых, значение 0g определяется по разности напряжений. Генерируется случайное значение в диапазоне от 0 до 255. Если случайное значение равно 0, к вашему «сигналу» добавляется отрицательное значение. Если оно равно 255, добавляется положительный всплеск. Если получено какое-либо другое значение, оно возвращается к уровню 0g с 1/4 разницы между текущим значением и значением 0g за цикл.
Последовательные команды служат только для того, чтобы вы могли наблюдать за результатом в последовательном плоттере Arduino IDE.
Если вам нужно, чтобы всплески происходили реже, отрегулируйте delay()
или позвольте счетчику увеличиваться до более высоких значений.
Если команда delay()
, блокирующая процессор, является проблемой в вашем проекте, вы можете запустить код рандомизации, используя таймер и прерывание.
Обратите внимание, что настоящие датчики ускорения производят гораздо больше шума. Это можно реализовать, добавляя меньшие пики в более широком диапазоне случайных значений (например, -1, если num_random ниже 100, и +1, если оно выше 155).
- Можно ли измерить скорость акселерометром? Насколько точно?
- В чем разница между акселерометром, гироскопом и датчиком магнитометра?
- OVF в последовательном мониторе вместо данных
- Построение графика данных датчика Arduino в реальном времени на Processing, MatLab или Python
- Как связаться с датчиком через порты RX/TX Arduino?
- Линейное ускорение от MPU 6050
- Как правильно определить крен, тангаж, перемещение?
- Правильный способ получить значения крена, тангажа и перемещения
Входное напряжение 1,65 В (половина 3,3 В) должно дать значение (1,65 В ÷ 5 В) × 1024 ≈ 338., @Edgar Bonet
Конечно, вы правы, я забыл, что по умолчанию AnalogRead() имеет значение 10 бит. Спасибо, пост исправлен., @towe