Программное ограничение перемещения сервопривода

Серия-статей: Arduino, использование сервоприводов #4

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

Знак равенства позволяет нам установить значения аргументов по умолчанию. В том случае, если нам не нужно менять стандартные значения, достаточно будет просто указать номер пина, т.е вызов функции AttachServo(2); будет равнозначен AttachServo(2,0,180,0); и произведет подключение сервопривода ко второму пину со стандартными значениями пределов перемещения.

Для этого добавим в наш класс пару переменных posMax и posMin. Заодно позаботимся о исходном положении сервопривода, в котором он должен находиться при запуске программы, определим его с помощью переменной posInit. Устанавливать значния этих переменных будем одновременно с инициализацией сервопривода, для этого добавим в функцию AttachServo еще три аргумента:

void AttachServo (int pin, int minpos=0, int maxpos=180, int initpos=0)

Пример инициализации сервоприводов с пределами перемещения:

void setup()

{

serv1.AttachServo(2); // Ко второму пину подключен первый сервопривод

// Стандартные пределы перемещения от 0 до 180 градусов

// Стандартное исходное положени 0 градусов

serv2.AttachServo(3, 20, 160, 90); // К третьему пину подключен второй сервопривод

// Пределы перемещения от 20 до 160 градусов

// Исходное положение - 90 градусов

}

Схема подключения двух сервоприводов к Arduino с ограничением по углу поворота и управлением черз пользовательский класс

Теперь создадим функцию MoveTo, с помощью которой будем управлять движением сервопривода. В простейшем варианте нам нужно будет просто переместить сервопривод в нужное положение. Для этого просто вызовем эту функцию с одним аргументом – нужным нам положением, например serv1.MoveTo(20); даст команду первому сервоприводу повернуться в положение 20 градусов. Поскольку мы ранее установили максимальные и минимальные пределы перемещения, то попытка вызвать функцию с неправильным углом - serv2.MoveTo(220); Приведет к тому, что сервопривод повернется до установленного максимального значения в 160 градусов и остановится.

Вот что у нас получилось:

//Управление сервоприводами с помощью пользовательского класа, задание

// перемещения с помощью вызова одной функции с программным ограничением перемещений

#include // Подключаем библиотеку для работы с сервоприводом

class ServoClass

{

Servo serv; // Собственно сам сервопривод, управляемый стандартной библиотекой servo

int servPosition;// Текущая позиция сервопривода, градусов

int posMax; // Максимально допустимый предел перемещения сервопривода, градусов

int posMin; // Минимальный допустимый предел перемещения сервопривода, градусов

int posInit; // Исходная позиция сервопривода, градусов

public:

ServoClass ()

{

posMin=0; // Устанавливаем значание по умолчанию

posMax=180;

posInit=0;

servPosition=0;

}

void AttachServo (int pin, int minpos=0, int maxpos=180, int initpos=0)

{

serv.attach(pin); // Подключаем сервопривод к указанному пину

posMin= minpos; // Устанавливаем минимальную позицию

posMax= maxpos; // Устанавливаем максимальную позицию

posInit= initpos; // Устанавливаем исходную позицию

servPosition= posInit; // Позиция сервопривода должна сответствовать исходному положению

serv.write(servPosition); // Даем команду изменить положение

}

void MoveTo (int movepos) // Даем команду на перемещение сервопривода

{

// Проверяем, не выходим ли мы за допустимые пределы премещения

if (movepos<=posMin) // Если указано большее значение, чем максимальный

// предел перемещения

movePosition=posMin; // Будем двигаться тоько до этого предела

else

if (movepos>=posMax) // Если указано меньшее значение, чем минимальный

//предел перемещения

movePosition=posMin; // Будем двигаться тоько до этого предела

else // В любых других случаях - мы в допустимых для перемещения пределах

movePosition=movepos; // Просто устанавливаем позицию, в которую должен

// переместиться сервопривод

serv.write(servPosition); // Даем команду изменить положение

}

};

ServoClass serv1; // первый сервопривод

ServoClass serv2;

void setup()

{

serv1.AttachServo(2); // Первый сервопривод подключен ко второму пину

// Стандартные пределы перемещения от 0 до 180 градусов

// Стандартное исходное положени 0 градусов

serv2.AttachServo(3, 20, 160, 90); // Второй сервопривод подключен к третьему пину

// Пределы перемещения от 20 до 160 градусов

// Исходное положение - 90 градусов

serv1.MoveTo(20); // Пермещаем первый сервопривод в положение 20 градусов

serv2.MoveTo(220); // Пермещаем второй сервопривод в положение 220 градусов

// из-за ограничения на максимальное пермещение сервопривод

// Повернется до 160 градусов и остановится

}

void loop()

{

}

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

Еще:

Подключаем сервопривод к Arduino (Arduino, использование сервоприводов #1)
Создаем класс для управления сервоприводом (Arduino, использование сервоприводов #3)
Программное ограничение перемещения сервопривода (Arduino, использование сервоприводов #4)