Motor Vibrometer - балансируем моторы с помощью полетного контроллера

SideWinder

Добрый день. Выкладываю на всеобщее обозрение свой проект по динамической балансировке моторов коптера.
Ссылка на Github

Существует множество способов балансировки. Но хотелось создать чтото, что позволяет увидеть разбаланс в простых цифрах которые можно сравнить.
Проект создан под контроллер MuktiWii Micro, но подойдет любой на Atmega328 и чипом MPU6050. Проект можно залить в любой совместимый полетник установленный на коптер, но т.к. контроллер обычно демпфирован от вибраций, репрезентативность измерений упадет. Советую крепить плату с сенсорами прямо на луч.
Порядок работы:

  1. Открываем скетч в Arduino

  2. Прошиваем в плату

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

  4. Подключаем ESC к 9-му пину на плате

  5. Подаем питание на ESC

  6. Подключаем плату к компу, запускаем на нем Arduino Port Monitor и коннектимся к COM порту платы

  7. Проверяем что кабели не попадут под пропеллер

  8. В порт мониторе посылаем любой символ в плату для начала калибровок
    Видим чтото типа:

    Initializing I2C devices...
    Testing device connections...
    MPU6050 connection successful
    
    Calibrating.............
    Calibrations:
    -1251   -1109   1132    10  23  -11
    
    Send motor PWM number or .(dot) to start measurement:
    
  9. Посылаем в плату число от 1000 до 2000 соответственно таймингу ESC, или же можно посталь символ .(точка) что будет соответствовать значению 1200. Я выбрал его как самое удобное. При большем значении будте готовы что коптер попытается улететь на одном моторе. Так что держите его. Лучших результатов я добился ставя коптер на стол и оставляя балансируемый луч за краем стола, чтобы потоки воздуха от пропа не создавали дополнительных вибраций.

  10. Плата раскрутит мотор на 5-6сек и выдаст результат теста:

    Starting motor at: 1200
    Spin up...
    Measuring 5 seconds...
    ...........
        ax  ay  az  gx  gy  gz
    Max:    228 264 424 52  50  46
    Avg:    58  106 101 11  11  10
    Measurements count: 2275
    
  11. Я использовал следующую последовательность при калибровке:

    1. Измеряем просто мотор с пропеллером
    2. Вешаем стяжку на мотор и меряем с ней
    3. Поворачиваем стяжку на треть оборота и еще раз меряем
    4. Поворачиваем стяжку еще на треть и меряем еще раз
    5. По результатам 4 измерений смотрим где у нас минимальные вибрации
    6. Проверяем/подгоняемм лучшую позицию стяжки
    7. Запоминаем положение замка и убираем стяжку
    8. Клеим кусок металлического скотча на это место
    9. Измеряем
    10. Повторяем 8-9 до тех пор пока вибрация уменьшается
    11. Имеем сбалансированный мотор на луче
5yoda5

Это всё классно. Вот изобрел бы кто-нибудь способ балансировки, при котором видно было бы место установки груза, наподобие как в шиномонтажке…

SideWinder

Ну по сути мы это и получаем. Поворачивая замок стяжки находим место куда вешать грузики.
В шиномонтажке стенд увешан датчиками угла поворота и ускорений. Тут слишком накладно такое )

5yoda5

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

rx9abc
SideWinder:

слишком накладно такое

Чего тут накладного?
Берешь вот такой фото резистор, подключаешь его к атмеге. Маркером на двигателе рисуешь риску. Размещаешь резистор перед риской. PROFIT! Путем несложного программирования вычисляешь место, относительно риски, куда требуется повесить грузик.

SideWinder
rx9abc:

Чего тут накладного?
Берешь вот такой фото резистор, подключаешь его к атмеге. Маркером на двигателе рисуешь риску. Размещаешь резистор перед риской. PROFIT! Путем несложного программирования вычисляешь место, относительно риски, куда требуется повесить грузик.

Ок. Спасибо за идею. Такое вполне можно реализовать

SideWinder
Nesenin:

Не хотелось бы стенд воротить. К тому же по ссылке плата только снимает показания, а обработкой данных занимается PC.
Даже идея с фоторезистором вызывает сомнения в плане реализации.
Быстрее провести три измерения со стяжкой на моторое, чем подвесить на луч датчик (еще не всегда нормально подберешься к мотору, а вешать надо близко), нарисовать на моторе линию так чтобы она была видна (тут что делать с черными моторами, или надписями на них тоже непонятно). Вобщем от реализации этого только лишние действия появляются.

rx9abc

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

