fbpx

Серво мотор – как работи и как се ползва с ATtiny85

Micro servo motor
Серво мотора изглежда ето така.

Серво, или още известно като серво мотор, е устройство за механично управление, което може да завърти оста си на определена позиция, т.е. под определен ъгъл. Това става, като му бъде подаден определен електрически сигнал.

Рамото, прикрепено към оста му, може да  бъде позиционирано под определен ъгъл в зависимост от това, какъв електрически сигнал е подаден към сервото.

Съществуват много видове серво мотори като размер и форма, технически параметри, начин на управление и мн. други. Тук ще се спрем на няколко по-конкретни модела, които са популярни, достъпни и лесни за ползване.

  • TowerPro SG90 Micro Servo Motor
  • TowerPro MG90S Micro Servo Motor

Оттук нататък ще говорим за тези два модела серво двигатели, както и за други, сходни по параметри и управление.

TowerPro SG90 Micro Servo Motor
TowerPro SG90 Micro Servo Motor
TowerPro MG90S Micro Servo Motor
TowerPro MG90S Micro Servo Motor

Как се управлява

Принципът на управление е много прост – подава се кратък електрически импулс, в зависимост от неговата продължителност сервото се завърта на определена позиция.

Серво мотор - как работи - диаграма

Когато подадем импулс с дължина 1 милисекунда, серво моторът се позиционира в позиция 0 градуса. Когато подадем импулс с дължина 2 милисекунди, серво моторът се позиционира в позиция 90 градуса.

Импулсите трябва да се подават с честота 50 пъти в секунда, т.е. периодът на сигнала трябва да бъде 20 милисекунди.

Всички серва могат да изпълнят командите за позициониране под ъгъл от 0 до 90 градуса.

Интересен е въпросът, какво става, ако подадем сигнал по-къс от стандартния (по-кратък от 1 милисекунда) или по-дълъг (повече от 2 милисекунди). Отговорът е – „зависи“. В много от случаите серво моторът ще може да се завърти на още 45 градуса и в двете посоки, т.е. да постигне общ размах до 180 градуса, но това зависи от конкретното серво (производител и модел), което използваме. Най-добре е да проведем експеримент, за да разберем с какви възможности разполага серво моторът, който ползваме.

ВАЖЕН въпрос е: Колко пъти да изпратим импулса към серво мотора?

Правилният отговор е: докато достигне желаната от нас позиция. Трудно е обаче да кажем предварително колко пъти е това, защото различните серво мотори се движат с различна скорост. Също така според това каква е разликата между двете позиции, от/до които искаме да преместим рамото, може да се наложи да подадем повече или по-малко на брой импулси.

Серво мотор - свързване към ATtiny85

Има два начина за справяне с този проблем:

  1. да използваме допълнителен сензор за обратна връзка, който да ни сигнализира, когато рамото на серво мотора достигне до желаната позиция;
  2. експериментално да установим за конкретния серво мотор, който ползваме, за какви разстояния колко време е необходимо.

Например: в кода даден по-долу за преместване на 90 градуса са достатъчни 50 импулса, което при период на сигнала 20 милисекунди прави 1 секунда.

Свързване към ATtiny85

Серво моторът се свързва с 3 кабела: 2 за захранване и 1 за управляващия сигнал.

  • GND – захранване минус: кафяв (или черен)
  • VCC – захранване плюс: червен
  • SIG – сигнал за управление: оранжев (или жълт, или бял)

За целите на експеримента и за примерния код по-долу ще свържем управляващия сигнал SIG към пин PB1 на микроконтролера ATtiny85.

Серво мотор - свързване към Тинузавър

Свързване към платка Тинузавър

Някои от добавъчните платки на Тинузавър (Tinusaur Shields) имат конектор за свързване на серво мотор. Такива са LEDx2 и EDUx3IO, които са част от комплекта Тинузавър Стартер ЕДУ.

Когато използваме LEDx2, сервото се управлява на PB2, а когато използваме EDUx3IO – на PB1.

ServoLibTiny

Написали сме малка библиотека ServoLibTiny за работа със серво мотори, която има две основни функции:

  • servolibtiny_sel: за избор и инициализиране на порт;
  • servolibtiny_pos: за позициониране на сервото.

Фрагмент от примерна програма

#include "servolibtiny/servolibtiny.h"
int main(void) {
    servolibtiny_sel(PB1);
    for (;;) {
        servolibtiny_pos(0, 50);
        _delay_ms(200);
        servolibtiny_pos(250, 50);
        _delay_ms(200);
    }
    return 0;
}

Функцията servolibtiny_pos(pos, count); има два параметъра:

  • pos – позиция, на която да отиде сервото.
  • count – брой: на изпратените импулси.

Параметърът pos може да приема стойности от 0 до 250, което съответства на 0 и 90 градуса, което е по спецификация за управление на серво мотори. Може да подадем по-малки или по-големи стойности – например от -200 до + 450, за да постигнем още по-голям ъгъл на отклонение на рамото.
МНОГО ВАЖНО: Ако използвате стойности различни от стандартните, рискувате да повредите серво мотора.

По-подробна техническа информация за библиотеката ServoLibTiny има на https://tinusaur.com/libraries/servolibtiny/

Блоктину

За тези, които ползват нашата платформа за създаване на програми за микроконтролери Блоктину, сме добавили блокче за серво мотор.

Серво мотор блоково програмиране Блоктину

Както се вижда и от генерирания от платформата код, който също използва функциите от библиотеката ServoLibTiny.

Серво мотор блоково програмиране Блоктину

Заключение

Функциите за работа със серво мотор могат да бъдат разширени при нужда.

Например:

  • работа с повече от един серво мотор.
  • автоматично изчисляване на нужния брой импулси според позицията.

Серво моторите обикновено се ползват заедно с други устройства и сензори, за да извършват по-комплексни задачи.

Допълнителна информация

Добавено в картата
0 продукта - 0.00лв.