Два акселерометра, губка для посуды и четыре гайки


Итак, разобравшись с датчиками Холла для бесколлекторных двигателей, покажу для чего это было нужно. Я сделал стенд с простейшим обратным маятником, который стабилизируется при помощи маховика, вращаемого моторчиком на свободном конце маятника:


Я учусь теории управления и построил таких игрушек некоторое количество, вот, например, мой обратный маятник на тележке:

Разбор управления подобными штуками оставим на следующую статью, а темой сегодняшней статьи является измерение угла маятника. Самый простой вариант — это поставить инкрементальный энкодер, это я уже подробно разобрал.

Но в данной статье я хочу измерять положение маятника при помощи акселерометров, к нему прикрепленных. Пользоваться я буду самыми копеечными adxl345. Итак, если мы прицепим акселерометр на маятник на расстоянии r от шарнира, как определить угол? Я прицепил акселерометр так, чтобы ось Y была вдоль маятника, а ось X была бы маятнику ортогональна:

28d8ccdf5b14198bd875750140cfd77b.png

Давайте предположим для начала, что маятник не движется. Тогда акселерометр будет выдавать проекцию вектора силы тяжести на свои оси. Поскольку всё происходит в одной плоскости, то в идеале по оси Z акселерометр будет выдавать нулевые значения. То есть, измерение акселерометра будет выглядеть как (x, y, z) = (g cos θ, -g sin θ, 0). Ну, а угол можно получить при помощи арктангенса от y/x.

Если же акселерометр начинает двигаться, то всё становится чуточку сложнее: помимо ускорения свободного падения он будет ещё измерять угловое ускорение маятника и соответствующее центростремительное ускорение, они показаны красными стрелочками на схеме.

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

Итак, если я возьму простейший арктангенс по измерениям акселерометра, то получу следующую вещь:

3b991cd7f049d08833d42a652eeaa654.png

В этой картинке я у меня качается маятник, изменение его настоящего угла во времени — это красная кривая, а синяя кривая — арктангенс от y/x, они же измерения акселерометра. Хорошо видно, что кривые не очень совпадают.

А теперь давайте добавим второй акселерометр, на сей раз на расстоянии r/2 от центра. Два акселерометра будут нам давать измерения (xa, ya) и (xb, yb), которые, в идеальном случае должны зависеть следующим образом от угла θ и от угловой скорости/ускорения:

9e81eb0d737c589928813d5079c396fe.png

В принципе, всё двоольно прозаично, но зачем я так сделал? А теперь магия, следите за руками! Давайте посчитаем, чему будет равняться (xa, ya) — 2*(xb, yb):

8ec19293424627fa811f921fe61a6a3e.png

Вся динамика самого маятника ушла, осталась только проекция вектора ускорения свободного падения! То есть, при помощи двух акселерометров мы можем оценивать угол маятника, не оглядываясь на его динамику:

0438044a1acb8c077d4ede833f8e06e7.png

А вот так выглядит оценка в реальном времени:

7cde0ba9036da879242be2b98a262e4e.png

Здесь синяя и зелёная кривая — это «сырые» данные с акселерометров, а чёрная кривая — это посчитанный угол. Он весьма недурно совпадает с эталонной кривой, полученной с энкодера. Я не занимался юстировкой датчиков, всё прикручено «на глаз», откуда небольшие расхождения между данными с акселерометров и с энкодера.

На этом историю можно было бы закончить, но я обещал губку для посуды (и четыре гайки!), где же они? Сейчас будут. Этот график был получен совсем не с первого подхода. Давайте теперь начнём с самого начала.

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

082039ae9835a4f94924e33a768faaa3.png

Это тот же самый график, что и предыдущий, но добавил ещё одну розовую кривую, которая даёт задание тока в моторчике, который, в свою очередь, и качает наш маховик. Выясняется, что когда моторчик работает, то акселерометры выдают полный бред. Но как только моторчик выключается, всё магически возвращается к норме… Почему?

Сначала я грешил на электронаводки, но оказалось, что виновником являются высокочастотные вибрации при работе бесколлекторного движка. Тогда решил делать виброразвязку. Никогда ничем подобным не занимался, под рукой был только соплемёт. Вот так выглядела моя первая виброразвязка.

0b50aa87fd9abc3d8f730ea65224407c.jpg

Гайки служат в качестве инерционного гасителя колебаний. Первый тест, и ситуация улучшилась кардинально! Я возрадовался и сколхозил вторую версию, где гайки были заменены на стальную пластинку:

2bf5336a7e077bff1b3efbb4c59211d2.jpg

Вот так выглядят графики:

e39c3b0ae31b764d03f5c9e90e6033f8.png

В принципе, на этом можно было бы успокоиться, но мне казалась перебором большая толщина губки, которая вводила изрядное запаздывание при быстрых движениях маятника. Поэтому я попробовал с другой кухонной губкой:

c4e5db9021707614c2bcd6c9c23bc6d0.jpg

Вот её графики, отличия видны в районе восьмой-десятой секунды на синем графике, который должен быть более-менее треугольным.

605bd5bf56cbc81a3f1ba26ceb03b22b.png

На этом я было успокоился, но оказалось, что я взял новую губку, которая через пару дней высохла так, что стала недостаточно эластичной. Можно было бы попробовать капнуть глицерина, но это не наш метод! Поэтому заменил кухонную губку на антистатик-поролон:

38cd817c1f3bb4f2ab951366f48bf980.jpg

Вот соответствующие графики:

fc09031ad3b07177cf2bcd2f1cfd5267.png

И тут меня посетила мысль:, а зачем я вообще парюсь с массой, нельзя ли платку акселя непосредственно на поролон приклеить? Попробовал следующую конфигурацию:

3b5d498a2af60a9d352505a8449949c9.jpg

Ответ: нет, нельзя!

4dfccc97511df2c88151a7e8089f9aaf.png

В общем всё, что вы хотели знать об НЧ-фильтрах, но боялись спросить. Вывод: виброразвязка это хорошо, но надо грамотно подбирать частоту отсечки. Если кто-нибудь сможет преложить менее экспериментальный способ подбора материалов, их толщины и соответствующих грузов, буду очень благодарен!

© Habrahabr.ru