Найти тему
Алексей Кретов

Сервоприводы в Arduino. Разбор задачи №1

Оглавление

Разберём задачку из 1 урока

Заданием было выполнить движение сервопривода, с плавным перемещением между 3 точками 0,90 и 180 градусов, в которых сервопривод должен был оставаться 1 секунду.

Очевидно, что решением проблемы должны стать задержки, в тех случаях, когда сервопривод достигает упомянутых трёх положений. Для решения этой задачки на ум сразу же приходят 5 способов.

1 способ

Самый очевидный путь состоит в том, что бы разделить код на промежутки:

0...90
90...180
180...90
90...0

между этими промежутками поставить задержку 985мс, ведь внутри цикла уже заложена задержка в 15 мс.

-2

Путь простейший, а потому не самый удобный. писать придется много, и как известно, чем больше код, тем больше в нём будет ошибок. к тому же дорабатывать его станет труднее.

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

2 способ


Мы ведь помним, что задержка нужна в 3х местах, а это значит, что мы сравниваем значения угла с интересующими нас. Именно для этого и существует конструкция if добавить проверки if ()

Тогда проще всего сформулировать условия следующим образом

if(pos == 0){}
else if(pos == 90){}
else(pos == 180){}

При такой проверке становится удобно немного изменить цикл FOR ограничивая его конечное значение на 1 меньше.

-3

Становится лучше, но всё еще требуется повторять одни и те же действия и проверки, что приводит к избыточному дублированию кода

3 способ

Сложные условия внутри if()записанные через логический оператор ИЛИ

if(pos == 0 || pos ==90){}
else{}
if(pos == 180 || pos == 90){}
else{}

-4

Не плохой способ, однако каждый раз будет выполняться проверка и выполняться будет альтернативное действие, а значит на 3 истинных срабатывания условного оператора будет 177 ложных. На такие проверки всё еще тратится лишнее время

4 способ

Более правильный, ведь в любом случае выполняется проверка внутри if(). Тогда проще проверять, что угол неравен 0, 90, 180.

if(pos != 0 || pos != 90){}
if(pos != 180 || pos != 90){}

Это обратная ситуация в сравнении с 3 способом.

-5

Экономится время на выполнении одного из условий и большую часть времени выполняется истинное действие внутри условного оператора.

5 способ

Еще один способ близкий к варианту №1.

Разместим задержку в 1000 мс перед циклами for(), а внутри циклов будем проверять только неравенство значению 90

if(pos != 90){}

-6

Но тут придётся немного переписать циклы for()

Выводы

Как видим для решения любой задачи существует не один способ, а как правило не менее трех. в данной ситуации мне на ум пришли эти 5 способов, 2 из которых были предложены участниками сервомарафона в инстаграме.

Свои варианты по прежнему можно размещать с соответствующими подписями и хештегами