В этом уроке мы узнаем как на основе платы Arduino сконструировать самостабилизирующуюся платформу с серводвигателями. Основой данного проекта является гироскоп MPU6050, работу с которым мы рассматривали в этой статье. Применения для этой самостабилизирующейся платформы могут быть самые разнообразные - если вы решили прочитать данную статью, наверняка вы про них знаете.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- Серводвигатель MG996R (3 шт.) (купить на AliExpress).
- Модуль акселерометра и гироскопа MPU6050 (купить на AliExpress).
- Понижающий преобразователь постоянного тока в постоянный (Buck Converter).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Обзор проекта
Я спроектировал самостабилизирующуюся платформу с помощью программного обеспечения для 3D-моделирования. Она будет включать в себя 3 серводвигателя MG996R для 3-осевого управления и основания, на котором будут размещены датчик MPU6050, плата Arduino и аккумулятор.
Вы можете найти и скачать эту 3D-модель, а также изучить ее в своем браузере на сайте Thangs.
Скачать STL-файлы для самостабилизирующейся платформы
Используя свой 3D-принтер Creality CR-10 я напечатал на нем все детали проекта и они получились просто идеальными.
Сборка платформы
Собрать самостабилизирующуюся платформу оказалось довольно легко. Я начал с установки сервопривода рыскания. Используя болты и гайки М3, я прикрепил его к основанию.
Затем, используя тот же метод, я закрепил сервопривод крена (Roll). Детали специально разработаны для легкой установки на сервоприводы MG996R.
Для соединения деталей друг с другом я использовал круглые рожки, которые идут в комплекте с сервоприводами.
Сначала нам нужно закрепить круглый рог к основанию двумя болтами, а затем прикрепить его к предыдущему сервоприводу с помощью другого болта.
Я повторил этот процесс для сборки остальных компонентов, сервопривода тангажа (Pitch) и верхней платформы.
Затем я пропустил провода сервопривода через отверстия держателей, чтобы держать их в порядке. Затем я вставил датчик MPU6050 и закрепил его на основании болтом и гайкой.
Для питания проекта я использовал 2 литий-ионные батареи, которые поместил в этот держатель. Я прикрепил держатель батареи к основанию с помощью двух болтов и гаек.
Две литий-ионные батареи будут производить около 7,4 В, но нам нужно 5 В для питания Arduino и сервоприводов.
Вот почему я использовал понижающий преобразователь, который преобразует 7,4 В в 5 В.
Схема проекта
Теперь осталось соединить все вместе. На следующем рисунке показана принципиальная схема нашего проекта и то, как все нужно подключить.
Для завершения сборки платформы я втиснул компоненты электроники и провода в основание и закрыл их этой крышкой внизу.
На этом самобалансирующаяся платформа (или подвес) на основе платы Arduino готовы и работают хорошо, как и ожидалось. Осталось посмотреть программу.
Исходный код программы для Arduino
Код Arduino для нашего проекта — это модификация примера MPU6050_DMP6 из библиотеки i2cdevlib Джеффа Роуберга.
Здесь вы можете скачать код: код программы для самостабилизирующейся платформы.
Описание кода: итак, в программе мы будем использовать считываемые выходные данные по рысканию, тангажу и крену.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
// Get Yaw, Pitch and Roll values #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); // Yaw, Pitch, Roll values - Radians to degrees ypr[0] = ypr[0] * 180 / M_PI; ypr[1] = ypr[1] * 180 / M_PI; ypr[2] = ypr[2] * 180 / M_PI; // Skip 300 readings (self-calibration process) if (j <= 300) { correct = ypr[0]; // Yaw starts at random value, so we capture last value after 300 readings j++; } // After 300 readings else { ypr[0] = ypr[0] - correct; // Set the Yaw to 0 deg - subtract the last random Yaw value from the currrent value to make the Yaw 0 degrees // Map the values of the MPU6050 sensor from -90 to 90 to values suatable for the servo control from 0 to 180 int servo0Value = map(ypr[0], -90, 90, 0, 180); int servo1Value = map(ypr[1], -90, 90, 0, 180); int servo2Value = map(ypr[2], -90, 90, 180, 0); // Control the servos according to the MPU6050 orientation servo0.write(servo0Value); servo1.write(servo1Value); servo2.write(servo2Value); } #endif |
Получив эти значения, сначала преобразуем их из радиан в градусы.
1 2 3 4 |
// Yaw, Pitch, Roll values - Radians to degrees ypr[0] = ypr[0] * 180 / M_PI; ypr[1] = ypr[1] * 180 / M_PI; ypr[2] = ypr[2] * 180 / M_PI; |
Дальше ждем или делаем 300 показаний, т. к. датчик все это время еще находится в процессе самокалибровки. Кроме того, мы фиксируем значение отклонения от курса, которое вначале не равно 0, как значения Pitch и Roll, а всегда является каким-то случайным значением.
1 2 3 4 5 |
// Skip 300 readings (self-calibration process) if (j <= 300) { correct = ypr[0]; // Yaw starts at random value, so we capture last value after 300 readings j++; } |
После 300 показаний сначала мы устанавливаем рысканье на 0, вычитая полученное выше случайное значение. Затем мы сопоставляем значения рыскания, тангажа и крена от – 90 до +90 градусов со значениями от 0 до 180, которые используются для управления сервоприводами.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
// After 300 readings else { ypr[0] = ypr[0] - correct; // Set the Yaw to 0 deg - subtract the last random Yaw value from the currrent value to make the Yaw 0 degrees // Map the values of the MPU6050 sensor from -90 to 90 to values suatable for the servo control from 0 to 180 int servo0Value = map(ypr[0], -90, 90, 0, 180); int servo1Value = map(ypr[1], -90, 90, 0, 180); int servo2Value = map(ypr[2], -90, 90, 180, 0); // Control the servos according to the MPU6050 orientation servo0.write(servo0Value); servo1.write(servo1Value); servo2.write(servo2Value); } |
Наконец, используя функцию записи, мы отправляем эти значения сервоприводам в качестве управляющих сигналов. Конечно, вы можете отключить сервопривод отклонения от курса, если хотите просто стабилизировать оси X и Y, и использовать эту платформу в качестве подвеса камеры.
Обратите внимание: это далеко не лучший стабилизатор камеры. Движения не плавные, потому что эти сервоприводы не предназначены для такой цели. В настоящих подвесах камеры используются двигатели BLDC специального типа, обеспечивающие плавность движений.