Кстати! А пусть нам ответят специалисты: можно ли как нибудь привязаться к угловому положению двигателя, без всяких датчиков? Ведь регулятор знает на какую обмотку надо подать напряжение. И вообще, существует понятие синхронизации.

Nesenin
rx9abc:

Кстати! А пусть нам ответят специалисты: можно ли как нибудь привязаться к угловому положению двигателя, без всяких датчиков? Ведь регулятор знает на какую обмотку надо подать напряжение. И вообще, существует понятие синхронизации.

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

я считаю годится лучше всего оптический метод. и чтоб не мудрить можно использовать готовые оптические системы например dx.com/…/lm393-comparator-speed-sensor-module-for-…
тут есть выход с компаратора который либо 0в либо 5в, что нам и надо для четкой фиксации начала координат(ну и заодно можно обороты мерить). на свободный вал можно крепить заведомо сбалансированный прозрачный диск и сделать 1 непрозрачный участок.
PS я собственно и собирался делать систему работающую с ПК, где будет аналогичный график и данные чего куда лепить. на arduino и MPU6050.

SideWinder
rx9abc:

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

Кстати! А пусть нам ответят специалисты: можно ли как нибудь привязаться к угловому положению двигателя, без всяких датчиков? Ведь регулятор знает на какую обмотку надо подать напряжение. И вообще, существует понятие синхронизации.

Соглашусь что выше, но я ставил себе задачу сделать это на собраном коптере. Т.е. с минимальными изменениями в готовом устройстве. Изначально думал вообще в полетник на самом коптере залить.
Угловое положение из регулятора просто так не достанешь. Если только его прошивку менять.

Nesenin:

PS я собственно и собирался делать систему работающую с ПК, где будет аналогичный график и данные чего куда лепить. на arduino и MPU6050.

диск с прорезью не пойдет. он искажения будет вносить в пару проп/мотор.
надо попробовать с фоторезистором. уже заказал.

Nesenin
SideWinder:

диск с прорезью не пойдет.

я про прорезь ничего не писал. прозрачный диск с нарисованной маркером черточкой пойдет.

ну и вариант с отражением от корпуса двигателя то же можно попробовать с использованием этой штуки dx.com/…/lm393-comparator-speed-sensor-module-for-….
фоторезистор как вы прикручивать надумали? делитель делать и напряжение мерять? не лучше ли дискретный сигнал заводить и прерывание организовывать?

AlexeyStn

Идея хорошая и нужная. Конечно, надо делать с учётом положения, а не с усреднёнными данными.
В даташите MPU6050 пишут, что максимальная частота выдачи данных - 1 кГц, а внутри стоит ФНЧ с максимальной частотой 260 Гц.
Это значит, что какую-то более-менее правдоподобную картинку с распределением можно получить лишь на значительно меньших оборотах.
C какой частотой вращаются пропы у коптера? Скажем, 10-е винты на моторе 1000kv?

SideWinder
AlexeyStn:

C какой частотой вращаются пропы у коптера? Скажем, 10-е винты на моторе 1000kv?

В описаных мной режимах будет около 2-2,5 тысяч оборотов в минуту. Разумеется зависит от батареи и регулятора.

8 days later
AlexeyStn

Провёл сегодня эксперимент с оптическим датчиком.

На внешней зеркальной поверхности мотора нарисовал чёрным маркером вертикальную полоску шириной 5мм. Наклейку с мотора снял. Датчик находится в 7 мм от поверхности ротора.

В результате момент прохождения ротора через ноль чётко фиксируется на любых оборотах, вплоть до максимальных (у меня на 1400kv, 3S и с 8x4.5 пропом это 200 об/c).

Значит, измерять вибрацию в привязке к положению двигателя вполне реально.

Теперь надо подключить MPU-6050, захватить с него данные и попытаться их синхронизировать с оптодатчиком.

Lexa_Doc

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

AlexeyStn

Cобрал стенд для снятия вибраций, имитирующий луч коптера. На луче стоит MPU6050, рядом с мотором оптодатчик, обрабатывает всё STM32F3 Discovery.

У акселерометра предельная частота сэмплирования 1 кГц, поэтому чтоб собирать достаточно точек на период, пришлось вращать пропеллер на малых оборотах.

С датчика снималось ускорение по оси X - перпендикулярной лучу горизонтальной оси.

Красный график - для нового целого пропеллера APC, синий график - для такого же пропеллера с отломанным на 3мм концом. На нижнем графике синхронизированные данные с оптического датчика.

Синусоиды чётко прорисовываются. Можно попытаться уменьшить шумы, усреднив данные за несколько периодов.

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

Теперь вопрос в том, как точно связать фазу синуса с положением дисбаланса.

