Вопросы по библиотеке ServoSmooth

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
565
а что не взять какую-нить стандартную библиотеку. типа Servo.h ? - проверенную миллионами юзеров?
библиотеки Алекса. вообще говоря. вещь в себе... хотя на этом форуме это лучше не говорить :)
Смотри, как бы вещь не оказалась в тебе =) ServoSmooth является оболочкой над Servo.h и использует её же методы
 
Изменено:

danik

✩✩✩✩✩✩✩
12 Фев 2020
19
0
Всем привет!

Какая-то очень странная история. Есть две идентичные сервы ( в роборуке), во время setup они обе корректно работают (встают в нужный угол и удерживает его). При установлении в loop угла одна Серва удерживает положение, а вторая достигает заданного угла и сразу отключается и не держит позицию... в чем может быть проблема? Думал сначала, что может сломал серву, но время сетапа она работает корректно и держит весь плеча роборуки!
Проверял другие вообще сервы - нет, всегда одна работает корректно, другая - нет.

Заранее огромное!

C++:
#include <ServoDriverSmooth.h>
ServoDriverSmooth servo;
ServoDriverSmooth servo1;


uint32_t tmr;
boolean flag;

void setup() {
  Serial.begin(9600);
  Serial.println("setup");
  servo.attach(8,160);    
  servo1.attach(7,0);
  servo.setSpeed(130); // ограничить скорость
  servo.setAccel(0.3);   // установить ускорение (разгон и торможение)
  servo1.setSpeed(130); // ограничить скорость
  servo1.setAccel(0.3);   // установить ускорение (разгон и торможение)
  Serial.println("end setup");
  delay(4000);
}

void loop() {

servo.tick();
servo1.tick();
servo.setTargetDeg(130);
servo1.setTargetDeg(20);
  }
 

AlexGyver

★★★★★★✩
Команда форума
30 Июл 2018
359
565
Отключи autoDetach() (включен по умолчанию), чтобы серва активно поддерживала заданный угол
 
  • Лойс +1
Реакции: danik

Gunna

✩✩✩✩✩✩✩
14 Окт 2020
1
0
Всем привет!
Прошу прощения за нубский вопрос. С помощью форума написал свою первую программу с данной библиотекой. Все работает как надо, однако при отключении autoDetach() программа полностью перестает работать. Как можно исправить данную ошибку?

C++:
#include <ServoSmooth.h>


ServoSmooth servo;

uint32_t tmr;
boolean flag;

void setup() {
  Serial.begin(9600);
  servo.attach(9);        // подключить
  servo.setSpeed(140);    // ограничить скорость
  servo.setAccel(0.5);
  servo.setAutoDetach(false); //после добавления этой строчки программа перестает работать
 
  }

void loop() {
servo.setTargetDeg(90);
while (!servo.tick());
delay(3000);
    
servo.setTargetDeg(180);
while (!servo.tick());
delay(3000);
    
servo.setTargetDeg(30);
while (!servo.tick());
delay(3000);
  }
 

vanvani4

✩✩✩✩✩✩✩
23 Фев 2020
2
1
Добрый вечер, господа. Пишу код для управления сервоприводом с помощью библиотеки Alexgyver "ServoSmooth". Сервопривод MG995 подключён к Arduino Nano. К сожалению не работает функция плавного движения сервопривода на стартовую позицию при запуске системы - servo.smoothStart(), сервопривод движется на стартовую позицию (по умолчанию 0 градусов) на полной скорости. Библиотеку ServoSmooth обновил до последней версии. Подскажите пожалуйста, в чём проблема?
C++:
// Подключаем библиотеку
#include <Adafruit_PWMServoDriver.h>
#include <ServoDriverSmooth.h>
#include <ServoSmooth.h>
#include <smoothUtil.h>

//Создаём объект сервопривода
ServoSmooth servo;

// Определяем переменные
uint32_t tmr;
boolean flag;

void setup() {
  servo.attach(9);     // Инициализация сервопривода на 9 pin, стартовый угол по умолчанию 0 градусов
  servo.smoothStart(); // НЕ РАБОТАЕТ привод должен плавно двигаться до 0 градусов из любого начального положения
  servo.setSpeed(40);  // Скорость движения сервопривода
}

void loop() {
    servo.tick();                        // Опрос сервопривода
    if (millis() - tmr >= 30000) {       // Каждые 30 секунд       
      tmr = millis();
      flag = !flag;
      servo.setTargetDeg(flag ? 0 : 180);// Крутим привод на 0 градусов или 180 градусов
    }
}
 
  • Лойс +1
Реакции: JesusChrist

JesusChrist

