В комментариях поста про создание трех-степенной платформы на базе аппаратной платформы Arduino поднимался вопрос управления не только с компьютера, поэтому было решено разобраться с работой акселерометра MMA7260, который можно свободно приобрести в Гонконге на Ebay.
Для реализации задуманного нам понадобятся следующие комплектующие:
Самой необходимой деталью для нашей установки является акселерометр. На просторах сети имеется множество предложения для Arduino в части акселерометров и самый доступный — это трех-осевой акселерометр MMA7260. В продаже он уже поставляется на плате, где уже имеется стабилизатор 3,3в 800мА для питания. На выходах осей X, Y, Z распаяны фильтры в виде RC-цепочек, а также сам он имеет фильтр низких частот (что не очень заметно при первом знакомстве).
В соответствии с документацией на устройство, имеется возможность выбора чувствительности (4 режима), а также включение и выключения режима сна. Настройка чувствительности датчика осуществляется с помощью входов G1 и G2. Максимальный уровень чувствительности 1.5g (00), минимальный 6g (11).
Подключение акселерометра к плате Arduino осуществляется по схеме, представленной ниже:
Чтобы акселерометр всегда выдавал значения его принудительно необходимо вывести из режима сна, просто подав на выход SL (Sleep) питание. Выбор режима чувствительности осуществляется с помощью перемычек J1 и J2.
Первоначально данную схему можно собрать на макетной плате, после чего можно распаять длинные проводки. Перемычки ставятся на контактную площадку 3х2, где крайние левые два контакта 3.3в, центральные G1 и G2 соответственно, а крайние правые контакты «земля».
В результате после сборки получается следующая конструкция:
Подключение трехстепенной платформы к Arduino осуществляется на три выхода с поддержкой ШИМ, а входы от датчика положения на три аналоговых входа A0...A2. Пример подключения узлов к Arduino:
Тестирование и проверка работоспособности акселерометра осуществляется с помощью следующей программы:
Инструменты и материалы
Для реализации задуманного нам понадобятся следующие комплектующие:
Найменование | Количество |
Акселерометр 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 осуществляется по схеме, представленной ниже:
Чтобы акселерометр всегда выдавал значения его принудительно необходимо вывести из режима сна, просто подав на выход SL (Sleep) питание. Выбор режима чувствительности осуществляется с помощью перемычек J1 и J2.
Первоначально данную схему можно собрать на макетной плате, после чего можно распаять длинные проводки. Перемычки ставятся на контактную площадку 3х2, где крайние левые два контакта 3.3в, центральные G1 и G2 соответственно, а крайние правые контакты «земля».
В результате после сборки получается следующая конструкция:
Подключение трехстепенной платформы к Arduino осуществляется на три выхода с поддержкой ШИМ, а входы от датчика положения на три аналоговых входа A0...A2. Пример подключения узлов к Arduino:
Программирование
Тестирование и проверка работоспособности акселерометра осуществляется с помощью следующей программы:
- int x, y, z;
-
- // Калибровка датчика
- int dx=357;
- int dy=385;
- int dz=178;
- void setup()
- {
- Serial.begin(9600);
- }
-
- void loop()
- {
- // Значения осей с датчика
- x = analogRead(A0) - dx;
- y = analogRead(A1) - dy;
- z = analogRead(A2) - dz;
-
- // Вывод в Serial monitor
- Serial.print("X: ");
- Serial.print(x);
- Serial.print("Y:");
- Serial.print(y);
- Serial.print("Z:");
- Serial.println(z);
-
- //Период опроса
- delay(100);
- }
* This source code was highlighted with Source Code Highlighter.
Тестирование
Перед началом работы, необходимо произвести калибровку датчика, по следующей методике:
1) Установить в прошивке контроллера значения калибровки равные нулю, записать прошивку в контроллер;
2) Зафиксировать датчик в горизонтальном положении;
3) Снять показания с датчика в течение 3 секунд;
4) Вычислить средние значения в горизонтальном положении и внести поправку в калибровочные значения.
Данные измерения необходимо делать на минимальной чувствительности или близкой к ней, чтобы исключить лишние показания при ударах стала или любые другие воздействия.
До проведения калибровки датчик выдавал следующие значения:
По графику видно, что завяленные фильтры низких частот работают довольно странно, так как шумят оси очень сильно. Для подавления шума необходимо или писать свой фильтр низких частот или нормировать шкалу измерений к меньшей (в случае с сервоприводами шум частично подавляется таким методом).
В результате полученных измерений были получены следующие поправки:
- dx = 357
- dy = 385
- dz = 178
После калибровки показания датчика стали показывать реальную картину:
В таком виде уже можно использовать показания датчика в своих проектах.
Результат
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.