Как стать автором
Обновить

Ловим горизонт с Arduino

Время на прочтение 3 мин
Количество просмотров 76K
В комментариях поста про создание трех-степенной платформы на базе аппаратной платформы Arduino поднимался вопрос управления не только с компьютера, поэтому было решено разобраться с работой акселерометра MMA7260, который можно свободно приобрести в Гонконге на Ebay.
image


Инструменты и материалы


Для реализации задуманного нам понадобятся следующие комплектующие:
Найменование Количество
Акселерометр MMA7260 1 шт.
Трех-степенная платформа 1 шт.
Макетная плата 1 шт.
Стяжка 1 шт.
Соединительные провода 8 шт.
Белый медведь 1 шт.


Самой необходимой деталью для нашей установки является акселерометр. На просторах сети имеется множество предложения для Arduino в части акселерометров и самый доступный — это трех-осевой акселерометр MMA7260. В продаже он уже поставляется на плате, где уже имеется стабилизатор 3,3в 800мА для питания. На выходах осей X, Y, Z распаяны фильтры в виде RC-цепочек, а также сам он имеет фильтр низких частот (что не очень заметно при первом знакомстве).

В соответствии с документацией на устройство, имеется возможность выбора чувствительности (4 режима), а также включение и выключения режима сна. Настройка чувствительности датчика осуществляется с помощью входов G1 и G2. Максимальный уровень чувствительности 1.5g (00), минимальный 6g (11).

Схема подключения


Подключение акселерометра к плате Arduino осуществляется по схеме, представленной ниже:
image
Чтобы акселерометр всегда выдавал значения его принудительно необходимо вывести из режима сна, просто подав на выход SL (Sleep) питание. Выбор режима чувствительности осуществляется с помощью перемычек J1 и J2.

Первоначально данную схему можно собрать на макетной плате, после чего можно распаять длинные проводки. Перемычки ставятся на контактную площадку 3х2, где крайние левые два контакта 3.3в, центральные G1 и G2 соответственно, а крайние правые контакты «земля».

В результате после сборки получается следующая конструкция:
image

Подключение трехстепенной платформы к Arduino осуществляется на три выхода с поддержкой ШИМ, а входы от датчика положения на три аналоговых входа A0...A2. Пример подключения узлов к Arduino:
image

Программирование


Тестирование и проверка работоспособности акселерометра осуществляется с помощью следующей программы:
  1. int x, y, z;
  2.  
  3. // Калибровка датчика
  4. int dx=357;
  5. int dy=385;
  6. int dz=178;
  7. void setup()
  8. {
  9.    Serial.begin(9600);
  10. }
  11.  
  12. void loop()
  13. {
  14.   // Значения осей с датчика
  15.   x = analogRead(A0) - dx;
  16.   y = analogRead(A1) - dy;
  17.   z = analogRead(A2) - dz;
  18.  
  19.   // Вывод в Serial monitor
  20.   Serial.print("X: ");
  21.   Serial.print(x);
  22.   Serial.print("Y:");
  23.   Serial.print(y);
  24.   Serial.print("Z:");
  25.   Serial.println(z);
  26.  
  27.   //Период опроса
  28.   delay(100);
  29. }
* This source code was highlighted with Source Code Highlighter.


Тестирование


Перед началом работы, необходимо произвести калибровку датчика, по следующей методике:
1) Установить в прошивке контроллера значения калибровки равные нулю, записать прошивку в контроллер;
2) Зафиксировать датчик в горизонтальном положении;
3) Снять показания с датчика в течение 3 секунд;
4) Вычислить средние значения в горизонтальном положении и внести поправку в калибровочные значения.

Данные измерения необходимо делать на минимальной чувствительности или близкой к ней, чтобы исключить лишние показания при ударах стала или любые другие воздействия.

До проведения калибровки датчик выдавал следующие значения:
image

По графику видно, что завяленные фильтры низких частот работают довольно странно, так как шумят оси очень сильно. Для подавления шума необходимо или писать свой фильтр низких частот или нормировать шкалу измерений к меньшей (в случае с сервоприводами шум частично подавляется таким методом).

В результате полученных измерений были получены следующие поправки:
  • dx = 357
  • dy = 385
  • dz = 178

После калибровки показания датчика стали показывать реальную картину:
image

В таком виде уже можно использовать показания датчика в своих проектах.

Результат




UPD. Программная фильтрация сигнала осуществляется по алгоритму, представленному в википедии:
function lowpass(real[0..n] x, real dt, real RC)
  var real[0..n] y
  var real α := dt / (RC + dt)
  y[0] := x[0]
  for i from 1 to n
    y[i] := α * x[i] + (1-α) * y[i-1]
  return y


* This source code was highlighted with Source Code Highlighter.

хотя второй вариант мне нравится больше:
  for i from 1 to n
    y[i] := y[i-1] + α * (x[i] - y[i-1])


* This source code was highlighted with Source Code Highlighter.
Теги:
Хабы:
+56
Комментарии 72
Комментарии Комментарии 72

Публикации

Истории

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн