Оглавление:

Подвес управления движением: 12 шагов
Подвес управления движением: 12 шагов

Видео: Подвес управления движением: 12 шагов

Видео: Подвес управления движением: 12 шагов
Видео: Студенты российского вуза разработали вечный двигатель #вечныйдвигатель #изобретения 2024, Ноябрь
Anonim
Image
Image

Всем привет! Меня зовут Харджи Наги. В настоящее время я учусь на втором курсе, изучаю электронику и технику связи в Технологическом институте Пранвира Сингха, Канпур (UP). Я очень интересуюсь робототехникой, Arduino, искусственным интеллектом и аналоговой электроникой.

Слово «подвес» определяется как поворотная опора, которая позволяет вращать любой объект по одной оси. Таким образом, трехосный подвес позволяет любому объекту, установленному на подвесе, быть независимым от движения того, на котором он держится. Подвес диктует движение объекта, а не того, кто его несет.

Он состоит из 3 серводвигателей MG996R для 3-осевого управления и основания, на котором будут размещены датчик MPU6050, Arduino и аккумулятор. Он используется для стабилизации камеры без вибрации. Трехосевой стабилизатор обеспечивает стабилизацию движения камеры, даже если удерживающий ее движется вверх и вниз, влево и вправо, вперед и назад. Это то, что мы называем стабилизацией по рысканию, тангажу и крену.

Шаг 1: Список компонентов

Список компонентов:

1) Arduino Uno

2) Батарея 8 В, 1,5 А для питания Arduino Uno

3) 7805 регулятор напряжения Ic или вы можете использовать понижающий преобразователь

4) MPU 6050

5) 3 * (серводвигатели MG995)

6) Провода перемычки

Другое оборудование:

1) Паяльник

2) клеевой пистолет

3) Сверлильный станок

4) Еда может

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

Шаг 2: Сборка

Сборка
Сборка
Сборка
Сборка

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

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

Шаг 3:

Изображение
Изображение

Собрать подвес оказалось довольно легко. Я начал с установки сервопривода рыскания, датчика MPU 6050 и выключателя. Болтами и гайками прикрепил его к основанию.

Шаг 4: Затем, используя тот же метод, я закрепил сервопривод ролика. Детали специально разработаны для легкой установки сервоприводов MG995

Затем, используя тот же метод, я закрепил сервопривод ролика. Детали специально разработаны для легкой установки сервоприводов MG995
Затем, используя тот же метод, я закрепил сервопривод ролика. Детали специально разработаны для легкой установки сервоприводов MG995

Шаг 5: Затем, используя тот же метод, я закрепил сервопривод ролика. Детали специально разработаны для легкой установки сервоприводов MG995

Затем, используя тот же метод, я закрепил сервопривод ролика. Детали специально разработаны для легкой установки сервоприводов MG995
Затем, используя тот же метод, я закрепил сервопривод ролика. Детали специально разработаны для легкой установки сервоприводов MG995

Шаг 6: Подключения

Подключения
Подключения

На принципиальной схеме вы можете использовать понижающий преобразователь или микросхему стабилизатора напряжения 7805 для преобразования 8 В в 5 В. Микроконтроллер, представленный на принципиальной схеме, - это Arduino Nano, вы также можете использовать Arduino Uno, Arduino Mega.

Контакты SCL и SDA MPU 6050 подключены к аналоговым контактам A5 и A4 Arduino (контакты SCL и SDA могут отличаться, поэтому ознакомьтесь с таблицей данных для контактов SCl и SDA для другого микроконтроллера).

Шаг 7: Подключение к микросхеме стабилизатора напряжения 7805

Подключение к микросхеме регулятора напряжения 7805
Подключение к микросхеме регулятора напряжения 7805

Эта принципиальная схема предназначена для подключения микросхемы регулятора напряжения 7805, подключите батарею 8 В к Vin, и вы получите выходное напряжение 5 В.

Шаг 8: кодирование

Вы должны включить следующие библиотеки:

1) #includeНажмите здесь, чтобы загрузить zip-файл

2) #includeНажмите здесь, чтобы загрузить zip-файл.

После загрузки zip-файла добавьте zip-библиотеку в эскиз Arduino.

Для кода

