Незалежне керування декількома сервоприводами

Серія статей: Програмування Arduino з нуля # 5

Серія статей: Arduino, використання сервоприводів # 2

Ми навчилися змінювати положення сервоприводу, але таке управління володіє декількома недоліками. Спробуємо підключити паралельно два сервоприводу і домогтися їх синхронного переміщення.

Незалежне керування декількома сервоприводами

Результат дії програми кілька отдічатеся від необхідного нам. Сервоприводи рухаються не синхронно, другий починає рух тільки після першого. Справа в тому, що команда delay () зупиняє виконання всіх дій на заданий час. І другий цикл не почне виконуватися до тих пір, поки не буде завершено перший. Саме, на перший погляд, просте рішення - давати команду обом СЕРВОПРИВОДИ в одному циклі:

Але в такому випадку сервоприводи зможуть рухатися тільки з однаковою швидкістю, що підходить далеко не у всіх випадках. Нам же потрібен більш універсальний варіант, з повністю незалежним управлінням. Тому замість використання затримки є сенс скористатися таймерами.

Можна помітити, що для відліку часу ми використовуємо змінну тпа unsigned long. Це пов'язано з тим, що тип int може зберігати числа від -32 768 до 32 767. Оскільки ми оперуємо мілісекундами, то через 32,67 секунди з початку роботи програми ми вже не зможемо використовувати int для зберігання часу відліку. Інакше поведінку програми стане непередбачуваним. А ось тип long може зберігати вже число від -2 147 483 648 до 2 147 483 647, а без урахування знака unsigned long - від 0 до 4 294 967 295. Тобто максимальне значення таймера - 4 294 967 секунд або майже 49 діб . Не думаю, що наша програма буде працювати стільки без перерви

Найпростіший спосіб - скористатися функцією millis (). Ця функція повертає кількість часу, що минув з запуску програми, з точністю до однієї тисячної секунди. Додамо в нашу функцію loop () опитування поточного часу. Будемо виконувати потрібну дію - поворот сервоприводу - тільки якщо з попереднього опитування пройшов певний час

З першого погляду нічого не змінилося, сервопривід точно також плавно змінює своє положення за 1,8 секунди. Тепер підключимо два сервоприводу

Єдине, потрібно враховувати, що при малих значеннях інтервалу і великій кількості дій, які виконуються в loop () частота виклику цієї функції може виявитися більше, ніж заданий інтервал. Соответсвенно дія буде відбуватися через зазначений час, а тільки при наступному виклику loop () Така ситуація може виникнути, наприклад, при безперервному виведення тексту через Serial.print (). Не рекомендується поміщати цю функцію в loop (). А якщо нам необхідно безперервно виводити якусь інформацію, то можна обмежити частоту таким же чином, як і для руху сервоприводів:

Тепер ми домоглися того, щоб сервоприводи здійснювали всі дії незалежно. Причому паралельно з рухом можна продовжувати виконання програми і здійснювати будь-які інші дії

Схожі статті