Скетч PCA9685 2 сервомашинки работают синхронно от одного потенциометра
- Информация о материале
- Обновлено: 06.05.2023, 22:33
- Опубликовано: 06.05.2023, 22:24
- Автор: DeniS
/*
Данный код плавно управляет одной сервой
при помощи потенциометра (на пине А0).
Используется драйвер PCA9685
Откройте порт по последовательному соединению для наблюдения за положением серво
Документация: https://alexgyver.ru/servosmooth/
*/
#include <ServoDriverSmooth.h>
ServoDriverSmooth servo4;
ServoDriverSmooth servo8;
//ServoDriverSmooth servo(0x40); // с указанием адреса драйвера
//ServoDriverSmooth servo(0x40, 270); // с указанием адреса и макс. угла
uint32_t myTimer;
void setup()
{
Serial.begin(9600);
servo4.attach(4, 150, 550); //серво подключена к 4 PCA9685
servo8.attach(8, 150, 550); //серво подключена к 8 PCA9685
// 150 и 600 - длины импульсов, при которых
// серво поворачивается максимально в одну и другую сторону, зависят от самой серво
// и обычно даже указываются продавцом. Мы их тут указываем для того, чтобы
// метод setTargetDeg() корректно отрабатывал диапазон поворота сервы
// для драйвера диапазон в районе 150-600! Не как у обычной серво
servo4.setSpeed(120); // ограничить скорость
servo4.setAccel(0.1); // установить ускорение (разгон и торможение)
servo8.setSpeed(120); // ограничить скорость
servo8.setAccel(0.1); // установить ускорение (разгон и торможение)
}
void loop()
{
// желаемая позиция задаётся методом setTarget (импульс) или setTargetDeg (угол), далее
// при вызове tick() производится автоматическое движение сервы
// с заданным ускорением и ограничением скорости
boolean state4 = servo4.tick(); // здесь происходит движение серво по встроенному таймеру!
boolean state8 = servo8.tick(); // здесь происходит движение серво по встроенному таймеру!
if (millis() - myTimer >= 40)
{
myTimer = millis();
int newPos = map(analogRead(0), 0, 1023, 0, 180); // берём с потенцометра значение 0-180
servo4.setTargetDeg(newPos); // и отправляем на серво
servo8.setTargetDeg(newPos);
Serial.println(String(newPos) + " " + String(servo4.getCurrentDeg())/* + " " + String(state)*/);
// state показывает сотояние сервы (0 - движется, 1 - приехали и отключились)
}
}