Сервопривод ESP32 работает непрерывно

У меня есть ESP32, подключенный к TZT servo SG90. Это и есть код

#include <ESP32Servo.h>
#define TURN_TIME 175


Servo myservo;  // создать сервообъект для управления сервоприводом
// на ESP32 можно создать 16 сервообъектов

int pos = 0;    // переменная для сохранения положения сервопривода
// Рекомендуемые контакты PWM GPIO на ESP32 включают 2,4,12-19,21-23,25-27,32-33 
#define servoPin  17
#define MOTOR_1_PIN 22

void setup() {
  pinMode(servoPin, OUTPUT);  
  Serial.begin(9600);
    // Разрешить выделение всех таймеров
    ESP32PWM::allocateTimer(0);
    ESP32PWM::allocateTimer(1);
    ESP32PWM::allocateTimer(2);
    ESP32PWM::allocateTimer(3);
    myservo.setPeriodHertz(50);    // стандартный сервопривод 50 Гц
    // использование по умолчанию минимального / максимального значения 1000us и 2000us
    // для разных сервоприводов могут потребоваться разные минимальные/максимальные настройки
    // для точной развертки от 0 до 180
}

void loop() {


  myservo.attach(servoPin, 700, 2500); // присоединяет сервопривод на выводе 18 к объекту сервопривода
  myservo.write(0);
  delay(TURN_TIME);
  for(int i =0; i<180; i++)
  {
    myservo.write(i);
    delay(TURN_TIME);
  }
  delay(3000);
  for(int i =180; i>0; i--)
  {
    myservo.write(i);
    delay(TURN_TIME);
  }
  myservo.detach();
  delay(3000);
 
}

Мой сервопривод начинает вращаться в одну сторону и поворачивается на несколько градусов, затем через 5 секунд сервопривод начинает вращаться в одну сторону навсегда..

У меня не было никаких проблем с arduino и платой nodemcu. Что я должен изменить в коде?

РЕДАКТИРОВАТЬ: я подключил сервопривод к батарее, у них есть общие точки соприкосновения. Контакт на esp32, который я использую, - это G17. "#define servoPin 17" в коде

, 👍0

Обсуждение

Нет необходимости отсоединять сервопривод в петле. Просто прикрепите его в настройках и никогда не отсоединяйте. Отсоединение остановит сигнал ШИМ, но сервоприводу нужен непрерывный сигнал ШИМ, даже когда он неподвижен., @Sim Son

Без detach() результат тот же., @Simeon Simeonov

Я не ожидал, что это будет первопричиной... *вечно вращается в одну сторону* - это на самом деле сервопривод с регулируемым углом, который вы используете, и используете ли вы точно такое же аппаратное и программное обеспечение, как и на ардуино/узелMCU?, @Sim Son

Это сервопривод, который можно вращать на 360 градусов. Но когда я управляю им другим микроконтроллером, я могу управлять им только 0-180. Здесь у меня случайные ходы и в какой-то момент вращение до бесконечности.., @Simeon Simeonov

Можете ли вы выяснить, в какой момент вашего кода сервопривод ведет себя неожиданно?, @Sim Son


1 ответ


Лучший ответ:

0

Я использовал другую сервобиблиотеку, и это сработало.. Затем я изменил ширину импульса с помощью этой строки кода. Значение по умолчанию равно 1000-2000. Но он вращается только на 95 градусов. Когда он нажимается примерно на ~ 2850us, сервопривод поворачивается на 181-185 градусов. servo1.присоединить(servoPin,CHANNEL_NOT_ATTACHED, 0,180,544,2840/);

#include <Servo_ESP32.h>

static const int servoPin = 16; //напечатанный G14 на плате
int delayTime = 20;
Servo_ESP32 servo1;

int angle =0;
int angleStep = 5;

int angleMin =0;
int angleMax = 180;
#define CHANNEL_NOT_ATTACHED -1 
void setup() {
    Serial.begin(115200);
    servo1.attach(servoPin,CHANNEL_NOT_ATTACHED, 0,180,544,2840/);
    
}

void loop() {
    for(int angle = 0; angle <= angleMax; angle +=angleStep) {
        servo1.write(angle);
        Serial.println(angle);
        delay(delayTime);
    }

    for(int angle = 180; angle >= angleMin; angle -=angleStep) {
        servo1.write(angle);
        Serial.println(angle);
        delay(delayTime);
    }
}
,