Мобільна версія Форум Arduino Документація Гарантійні умови 0 0
UA RU
Графік роботи магазину:
Пн-Пт: 8.00 - 19.00
Сб: 10.00 - 17.00
Нд: вихідний
Каталог
Напиши статтю і отримай знижку!

Цифровий сервопривід із аналогового, або як керувати його параметрами

2021-05-28

Всі статті →

Давиденко Д.А.

Інколи, при реалізації складного проєкту в якому дуже важлива надійність кожної деталі, виникає питання про якість комплектуючих. Дорогі комплектуючі практично завжди мало чим поступаються дешевим, але інколи існує можливість модифікувати дешевий виріб від майбутніх проблем його використанням. Не так давно, я зіткнувся з такою проблемою. При проектуванні Карпового кораблика, придбав декілька сервоприводів MG996R. Ціна приваблива, та й ще металевий привід. Але після декількох тестів, по не відомій причині пробивала мікросхема, яка виконує роль H-bridge.

Привід спочатку добре працював, але через деякий час вияснилось де у нього слабке місце. Купувати інший сервопривід не хотілось, жаль, що такий потужний привід так і не буде задіяний, особливо коли їх потрібно було 3, та їх вихід з ладу привів би до можливої втрати кораблика. Тому, було вирішено керувати двигуном приводу за допомогою зовнішнього більш потужного драйверу для колекторного двигуна, особливо, що зворотній зв'язок для визначення положення валу влаштований в конструкцію сервоприводу. Керування та позиціювання буде відбуватися за допомогою контролера, що дає можливість значно підвищити максимальний кут обертання валу приводу, а також керувати параметрами обертання.

Комплектуючі:

В ролі перетворювача напруги, використовується Mini 560 у якого встановлений резистор на 10кОм, який забезпечує вихід 6.35в. Перетворювач може бути інший, з вихідною напругою 6-9в, в залежності який двигун використовується у відповідній серві. Контролер Pro mini, але може бути інший, залежно від компактності та цілей. Драйвер колекторних двигунів TB6612FNG двох канальний, доволі потужний драйвер, також має захист, також, додатковий канал може бути використаний для інших цілей.

Логіка роботи драйверу:

IN1IN2PWMSTBYOUT1OUT2Опис режиму
ВисокийВисокийВисокий/НизькийВисокийНизькийНизькийГальмування
НизькийВисокийВисокийВисокийНизькийВисокийЗворотне обертання
НизькийВисокийВисокийВисокийНизькийНизькийГальмування
ВисокийНизькийВисокийВисокийВисокийНизькийПряме обертання
ВисокийНизькийНизькийВисокийНизькийНизькийГальмування
НизькийНизькийВисокийВисокийВиключенийВиключенийСтоп
Високий/НизькийВисокий/НизькийВисокий/НизькийНизькийВиключенийВиключенийОчікування

Звичайний сервопривід керується за допомогою ШІМ сигналу відповідного діапазону тривалості імпульсу з відповідним періодом повторення. За рахунок чого, логіка серви може позиціонуватися у заданому куті. Це відбувається за рахунок вбудованого потенціометра.

Конструкція сервоприводу:

Для цифрової реалізації серви, потрібно викинути плату управління. Наприклад в MG996R це єдина плата, яка тримається на виводах двигуна та потенціометра.

   

Після того, як плата була випаяна, відкривається повноцінний доступ до двигуна з потенціометром. Потенціометр грає важливу роль в позиціонуванні валу приводу. Знімати значення потенціометра можна на будь-якому аналоговому піну контролера. Плечі потенціометра потрібно підтягнути до цифрового живлення контролера та до землі, для точного виміру значень. Двигун під'єднується до одного з виходів каналів драйверу.

Схема підключення:

Потенціометр R2 – використовується для задавання куту оберту серви, але для задавання куту можна вибрати буд-який інтерфейс, залежно від конструкції та призначення, наприклад UART.

Опис логіки позиціонування:

В безкінечному циклі розраховується різниця значення зовнішнього потенціометра R2 зі значенням потенціометра R1. Для розрахунку швидкості оборотів двигуна дана різниця розраховується за модулем та добавляється параметр прискорення. Значення швидкості важливо обмежити за допомогою функції «constrain» до uint8 (0..255), так як використовується функція «analogWrite» для створення керуючого сигналу з ШІМ для драйверу двигуна.

