Как имитировать акселерометр?

Я новичок в Arduino. Я хочу смоделировать схему, в которой используются акселерометр ADXL335 и двигатель постоянного тока. Если в показаниях акселерометра наблюдается какое-либо отклонение, я хочу, чтобы мотор вращался. Есть ли способ смоделировать его работу в программном обеспечении, не реализуя его?

, 👍2


1 ответ


Лучший ответ:

5

Ваш датчик выдает аналоговый сигнал в диапазоне от 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). Graph

,

Входное напряжение 1,65 В (половина 3,3 В) должно дать значение (1,65 В ÷ 5 В) × 1024 ≈ 338., @Edgar Bonet

Конечно, вы правы, я забыл, что по умолчанию AnalogRead() имеет значение 10 бит. Спасибо, пост исправлен., @towe