Программное ограничение перемещения сервопривода
Серия-статей: 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 градусов
}
Теперь создадим функцию 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()
{
}
Теперь мы можем не бояться, что дадим команду на неправильное перемещение и сервопривод уткнется в препятствие. Достаточно один раз ограничить перемещения при инициализации.