✩✩✩✩✩✩✩
1 Мар 2021
1
0
Добрый вечер, господа. Пишу код для управления сервоприводом с помощью библиотеки Alexgyver "ServoSmooth". Сервопривод MG995 подключён к Arduino Nano. К сожалению не работает функция плавного движения сервопривода на стартовую позицию при запуске системы - servo.smoothStart(), сервопривод движется на стартовую позицию (по умолчанию 0 градусов) на полной скорости. Библиотеку ServoSmooth обновил до последней версии. Подскажите пожалуйста, в чём проблема?
C++:
// Подключаем библиотеку
#include <Adafruit_PWMServoDriver.h>
#include <ServoDriverSmooth.h>
#include <ServoSmooth.h>
#include <smoothUtil.h>

//Создаём объект сервопривода
ServoSmooth servo;

// Определяем переменные
uint32_t tmr;
boolean flag;

void setup() {
  servo.attach(9);     // Инициализация сервопривода на 9 pin, стартовый угол по умолчанию 0 градусов
  servo.smoothStart(); // НЕ РАБОТАЕТ привод должен плавно двигаться до 0 градусов из любого начального положения
  servo.setSpeed(40);  // Скорость движения сервопривода
}

void loop() {
    servo.tick();                        // Опрос сервопривода
    if (millis() - tmr >= 30000) {       // Каждые 30 секунд      
      tmr = millis();
      flag = !flag;
      servo.setTargetDeg(flag ? 0 : 180);// Крутим привод на 0 градусов или 180 градусов
    }
}
Не нашли решение проблемы? С такой же проблемой борюсь :(
 

Сергей_СПб

✩✩✩✩✩✩✩
7 Май 2021
1
0
Вопрос по tick();

Есть код управления сервоприводами через PCA9865.

Я совершаю 1 итерацию и мне функция tick() говорит "Всё чувак, ты достиг целевого угла". Все сервоприводы в TRUE. Но у меня впереди еще несколько таких итераций.

Как мне обнулить значение tick (), чтобы я мог по завершении следующего шага знать об этом? Без этого я не понимаю что достиг целевой позиции, т к угол конечный выставляется в результате работы +-2 градуса, а не точные значения как в таблице.

Может быть есть еще какой то вариант решения?

P.S. Код не весь,


Управление гексаподом:
int servoPrg02step = 3; //кол-во шагов
int servoPrg02 [][numberOfACE] = {
//{ kneeFR, hipFR, kneeMR, hipMR, kneeBR, hipBR, kneeFL, hipFL, kneeML, hipML, kneeBL, hipBL,   ms    }
//{    1 нога    |   2 нога  M   |   3 нога     |   4 нога     |    5 нога M  |    6 нога    |     
  {    0,       0,     -30,     0,      0,     0,     30,     0,      0,     0,     30,     0,   2000  },//2,4,6 up
  {    0,     -45,      0,     45,      0,   -45,      0,   -45,      0,    45,      0,   -45,   2000  },//1,3,5 назад, 2,4,6, вперед
  {    0,       0,      30,     0,      0,     0,    -30,     0,      0,     0,    -30,     0,   2000  },//2,4,6 down
}
void setup() {
  Serial.begin(9600);
   for (int j = 0; j < numberOfServos; j++) {
    servo[j].attach(j,SERVOMIN,SERVOMAX,servoCal[j]);
    servo[j].setAutoDetach(false); //отключаем автоотключение сервопривода при достижении заданного угла
    servo[j].smoothStart();   //вызывать сразу после attach(пин, таргет). Смягчает движение серво из неизвестной позиции к стартовой. БЛОКИРУЮЩАЯ НА 1  СЕК!
    servo[j].setSpeed(22);    // скорость - градусов в секунду 22 = 2000 ms
    servo[j].setAccel(0.5);   // установка ускорения (0.05 - 1.0). При значении 1 ускорение максимальное. 0 - отключено
    Serial.println("Установили " + (String)j + " серво");

  }
}
void loop()
{
for (int p = 0; p < numberOfServos; p++) {
   flag[p]=servo[p].tick();} // узнаем достигнули мы заданной позиции или нет
if (//сумма всех flag =12, т е все сервоприводы достигли нужного угла)
{
if (countStep<servoPrg03step-1) countStep+=1; //следующий шаг не должен превышать общее кол-во шагов
}
   stepServo(servoPrg02,countStep);
}

void stepServo(const int servoPrg[][numberOfACE],int step) //выполняем один шаг
{
  for (int p = 0; p < numberOfServos; p++) {
   servoPos[p]=servo[p].getCurrentDeg(); //узнаем текущее положение серво для диагностики
  }
  for (int p = 0; p < numberOfServos; p++) { // Loop for servo
     servo[p].setTargetDeg(servoPrg[step][p]+servoCal[p]);//устаналиваем новый угол складываем исходное значение угла +  разницу до целевого угла
    Serial.print(servoPos[p]);//смотрим текущуюу позицию сервопривода для анализа
   }
}
 
Изменено: