2D-гироподвес на Ардуино

2D-гироподвес на основе Ардуино, MPU6050 и SG90

Гироподвес или гиростабилизированный подвес — это устройство стабилизации положения некоторого переносимого объекта относительно положения носителя. Часто гироподвес применяется для стабилизации видео или фотокамеры. Такие подвесы ещё называют стэдикам (steadicam).

Мы соберем свой 2х-осевой стэдикам при помощи Ардуино, акселерометра и гироскопа MPU6050, а также самых простых сервомоторов SG90.

Как работает гироподвес?

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

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

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

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

Примечание №1. А что, глаза разве не участвуют в оценке положения головы? Участвуют. Но если их закрыть, то вы легко справитесь с задачей стабилизации. Исключение составляют сложные задачи, когда одного чувства бывает недостаточно. Например, стойка на одной ноге с закрытыми глазами. Попробуйте. Хотя, и этому можно научиться — мозг очень гибкая штука.

Примечание №2. Почему мы стабилизируемся относительно горизонта? Ведь мы его не видим! Формально, мы стабилизируем голову не вдоль горизонта, а вдоль вектора гравитации. Почитайте как работает акселерометр. Понятие горизонта здесь применяется для удобства восприятия.

Примечание №3. Механический стэдикам?? Для понимания его устройства, можно провести очень простой эксперимент. Попробуйте привязать к обычной гире веревку. Камеру закрепить непосредственно на гире. Второй конец зажмите в руку и поднимите всё этот дело на нужную высоту. Как бы не наклоняли кулак с зажатой веревкой, и как бы не дрожала ваша рука, камера будет снимать достаточно стабильно. Передвигать гирю следует медленно, дабы не превратить всю конструкцию в маятник. Реальный механический стэдикам устроен немного иначе, но физический смысл явления останется тот же.

Всё для этого эксперимента можно приобрести в нашем интернет-магазине:

В корзину
В корзину
В корзину
В корзину

Изменено:

2D-гироподвес на основе Ардуино, MPU6050 и SG90: 19 комментариев

  1. Здравствуйте, постоянно выбивает ошибку expected ‘;’ before numeric constant с выделением строчки define LPF 0.7.
    ЧТо может быть?

    • В коде была опечатка: перед define нужно ставить символ #. Исправлено!

        • Ошибка осталась, предполагаю что может быть ошибка из-за разных библиотек под модуль mpu6050, если можно — напишите мне пожалуйста на почту — oxxyser @ gmail.com для нормальной связи, ибо тут сообщения очень долго проверяются

  2. Добрый день, с Вами как-то связаться можно? ПРоблема чувствую из-за разных библиотек под модуль MPU 6050

    • Похоже на скриншоте у вас не вся ошибка целиком. Скопируйте всё, что выводится в нижнем окошке.

  3. Не подскажете, как решили эту ошибку expected ‘;’ before numeric constant с выделением строчки define LPF 0.7.?

    • в этих строках кода я дописал умножения
      imu_f[0] = imu_f[0]*LPF + imu[0]*(1-LPF);
      imu_f[1] = imu_f[1]*LPF + imu[1]*(1-LPF);
      imu_f[2] = imu_f[2]*LPF + imu[2]*(1-LPF);
      проблема решилось

    • 1) Обязательно пишите текст ошибки. Непонятно же, на что у вас ругается компилятор.
      2) В программе пропали символы произведения, как раз в этом месте. Исправил, попробуете снова скопировать код!

  4. /Users/elenaandreeva/Downloads/SERVO_w_GYRO_2/SERVO_w_GYRO_2.ino: In function ‘void loop()’:
    /Users/elenaandreeva/Downloads/SERVO_w_GYRO_2/SERVO_w_GYRO_2.ino:63:5: error: ‘MadgwickAHRSupdateIMU’ was not declared in this scope
    MadgwickAHRSupdateIMU(tdelta/1000.0, gx, gy, gz, (float)ax, (float)ay, (float)az);
    ^~~~~~~~~~~~~~~~~~~~~
    /Users/elenaandreeva/Downloads/SERVO_w_GYRO_2/SERVO_w_GYRO_2.ino:63:5: note: suggested alternative: ‘MadgwickAHRS_h’
    MadgwickAHRSupdateIMU(tdelta/1000.0, gx, gy, gz, (float)ax, (float)ay, (float)az);
    ^~~~~~~~~~~~~~~~~~~~~
    MadgwickAHRS_h
    /Users/elenaandreeva/Downloads/SERVO_w_GYRO_2/SERVO_w_GYRO_2.ino:64:15: error: ‘q0’ was not declared in this scope
    quat[0] = q0; quat[1] = q1; quat[2] = q2; quat[3] = q3;
    ^~
    /Users/elenaandreeva/Downloads/SERVO_w_GYRO_2/SERVO_w_GYRO_2.ino:64:15: note: suggested alternative: ‘A0’
    quat[0] = q0; quat[1] = q1; quat[2] = q2; quat[3] = q3;
    ^~
    A0
    /Users/elenaandreeva/Downloads/SERVO_w_GYRO_2/SERVO_w_GYRO_2.ino:64:29: error: ‘q1’ was not declared in this scope
    quat[0] = q0; quat[1] = q1; quat[2] = q2; quat[3] = q3;
    ^~
    /Users/elenaandreeva/Downloads/SERVO_w_GYRO_2/SERVO_w_GYRO_2.ino:64:29: note: suggested alternative: ‘A1’
    quat[0] = q0; quat[1] = q1; quat[2] = q2; quat[3] = q3;
    ^~
    A1
    /Users/elenaandreeva/Downloads/SERVO_w_GYRO_2/SERVO_w_GYRO_2.ino:64:43: error: ‘q2’ was not declared in this scope
    quat[0] = q0; quat[1] = q1; quat[2] = q2; quat[3] = q3;
    ^~
    /Users/elenaandreeva/Downloads/SERVO_w_GYRO_2/SERVO_w_GYRO_2.ino:64:43: note: suggested alternative: ‘A2’
    quat[0] = q0; quat[1] = q1; quat[2] = q2; quat[3] = q3;
    ^~
    A2
    /Users/elenaandreeva/Downloads/SERVO_w_GYRO_2/SERVO_w_GYRO_2.ino:64:57: error: ‘q3’ was not declared in this scope
    quat[0] = q0; quat[1] = q1; quat[2] = q2; quat[3] = q3;
    ^~
    /Users/elenaandreeva/Downloads/SERVO_w_GYRO_2/SERVO_w_GYRO_2.ino:64:57: note: suggested alternative: ‘A3’
    quat[0] = q0; quat[1] = q1; quat[2] = q2; quat[3] = q3;
    ^~
    A3
    /Users/elenaandreeva/Downloads/SERVO_w_GYRO_2/SERVO_w_GYRO_2.ino:66:5: error: ‘quat2Euler’ was not declared in this scope
    quat2Euler(&quat[0], &imu[0]);
    ^~~~~~~~~~
    Несколько библиотек найдено для «Servo.h»
    Используется: /Users/elenaandreeva/Documents/Arduino/libraries/Servo
    Не используется: /Users/elenaandreeva/Library/Arduino15/libraries/Servo
    exit status 1

    Compilation error: ‘MadgwickAHRSupdateIMU’ was not declared in this scope
    кое что я исправил сам а это осталось

  5. Да была проблема в библиотеке в самой программе ардуино скачал через интернет прошивка заработала. Но почему-то пишет ошибку по гироскопу в мониторинге порта(невидит гироскоп) Все подключено верно менял по разному и A5 A4 skl sda.

    • Лучше загрузить на контроллера программу — сканер I2C (она есть в штатных примерах в Arduino IDE) и добиться чтобы сканер находил гироскоп в принципе. А потом уже двигаться дальше.
      Может гироскоп неисправный, или у вас подтяжки нет на линии I2C.

  6. Подтяжка по I2c есть и гироскоп рабочий я проверял просто это программа и схема будет использоваться не в стабилизаторе. Я просто еще не работал с гироскопом и для него программу не писал ,в интернете не по тем осям :(. (нужно по осям Z X)
    Можете написать на почту а то здесь долгая проверка amakss378@gmail.com

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.