Библиотека ServoTimer2: простое руководство по управлению сервоприводами без конфликта таймеров
Компоненты и материалы
| Сервопривод (Tower Pro MG996R или SG90) | × | 1 |
| Arduino UNO | × | 1 |
| Перемыжки | × | 1 |
О проекте
Введение
При создании гуманоидного робота столкнулся с проблемой: библиотеки TMRpcm (воспроизведение звука) и VirtualWire используют Timer1 Arduino. Стандартная библиотека Servo.h тоже использует Timer1. Нельзя использовать два устройства на одном таймере одновременно — если робот говорит, сервоприводы не работают.
Решение — библиотека ServoTimer2, которая использует Timer2. В интернете не нашёл понятных туториалов по ней, поэтому написал это руководство. Мы подключим один сервопривод и напишем простой sweep (плавное вращение).
Шаг 1: Детали и сборка
Основная деталь — сервопривод (любая модель, например, SG90).
Надежнее закрепить рычаг на картоне для наглядности угла поворота, затем установить на вал сервы.
Шаг 2: Установка библиотеки ServoTimer2
- Скачайте с GitHub: https://github.com/nabontra/ServoTimer2
- В Arduino IDE: Sketch → Include Library → Add .ZIP Library → выберите скачанный архив.
Шаг 3: Схема подключения
- Красный провод сервы → Arduino 5V (VCC)
- Коричневый/чёрный → GND
- Оранжевый/белый (сигнал) → Digital Pin 6
Шаг 4: Код — сравнение Servo.h и ServoTimer2
Стандартный Servo.h (управление градусами):
#include <Servo.h>
Servo servo1;
void setup() {
servo1.attach(6);
}
void loop() {
servo1.write(0); delay(1000);
servo1.write(90); delay(1000);
servo1.write(180); delay(1000);
}
Здесь просто указываем угол в градусах.
ServoTimer2 (управление длительностью импульса в микросекундах):
#include "ServoTimer2.h"
ServoTimer2 servo1;
void setup() {
servo1.attach(6);
}
void loop() {
servo1.write(750); // мин. импульс ~0°
delay(1000);
servo1.write(1500); // ~90°
delay(1000);
servo1.write(2250); // макс. импульс ~180°
delay(1000);
}
Ключевое отличие: в ServoTimer2 аргумент write() — это длительность импульса (pulse width) в микросекундах, а не градусы.
- 750 мкс ≈ 0° (минимум)
- 1500 мкс ≈ 90° (середина)
- 2250 мкс ≈ 180° (максимум)
Точные значения зависят от конкретной сервы. Экспериментируйте — это не повредит привод.
Шаг 5: Питание и эксперименты
Подайте питание, наблюдайте за углом поворота при разных значениях импульса. Подберите свои минимум/максимум для точного позиционирования. У некоторых серв может потребоваться до 2700 мкс для 180°.
Код
Servo sweep (Servo.h)
#include <Servo.h>
Servo servo1;
void setup() { servo1.attach(6); }
void loop() {
servo1.write(0); delay(1000);
servo1.write(90); delay(1000);
servo1.write(180); delay(1000);
}
ServoTimer2 sweep
#include "ServoTimer2.h"
ServoTimer2 servo1;
void setup() { servo1.attach(6); }
void loop() {
servo1.write(750); delay(1000);
servo1.write(1500); delay(1000);
servo1.write(2250); delay(1000);
}
Схемы
Схема подключения и исходный код на GitHub: https://github.com/ashraf-minhaj/Arduino-ServoTimer2-basic-sweep-/tree/code-sweep
Производственный процесс
- Как молибден формирует современную промышленность: применение, преимущества и динамика поставок
- Создание робота на Arduino и Raspberry Pi: пошаговое руководство
- Simple Pi Robot — Сборка 2WD автономного ровера на Raspberry Pi
- Полное руководство по производству стекловолокна
- Использование realloc() в C: синтаксис, лучшие практики и пример
- Освоение функции free() в C: практическое руководство и пример
- Использование термистора: пошаговое руководство для Arduino
- Создание анимации прогрессивного среза в SolidWorks — Пошаговый урок
- Создайте выигрывающий прототип: Пошаговое руководство для быстрой разработки продукта
- Освоение техник шлифовального станка для режущих инструментов: практическое руководство