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 и запускать такой тест непосредственно на полётном контроллере, а на луч всего лишь вешать оптодатчик и акселерометр.