/*

DIY Gimbal - Учебный код MPU6050 Arduino на основе примера MPU6050_DMP6 из библиотеки i2cdevlib Джеффа Роуберга: https://github.com/jrowberg/i2cdevlib * / // I2Cdev и MPU6050 должны быть установлены как библиотеки, иначе.cpp /.h файлы // для обоих классов должны быть в пути включения вашего проекта #include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" // # include "MPU6050.h" // не требуется при использовании файла включения MotionApps / / Библиотека Arduino Wire требуется, если реализация I2Cdev I2CDEV_ARDUINO_WIRE // используется в I2Cdev.h #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #include "Wire.h" #endif #include // Адреса I2C по умолчанию для класса могут быть 0x68 // конкретный I2C-адрес здесь передается как параметр // AD0 low = 0x68 (по умолчанию для SparkFun Breakout и оценочной платы InvenSense) // AD0 high = 0x69 MPU6050 mpu; // MPU6050 mpu (0x69); // <- использовать для AD0 high // Определить 3 серводвигателя Servo servo0; Серво servo1; Серво servo2; плавать правильно; int j = 0; #define OUTPUT_READABLE_YAWPITCHROLL #define INTERRUPT_PIN 2 // использовать контакт 2 на Arduino Uno и большинстве плат bool blinkState = false; // переменные управления / состояния MPU bool dmpReady = false; // устанавливаем истину, если инициализация DMP прошла успешно uint8_t mpuIntStatus; // содержит текущий байт состояния прерывания из MPU uint8_t devStatus; // возвращаем статус после каждой операции с устройством (0 = успех,! 0 = ошибка) uint16_t packetSize; // ожидаемый размер пакета DMP (по умолчанию 42 байта) uint16_t fifoCount; // подсчет всех байтов, находящихся в данный момент в FIFO uint8_t fifoBuffer [64]; // буфер хранения FIFO // переменные ориентации / движения Quaternion q; // [w, x, y, z] контейнер кватернионов VectorInt16 aa; // [x, y, z] измерения датчика ускорения VectorInt16 aaReal; // [x, y, z] измерения датчика ускорения без гравитации VectorInt16 aaWorld; // [x, y, z] Измерения датчика ускорения в мировой рамке VectorFloat gravity; // [x, y, z] вектор гравитации float euler [3]; // [psi, theta, phi] Контейнер угла Эйлера float ypr [3]; // [yaw, pitch, roll] yaw / pitch / roll контейнер и вектор силы тяжести // структура пакета для демонстрации чайника InvenSense uint8_t teapotPacket [14] = {'$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\ r', '\ n'}; // ================================================ ================ // === ПОРЯДОК ОБНАРУЖЕНИЯ ПЕРЕРЫВОВ === // ===================== =========================================== volatile bool mpuInterrupt = false; // указывает, перешел ли вывод прерывания MPU на высокий уровень void dmpDataReady () {mpuInterrupt = true; } // =============================================== ================= // === НАЧАЛЬНАЯ НАСТРОЙКА === // ===================== =========================================== void setup () {// подключиться к шине I2C (библиотека I2Cdev не делает этого автоматически) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin (); Wire.setClock (400000); // Тактовая частота I2C 400 кГц. Прокомментируйте эту строку, если возникают трудности с компиляцией #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire:: setup (400, true); #endif // инициализировать последовательную связь // (выбрано 115200, потому что это требуется для вывода демо-версии Teapot, но // это действительно ваше дело в зависимости от вашего проекта) Serial.begin (38400); в то время как (! серийный); // ждем перечисления Леонардо, остальные сразу же продолжат // инициализировать устройство //Serial.println(F("Initializing I2C devices… ")); mpu.initialize (); pinMode (INTERRUPT_PIN, INPUT); devStatus = mpu.dmpInitialize (); // укажите здесь свои собственные смещения гироскопа, масштабированные для минимальной чувствительности mpu.setXGyroOffset (17); mpu.setYGyroOffset (-69); mpu.setZGyroOffset (27); mpu.setZAccelOffset (1551); // Заводская установка по умолчанию 1688 для моего тестового чипа // Убедитесь, что он работает (возвращает 0, если да) if (devStatus == 0) {// включите DMP, теперь, когда он готов // Serial.println (F ("Включение ДМП… »)); mpu.setDMPEnabled (правда); attachInterrupt (digitalPinToInterrupt (INTERRUPT_PIN), dmpDataReady, RISING); mpuIntStatus = mpu.getIntStatus (); // устанавливаем наш флаг готовности DMP, чтобы функция main loop () знала, что его можно использовать //Serial.println(F("DMP ready! Ожидание первого прерывания… ")); dmpReady = true; // получить ожидаемый размер пакета DMP для последующего сравнения packetSize = mpu.dmpGetFIFOPacketSize (); } else {// ОШИБКА! // 1 = начальная загрузка памяти не удалась // 2 = не удалось обновить конфигурацию DMP // (если она выйдет из строя, обычно код будет 1) // Serial.print (F («Ошибка инициализации DMP (код»)); //Serial.print(devStatus); //Serial.println (F (")")); } // Определяем контакты, к которым подключены 3 серводвигателя servo0.attach (10); servo1.attach (9); servo2.attach (8); } // =============================================== ================= // === ОСНОВНОЙ ЦИКЛ ПРОГРАММЫ === // ==================== ============================================ void loop () {/ / если программирование не удалось, не пытайтесь ничего делать, если (! dmpReady) вернется; // ждем прерывания MPU или доступных дополнительных пакетов while (! mpuInterrupt && fifoCount <packetSize) {if (mpuInterrupt && fifoCount

= 1024) {

// сбрасываем, чтобы мы могли продолжить чисто mpu.resetFIFO (); fifoCount = mpu.getFIFOCount (); Serial.println (F («Переполнение FIFO!»)); // в противном случае проверьте наличие прерывания готовности данных DMP (это должно происходить часто)} else if (mpuIntStatus & _BV (MPU6050_INTERRUPT_DMP_INT_BIT)) {// ждать правильной доступной длины данных, должно быть ОЧЕНЬ короткое ожидание while (доступен пакет fifoCount 1 / / (это позволяет нам сразу читать больше, не дожидаясь прерывания) fifoCount - = packetSize; // Получить значения рыскания, наклона и крена #ifdef OUTPUT_READABLE_YAWPITCHROLL mpu.dmpGetQuaternion (& q, fifoBuffer); mpu.dmpGetGravity (& gravity, & q); mpu.dmpGetYawPitchRoll (ypr, & q, & gravity); // Значения рыскания, тангажа, крена - радианы в градусы ypr [0] = ypr [0] * 180 / M_PI; ypr [1] = ypr [1] * 180 / M_PI; ypr [2] = ypr [2] * 180 / M_PI; // Пропускаем 300 показаний (процесс самокалибровки) if (j <= 300) {right = ypr [0]; // Рыскание начинается со случайного значения, поэтому мы захватить последнее значение после 300 чтений j ++;} // После 300 чтений else {ypr [0] = ypr [0] - правильно; // Установить значение Yaw на 0 градусов - вычесть последнее случайное значение Yaw из текущего значения, чтобы сделать Рыскание 0 градусов es // Сопоставьте значения датчика MPU6050 от -90 до 90 со значениями, подходящими для сервоуправления от 0 до 180 int servo0Value = map (ypr [0], -90, 90, 0, 180); int servo1Value = map (ypr [1], -90, 90, 0, 180); int servo2Value = карта (ypr [2], -90, 90, 180, 0); // Управляем сервоприводами в соответствии с ориентацией MPU6050 servo0.write (servo0Value); servo1.write (servo1Value); servo2.write (servo2Value); } #endif}}

Наконец, используя функцию записи, мы отправляем эти значения сервоприводам в качестве управляющих сигналов. Конечно, вы можете отключить сервопривод рыскания, если хотите только стабилизацию для осей X и Y, и использовать эту платформу в качестве подвеса камеры

Шаг 9: когда все компоненты подключены, все выглядит так, как на этой картинке

Когда все компоненты соединены, это выглядит так, как на этой картинке
Когда все компоненты соединены, это выглядит так, как на этой картинке

Шаг 10: теперь вставьте все базовые продукты в банку с едой

Теперь вставьте все базовые продукты в банку с едой
Теперь вставьте все базовые продукты в банку с едой

Шаг 11: Когда все провода и компоненты размещены внутри пищевой банки, нанесите клеевой пистолет на основание пенопласта

Когда все провода и компоненты размещены внутри пищевой банки, нанесите клеевой пистолет на основание пенопласта
Когда все провода и компоненты размещены внутри пищевой банки, нанесите клеевой пистолет на основание пенопласта

Шаг 12: Заключение

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

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

Рекомендуемые: