Новое. Вход Detach в блок Servo

решение по дрожанию servo

В данный форуме Вы можете создавать темы посвящённые расширению функционала программы или сайта. После рассмотрения Ваше предложение будет перенесено в соответствующее место
Ответить
НовыйUser
Сержант
Сообщения: 154
Зарегистрирован: 26.11.2015{, 22:05}
Репутация: 8

Новое. Вход Detach в блок Servo

#1

Сообщение НовыйUser » 25.03.2018{, 14:44}

:senile: Новое. Вход в блок Servo функцию Detach.

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

Во многих случаях именно Detach применяется как решение исходя из прочитанное информации.
http://forum.flprog.ru/viewtopic.php?p=32234#p32234
https://www.arduino.cc/en/Reference/ServoDetach

К примеру, вариант установки угла серводвигателя в 0 или 180 предполагает упор и сдвинуть на какой либо угол серво не представляется возможным, по-этому удержание позиции не является необходимостью. Возможно, кроме это, detach может заменить лишний объем кода собранного на гистерезис, если таковой используется.

Рабочее решение без транзистора отключающее пин серво пока автор не модифицировал штатный блок :umnik:
СпойлерПоказать

Скетч по детектированию переменной сначала подключает пин сервы, далее ставит на ней EN=1(формально, т.к в работе этот вход отключается только обращение к серво и не отключает ее пин) , происходит поворот сервы, далее задержка 5 секунд идет, далее выключает пин сервы.

( _swi2 - вход на блок серво где указан угол, 20 - пин сервы)


#include <Servo.h>
Servo _SM1;
bool _gtv1;
bool _changeNumber2_Out = 0;
int _changeNumber2_OLV;
int _swi2;
void setup()
{
_SM1.attach(20);
}
void loop()
{int _tempVariable_int;

//Плата:1
if(_gtv1)
{_swi2=180;}
else
{_swi2=0;}
if (_changeNumber2_Out) {_changeNumber2_Out = 0;} else {_tempVariable_int = _swi2;
if (_tempVariable_int != _changeNumber2_OLV) {_changeNumber2_OLV = _tempVariable_int; _changeNumber2_Out = 1;}
}
if (_changeNumber2_Out) {_SM1.write (_swi2);}


Перед заливкой в микроконтроллер:

1) Из секции void setup() удаляется подключение пина сервы: _SM1.attach(20); чтобы не происходила инициализация серводвигателя.

2) Строку:

if (_changeNumber2_Out) {_SM1.write (_swi2);}

и меняется ТОЛЬКО ЭТУ строку на:

if (_changeNumber2_Out) {_SM1.attach(20); {_SM1.write (_swi2); {delay (5000); {_SM1.detach(); }}}}


Результатом получится следующий код:


#include <Servo.h>
Servo _SM1;
bool _gtv1;
bool _changeNumber2_Out = 0;
int _changeNumber2_OLV;
int _swi2;
void setup()
{
}

void loop()
{int _tempVariable_int;

//Плата:1
if(_gtv1)
{_swi2=180;}
else
{_swi2=0;}
if (_changeNumber2_Out) {_changeNumber2_Out = 0;} else {_tempVariable_int = _swi2;
if (_tempVariable_int != _changeNumber2_OLV) {_changeNumber2_OLV = _tempVariable_int; _changeNumber2_Out = 1;}
}
if (_changeNumber2_Out) {_SM1.attach(20); {_SM1.write (_swi2); {delay (5000); {_SM1.detach(); }}}}



3) Проверка работы. Если тестовый скетч отработал как нужно, то ок.

В итоговом проекте где необходимо внести корректировки вход _swi2 и детектор числа могут иметь чуть отличные буквенные значения.

Delay можно менять на свое усмотрение в зависимости от того хватит ли для серво времени на поворот в заданный угол.

Если есть варианты более практичные и менее ресурсоемкие (особенно без delay останавливающий остальную обработку на указанное время), интересно будет изучить. Думаю, можно опубликовать тут же в топике.

Существует функция servo.read(); в одних источниках пишут о том что возвращает число поданное на write угла, в других о текущем положении угла. При втором варианте имеет смысл сделать выход к стандартному блоку servo с положением текущего угла поворота.
И в таком варианте возможно переделать логику представленного скетча использовав read для отключения detach вместо delay
СпойлерПоказать
Еще вариант применения. Когда необходимо при старте мк сначала в 0 перевести серводвигатель.
в секции setup удаляется из середины _SM1.attach(20); и на самый верх (если необходимо остановить весь скетч сначала на указанный delay и проинициализировать серву) секции setup переносится строка:
{_SM1.attach(20); {_SM1.write (_swi2); {delay (5000); {_SM1.detach(); }}}}
аналогичная установленной на плате
либо последней строкой перед void loop (если необходимо сначала весь сетап проинициализировать с учетом возможных представленных в нем задержек и уже после проинициализировать серву)


{_SM1.attach(20); {_SM1.write (_swi2); {delay (5000); {_SM1.detach(); }}}}
}
void loop()

Вложения
servo.jpg

Ответить

Вернуться в «Новые»