Apeed(m)=R2-R1+Acceleration

За рахунок цього, швидкість оборотів двигуна буде найменшою тоді коли R1 зрівняється з R2. Динамічне підстроювання швидкості дуже важливе, тому що постійний рівень швидкості може завадити гарному позиціонуванні так як двигун та привід мають інерцію, і бажана позиція може перескочити на декілька значень вперед, та приведе до спрацювання логіки зворотнього обертання приводу, що приведе до імпульсивних вібрацій двигуна в області бажаної позиції. В аналогових приводах такий же принцип, але на швидкість двигуна впливає зрівняння ШІМ сигналу. На розрахунок напрямку обертів вливає різниця між R2 та R1 «DiffValue». Контролер приймає рішення, якщо різниця більше за значення параметру утримання то відбувається пряме обертання, в іншому випадку, якщо різниця менша за значення параметру утримання який має негативний знак, то відбувається зворотне обертання. У всі інших випадках всі керуючі піни драйвера підтягуються до високого рівня, що в свою чергу вмикає режим гальмування (двигун стопориться) для утримання привода на одному місці. До речі, параметр утримання «BrakeValue» відповідає за дискретність позиціонування, тобто область кута в якому потрібно виконувати гальмування двигуна.

Програмний код:

// =====================================================================

// ------------------------ Digital Servo ------------------------------

// =====================================================================

#define Acceleration 20 // параметр прискорення

#define BrakeValue 1 // параметр утримання

int AngleAnalog;

int ServoAngle;

int MeaValue;

int DiffValue;

byte SpeedMotor;

void setup() {

// ========= Налаштування таймеру ШІМ на D5 и D6 - 4 кГц

TCCR0B = 0b00000010;

TCCR0A = 0b00000001;

pinMode(4, OUTPUT); // AIN1

pinMode(5, OUTPUT); // AIN2

pinMode(6, OUTPUT); // PWM

}

void loop() {

// =====================================================================

// ----------------------- Значення R2 ---------------------------------

AngleAnalog = map(analogRead(A0), 0, 1023, 0, 300);

// =====================================================================

ServoAngle = map(AngleAnalog, 0, 300, 300, 0);

MeaValue = map(analogRead(A1), 0, 1023, 0, 300); // Значення R1

DiffValue = ServoAngle - MeaValue; // різниця R2 та R1

// ------------------------ Розрахунок швидкості ---------------------

SpeedMotor = constrain((abs(DiffValue) + Acceleration), 0, 255);

// ===================================================================

// ----------------------- Логіка позиціювання -----------------------

// ===================================================================

if (DiffValue > BrakeValue) {

digitalWrite(4, HIGH); // AIN1

digitalWrite(5, LOW); // AIN2

analogWrite (6, SpeedMotor); // PWM

}

else if (DiffValue < (-BrakeValue)){

digitalWrite(4, LOW); // AIN1

digitalWrite(5, HIGH); // AIN2

analogWrite (6, SpeedMotor); // PWM

}

else {

digitalWrite(4, HIGH); // AIN1

digitalWrite(5, HIGH); // AIN2

digitalWrite(6, HIGH); // PWM }

// =====================================================================

}

Завантажити скетч можна за цим посиланням:

Навісний монтаж для демонстрації роботи:

Висновок:

За результатами роботи можна зробити висновок, що аналогова серва легко може стати цифровою за вдяки декілька деталей. Отримали найбільш надійний привод виключивши слабку ланку конструкції – плату контролю. Також, можливість гнучкого керування та налаштування важливих параметрів, як в статиці так і в динаміці для різних задач. Збільшили максимальний кут обертання за рахунок використання повного діапазону потенціометра серви до 300 градусів.

Ваша оцінка статті:

Відмінно
Добре
Задовільно
Погано
Дуже погано

Загальна оцінка:

Оцінка "Цифровий сервопривід із аналогового, або як керувати його параметрами"
5 з 5
зроблена на основі 1 оцінки 1 клієнтських відгуку.

Дякуємо Вам за звернення! Ваш відгук з'явиться після модерації адміністратором.
Snake
24.06.2021 16:23:05
Корисна стаття!
оплата картами Visa і MasterCard