Если из всего этого выйдет что-то толковое, то можно будет портировать с STM32 на Arduino и запускать такой тест непосредственно на полётном контроллере, а на луч всего лишь вешать оптодатчик и акселерометр.

Nesenin

те же яйца но с запуском на arduino

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

то есть это все дело, в зависимости от крепления, от оборотов, от дисбаланса вибрирует так, что никакой синусоиды на показаниях акселерометра не прослеживается.
я пока вижу способ решения в подборе опоры . в оригинальной статье там пружины были habrahabr.ru/post/207478/ надо че то придумать\подобрать.
ЗЫ обороты минимальные в районе 900об\мин

Nesenin

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

попробовал крепление на 4 пружинах. жутко геморройная конструкция.

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

решил погуглить как оно собственно делается по науке. нашел тут www.cardanbalans.ru/balans.htm
качающуюся раму.
сделал

результат порадовал. система так и норовит войти вынужденные колебания с частотой мотора. невооруженным глазом видно (на малых оборотах) как раскачивается стенд вверх\вниз. кроме того есть возможность пружину менять и придумать механизм оперативного изменения ее жесткости\хода.

а еще надо попробовать сделать датчики

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

вспомнил что есть у меня фотик снимающий до 1000fps
снял на 240fps

youtu.be/P0WwIpTlyAA

частота вращения около 830rpm

PS. это достаточно хорошо сбалансированные мотор винт. качается все равно - значит точность высока.

Nesenin

хм. человек вон не заморачивался так в тисках и оставил луч с мотором только обернул мягкой пеной

youtu.be/fS5n3Qoue1c

продает наборчик 155$ www.dynexhobby.com
шлет данные в звуковую карту (линия микрофона). на компе прога на LabView писаная. собсно я в ней и делаю свою. все приколюхи из библиотеки можно надергать. что еще?
тема о балансировке www.rcgroups.com/forums/showthread.php?t=1769171 есть инфа о конструкциях стендов.

импеллер крепят по схеме крайней справа во втором ряду.
а вот человек из каши извлекает полезную инфу

youtu.be/eWWOqcSu8IY

крепление на демпферах. нда…
а еще он использует акселерометр ADXL345 пишет

the GY-521 which I understand is a MPU6050 looks a bit slow, it can sample only at 1khz for the accelerometer. The ADXL does it at 3.2 khz. Besides, the MPU6050 only has a I2C interface. For speed we need SPI and my program is made for that…

и о чудо у мну есть в запасе он (в составе GY-80).
diydrones.com/…/balancing-propellors-and-motors?co…
ну и в этом же сообщение ссылка на исходники включая код под arduino
ну круть! теперь можно что хош сделать.

2 months later
Sir_Alex

Класс, приятно смотреть что виброметр кто то реализовал из наших )))

У меня когда то была подобная идея, но руки так и не дошли до реализации. Кстати, как развитие идеи: Ставим на каждый луч, по акселерометру и сводим их на один мозг, дальше мозг анализирует вибрации на каждом луче и лампочками сигнализирует, если на каком то из лучей вибрации превышают порог. Ну типа, для квадрика - четыре светодиода (красный/зеленый), если все зеленые - можно летать, если какой нибудь красны - бяда )))

djdron
Sir_Alex:

Ставим на каждый луч, по акселерометру и сводим их на один мозг, дальше мозг анализирует вибрации на каждом луче и лампочками сигнализирует, если на каком то из лучей вибрации превышают порог. Ну типа, для квадрика - четыре светодиода (красный/зеленый),

была мысль поставить аксель в регулятор, круглый регуль под мотором и в нем все анализировать, пока делаю “квадратный” и так времени не хватает, руки дойдут сделаю)))

Nesenin

Хочу обратить внимание на необходимость именно “правильной” опоры для снятия показаний. Лучшие результаты из всего что я пробовал (а я пробовал много), получаются на качающаяся платформе. Она позволяет использовать резонанс для нахождения самого минимального дисбаланса.

youtu.be/sr50UQkcUMo

пружиной оперативно меняется частота колебаний системы. Обороты выставляются на эту частоту получаем резонанс. В итоге на показаниях отличный сигнал для работы.
см. отбалансированный мотор

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

youtu.be/cB8dtCDwkLI

Дисбаланс ужасный. Синусоида четкая, большая амплитуда.
А вот после работы (на той же частоте - резонансной).

youtu.be/6_ZJeKB5drw

Идеально! Я даже отдельно снял прогон полного диапазона оборотов.

youtu.be/JzeOvuKmOaw

Обратите внимание на провода - не колышутся. Даже старт\стоп не влияет.