Пользователь
0,0
рейтинг
28 августа 2011 в 01:16

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

В комментариях поста про создание трех-степенной платформы на базе аппаратной платформы 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.
@smashrod
карма
70,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое

Комментарии (72)

  • +6
    Блин, с каждым новым постом на хабре про arduino, все больше и больше хочется его приобрести)) Правда все же остается чувство что arduino — это читинг, потому что что-то за тебя уже сделали)))
    • +1
      Честно говоря, у копался с атмегой в чистом виде на макетках, это для тех кто любит больше схемотехнику в чистом виде. Arduino просто дает возможность не углубляться в дебри даташита контроллера. Для макетирования и отработки базовых вещей быстро и удобно создана Arduino, за это она мне и нравится.

      Разработка конечного устройства, это естественно надо делать с нуля и по честному для конкретного случая.
      • 0
        честность идет лесом — это же игрушки, есть даже готовые собранные платформы на колесах, с которыми минимум мороки и максимум позитива
        • +1
          Ну это ещё не готовая платформа с колесами :) Хотя у нас на работе студенты на готовом шасси робота и делали
          • 0
            А вы на ибэй заказываете или где то напрямую? Очень заинетересован найти магазин подешевле, а на ебае не особо разгонишся — погоришь на доставке. Я вот b2cqshop.com/ заказывал
            • 0
              Да я на аукционах без Buy is now, по байитнау получается на 2 — 3 бакса дороже
    • 0
      А мне вот уже не хочется, — уже жду вот такой вот как раз акселерометр с вагоном разных сенсоров и кучей другого интересного электронного хлама — заказал где то недельку назад

      Аж дух захватывает, извините, не сдержался, чтобы не порадоватся публично и неприлично :)

      • +1
        Я жду блюпуп и сервоприводы с металлическим редуктором, буду делать шесть степеней
        • 0
          Все-таки решились на редукторы?) Почем каждый? Если можно, ссылку)
          Как вообще продвигается гексапод?
          • 0
            4 сервы металлических TowerPro стоят $35
    • 0
      :)
      Я долго терпел. Пока на DX не появились (http://s.dealextreme.com/search/arduino)
      Тут уж жаба задохнулась и пришлось брать.
  • 0
    Осталось собрать все на одной плате, перевернуть платформой вниз, и получится робот, способный балансировать на наклонной плоскости.
    • +2
      Гиростабилизацию на следующей неделе хотим попробовать если придут ещё рычаги (зафиксировать степени свободы платформы), чтобы платформа держала сама горизонт в пределах отклонения до максимального угла.
  • 0
    Медведь прикольный. Вспомнился Умка на льдине.
    • 0
      А мне Мишка на Сервере)
  • +5
    Интересно. Вы вдохновили меня написать пост «Акселерометр на базе телефона Android» в DIY.
    • +1
      Лучше напишите в DIY «Телефон Android на базе акселерометра»!
    • 0
      Главное заинтересовать тематикой, тогда и будут появляться новые у людей.
  • +4
    Драматичный конец.
  • +2
    На фотографии у вас платформа подключена на PWM 0, 1, 2. Так как у вас в скетче используется терминал, то я рекомендую вам переключить платформу на PWM 2,3,4. Во избежание помех и пробоя FT232RL
    • 0
      Это на фотографии так видно (широкие резинки на проводах), на самом деле PWM используется с 2 по 4
  • 0
    Готовый джойстик, только на рукоятку прицепить. Еще-бы знать, как это в виде драйвера системе отдать… Не программист я.
    • 0
      На самом деле тут можно сделать драйвер, который будет виртуальным джойстиком, но информацию будет брать из COM порта, а самый простой способ просто читать COM порт и управлять объектом в программе. Если интересно могу и такое для примера описать.
      • 0
        Чтобы для старта особо много чего не городить, протестируйте это вначале в Processing
        • 0
          вообще просто в программе делать опрос состояния (как и джойтиск с DirectX) и двигать свой объект, это принципиально не сложно
  • 0
    Показания с датчика никак не обрабатываются? Имеется ввиду фильтрация.
    • +2
      В тестовой программе никак, а в управлении платформой используется низкочастотный фильтр из википедии (http://en.wikipedia.org/wiki/Low-pass_filter), там есть пример программной реализации. Плюс у меня на сервы потом изменяется шкала, поэтому 140 приводится к 45 градусам поворота сервы, и часть шума за счет этого сглатывается.
    • 0
      Дописал про фильтрацию в конце статьи. Спасибо.
  • +3
    Почему-то я сразу подумал о другом белом медведе, когда прочитал Инструменты и материалы.
  • 0
    Тоже скоро предстоит заняться связкой акселерометр + микропроцессор, правда безо всяких ардуин. И вот потихоньку назревает вопрос — как заставить процессор выходить из режима сна (подача «1» на одну из ног, в коде прописать какую) когда акселерометр меняет свое положение?
    • +1
      вообще зависит все от какого движеня должен просыпаться контроллер. А так надо чтобы на шум он был не чувствителен, а то будет просыпаться от шума постоянно…
    • +1
      Если акселерометр с аналоговым выходом (как здесь), то это сложно. Советую присмотреться к цифровым акселерометрам, вроде ADXL312 (как пример, взял первый попавшийся). У них есть выходы прерываний, и можно настроить порог ускорения, при превышении которого будет выдан сигнал прерывания, который и разбудит контроллер.
      • 0
        Да по I2C будет намного удобнее работать с ним, я на шесть степеней хочу поискать 6DOF акселерометр недорогой. Кстати цифровые акселерометры дороже, но сами фильтруют и компенсируют, хоть этот заявлен тоже с компенсацией и фильтрацией, но заметно это слабовато
  • 0
    Пример практического применения — у одного моего коллеги есть «дом на колёсах» и одна из проблем — выставить автомобиль абсолютно горизонтально, чтобы было комфортно спать. Он как раз использует ардуино в связке с примерно таким же датчиком. А показания выведены на экран компьютера («Car PC»), встроенного в переднюю панель.
    • 0
      это круто! У нас мы думаем стабилизацию для вертолета самим замутить, в альтеранативу китаясам
  • 0
    Не Гонк-Конг, а Гонконг -__-
    • +1
      Исправлено ;)
    • +1
      > Не Гонк-Конг, а Гонконг

      Спутал к Кинг-Конгом :-)
  • 0
    Много думал про «Белый медведь 1 шт.», пока читал статью, как дошел до ролика, отпустило =)
    • 0
      Летчик испытатель :)
  • 0
    А кто-нибудь знает, в чем разница между акселерометрами MMA7260 и MMA7361. Про последний пишут, что он пришел на замену первому, но почему-то цена на первый выше.
    • +1
      У него как минимум два режима чувствительности 1,5g и 6g, что не очень хорошо, потому что у меня например отличные результаты получились на 4g. Новым у него было стало определение свободного падения 0g. И ещё мне каежтся в нет нет температурной компенсации… Поэтому он и дешевле своего старшего собрата
      • 0
        Вроде разобрался. Оказывается, на MMA7260 аж четыре режима чуствительности 1.5g, 2g, 4g, 6g.
        Температурная компенсация есть в обоих. В MMA7361 есть еще и self test. Разница есть в схеме подключения. В MMA7260 нужен RC фильтр на выходы xyz, а в MMA7361 нужны только конденсаторы.
  • +1
    Поясните, пожалуйста.

    Получается что горизонт «запоминается», и далее идёт коррекция положения платформы в зависимости от показаний датчика.
    Имеет ли место «дрейф» горизонта при этом? Температурный или из-за погрешности вычислений?
    • 0
      в моем случае запоминается горизонт и дальше снимается отколнение от горизонта. В датчике предусмотрена температурная коррекция, так же есть и фильтры простые.

      Вообще горизон сам по себе шумит сильно, надо обязательно его ещё раз фильтровать
  • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      да, вообще ± 0.5G это большая погрешность измерений
  • 0
    попробую сейсмограф собрать.
    • 0
      это необходимо, если регион сейсмонеустойчивый, а так будешь один шум регистрировать
      • 0
        low pass должен всю возьню срезать в идеале.
        • 0
          +-5 будет погрешность измерений в максимальной чувствительности, у меня программный фильтр стоит при альфе = 0.14, в принципе такая погрешность меня устраивает на максимуме, на минимум чувствительности будет вообще отлично, нотогда надо чтобы тебя хорошо трясло )
  • 0
    А что с нулем за такие пляски, с поправками, а на бок повернуть что будет? (Вопрос в плане — это у вас прям данные уже с вычетом того что он в состоянии покоя показывает -1g по оси z ?)

    Погеморней с ацп… сам взял для экспериментов вначале аналоговый аксель в паре с гиро, потом поменял на цифровой, для новых экспериментов хочу подобное goo.gl/WQgSz
    • 0
      А стоп, ну по скетчу нет, -1g не учитывается
      • 0
        сам аксель уже вычитает что надо, а так я хочу 6DOF аксель, чтобы заниматься проектом под шесть степеней
        • 0
          Как вычитает, а секция Static Acceleration в даташите что тогда имеет в виду?

          6 степеней акселерометра

          имеете в виду acc + gyro
          или acc + магнетометр?

        • 0
          по даташиту сказано в одном из случаев покоя

          XOUT @ 0g = 1.65 V
          YOUT @ 0g = 1.65 V
          ZOUT@ -1g = 0.85 V

          у вас

          X = 355/1024 * 5 = 1.74 V
          Y = 380/1024 * 5 = 1.85 V
          Z = 178/1024 * 5 = 0.87 V
          • 0
            эти значения так и получаются с учетом шума, идеально он не дает значения по даташиту (
            • 0
              ну что идеальны- да, я просто о том что вектор ускорения для z (в отличии от x, у) это не 0 а -1g уже в состоянии покоя. его ноль (когда падать будет) будет где-то в районе 0.87 * 2 = 1.74 ~ 355ед

              ну и потом всякая байда получается считаться будет в относительно правильных единицах

              x = analogRead(A0) — 355;
              y = analogRead(A1) — 380;
              z = analogRead(A2) — 355;


              roll = atan2( sqrt(y*y + x*x), z);
              pitch = atan2( sqrt(x*x + z*z), y);

              нет?
              • 0
                у меня в z минимум = 80, мне кажется на платке резистор великоват (
                • 0
                  да… тогда печально
                  • 0
                    наверное Китаяса что-то намудрил, я сегодня в чистом виде в разными чувствительностями смотрел… все равно так
  • 0
    А какой у вас следующий шаг — платформу поддерживающую уровень медведя не зависимо от наклона основания где сервы стоят делали?
    • 0
      в смысле? Гиростабилицию? Я жду новые сервы чтобы начать заниматься шести-степенной платформочкой
      • 0
        а какой 6DOF моlekm заказали?
        у меня есть 6DOF со спаркфана, но пока не подключал — нужна рассыпуха, чтобы сделать 3.3/5В адаптацию I2C
        • 0
          сейчас тоже со спаркфана заказал датчик, а что там много надо россыпи для подключения?
          • 0
            Вот такой конвертер уровней
            image
            и если 3.3В нет (Nano, Pro) то питание — LD1117 S33TR + пара кондеров
            • 0
              у меня Mega, а я почему то думал, что там не должно быть проблем с подключением
              • 0
                на Mega TTL уровни 5В, а микросхемы гиро и акселей не допускают 5В логику. Нужен конвертер уровней шины в 3.3В. Конвертер должен быть двусторонним
                • 0
                  так, тогда надо будет парочку BSS138 заказать на платане, а то хочется как придет 6DOF поиграться, а на 9DOF я пожмотился, так и не понял, что бы мне дал полезного магнетометр
                  • 0
                    Возможность стабилизировать дрейф квадрокоптера по оси Yaw при висении на месте.
                    • 0
                      Значит если понадоибтся прикручу отдельно, все равно у меня сейчас задача прямая, я сам задаю все движения по осям, и могу посмотреть как будет себя вести датчик или наоборот.
  • 0
    Скажите, а принципиально возможно MMA7361 мерять пройденное расстояние?

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.