1

Topic: Проблема с сервоприводом MG945 ESP32

//////////////////////////////////////////////
//        RemoteXY include library          //
//////////////////////////////////////////////
volatile bool buttonPressed = false;

// определение режима соединения и подключение библиотеки RemoteXY
#define REMOTEXY_MODE__WIFI_POINT

#include <WiFi.h>
#include <ESP32Servo.h>

Servo myservo;

// настройки соединения
#define REMOTEXY_WIFI_SSID "HummerBot1"
#define REMOTEXY_WIFI_PASSWORD "HummerBot1"
#define REMOTEXY_SERVER_PORT 6377


#include <RemoteXY.h>

// конфигурация интерфейса RemoteXY
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =  // 45 bytes
  { 255, 3, 0, 0, 0, 38, 0, 17, 0, 0, 0, 31, 1, 200, 84, 1, 1, 2, 0, 5,
    19, 10, 60, 60, 32, 16, 28, 31, 1, 140, 27, 24, 24, 1, 16, 1, 208, 163, 208, 180,
    208, 176, 209, 128, 0 };

// структура определяет все переменные и события вашего интерфейса управления
struct {

  // input variables
  int8_t stick_x;  // oт -100 до 100
  int8_t stick_y;  // oт -100 до 100
  uint8_t hummer;  // =1 если кнопка нажата, иначе =0

  // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0

} RemoteXY;
#pragma pack(pop)

/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////
#define LED 27
#define BTN 23
int servoPin = 18;
int ADC_Max = 4096;

/* определяем пины управления правым мотором */
#define RIGHT_UP 32
#define RIGHT_DN 33
#define PIN_MOTOR_RIGHT_SPEED 10

/* определяем пины управления левым мотором */
#define LEFT_UP 26
#define LEFT_DN 25
#define PIN_MOTOR_LEFT_SPEED 10

/* определяем два массива с перечислением пинов для каждого мотора */
unsigned char RightMotor[3] = { RIGHT_UP, RIGHT_DN, PIN_MOTOR_RIGHT_SPEED };
unsigned char LeftMotor[3] = { LEFT_UP, LEFT_DN, PIN_MOTOR_LEFT_SPEED };

/*
   управление скоростью мотора
   motor - ссылка на массив пинов
   v - скорость мотора, может принимать значения от -100 до 100
*/
void Wheel(unsigned char* motor, int v) {
  if (v > 100) v = 100;
  if (v < -100) v = -100;
  if (v > 0) {
    digitalWrite(motor[0], HIGH);
    digitalWrite(motor[1], LOW);
    analogWrite(motor[2], v * 2.55);
  } else if (v < 0) {
    digitalWrite(motor[0], LOW);
    digitalWrite(motor[1], HIGH);
    analogWrite(motor[2], (-v) * 2.55);
  } else {
    digitalWrite(motor[0], LOW);
    digitalWrite(motor[1], LOW);
    analogWrite(motor[2], 0);
  }
}

void setup() {
  Serial.begin(115200);

        ESP32PWM::allocateTimer(0);
        ESP32PWM::allocateTimer(1);
    ESP32PWM::allocateTimer(2);
    ESP32PWM::allocateTimer(3);
  myservo.setPeriodHertz(50);// Standard 50hz servo
  myservo.attach(servoPin, 1000, 2000); //MG945

  /* инициализация пинов */
  pinMode(RIGHT_UP, OUTPUT);
  pinMode(RIGHT_DN, OUTPUT);
  pinMode(LEFT_UP, OUTPUT);
  pinMode(LEFT_DN, OUTPUT);
  pinMode(BTN, INPUT_PULLUP);
  pinMode(LED, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(BTN), handleButtonPress, CHANGE);

  /* инициализация модуля RemoteXY */
  RemoteXY_Init();
}

void loop() {
  /* обработчик событий модуля RemoteXY */
  RemoteXY_Handler();

  if(RemoteXY.hummer == 1){
    Serial.println("Серво запускается...");
    myservo.write(0);
    RemoteXY_delay(1000);
    Serial.println("Серво Выключается...");
    myservo.write(180);
    RemoteXY_delay(1000);
  }

  if (buttonPressed) {
    digitalWrite(LED, HIGH);
    RemoteXY_delay(5000);
    digitalWrite(LED, LOW);
    buttonPressed = false;
  }
 
  Wheel(RightMotor, RemoteXY.stick_y - RemoteXY.stick_x);
  Wheel(LeftMotor, RemoteXY.stick_y + RemoteXY.stick_x);
}

void handleButtonPress() {
  buttonPressed = true;  // Устанавливаем флаг нажатия кнопки в true
}







Моторы двигаются а сервопривод нет.
Я загружаю нажимаю на кнопку serial принт выводит что серва вкл после выкл но при этом никаких действий что делать помогите второй день решаю??

2

Re: Проблема с сервоприводом MG945 ESP32

Судя по коду все в порядке.
1. Если вы подаете сигнал управления напрямую на сервопривод, то возможно сервопривод не может работать с логикой 3.3 В.
2. Если у вас такой большой сервопривод подключен к питанию 5В от платы контроллера то это работать не будет. Сервопривод потребляет достаточно большой ток что бы сбрасывать контроллер при попытке движения. Для этого сервопривода желательно отдельный источник питания.

Проверьте как работает сервопривод на каком либо простом примере только для сервопривода, без RemoteXY. Возможно что то напутали с выбором пина. Либо не туда подключили либо этот пин не поддерживается библиотекой Servo.

3

Re: Проблема с сервоприводом MG945 ESP32

Запитан сервопривод от аккумуляторов 18650(2шт). Сигнал да напрямую от esp32. Без RemoteXY все работает штатно.


// Include the ESP32 Arduino Servo Library instead of the original Arduino Servo Library
#include <ESP32Servo.h>

Servo myservo;  // create servo object to control a servo

// Possible PWM GPIO pins on the ESP32: 0(used by on-board button),2,4,5(used by on-board LED),12-19,21-23,25-27,32-33
// Possible PWM GPIO pins on the ESP32-S2: 0(used by on-board button),1-17,18(used by on-board LED),19-21,26,33-42
// Possible PWM GPIO pins on the ESP32-S3: 0(used by on-board button),1-21,35-45,47,48(used by on-board LED)
// Possible PWM GPIO pins on the ESP32-C3: 0(used by on-board button),1-7,8(used by on-board LED),9-10,18-21
int servoPin = 18;  // GPIO pin used to connect the servo control (digital out)

int ADC_Max = 4096;  // This is the default ADC max value on the ESP32 (12 bit ADC width);
                     // this width can be set (in low-level oode) from 9-12 bits, for a
                     // a range of max values of 512-4096
#define BTN 23
void setup() {
  // Allow allocation of all timers
  ESP32PWM::allocateTimer(0);
  ESP32PWM::allocateTimer(1);
  ESP32PWM::allocateTimer(2);
  ESP32PWM::allocateTimer(3);
  myservo.setPeriodHertz(50);
  myservo.attach(servoPin, 300, 2600);
  Serial.begin(115200);
}

void loop() {
    Serial.println("Серво запускается...");
    myservo.write(0);   // set the servo position according to the scaled value
    delay(2000);         // wait for the servo to get there
    Serial.println("Серво выключается...");
    myservo.write(180);  // set the servo position according to the scaled value
    delay(2000);
}



Вот с этой программой все работает.

4

Re: Проблема с сервоприводом MG945 ESP32

Возможно вы добавили в код какую то вещь которая конфликтует с библиотекой Servo.
Вижу что в коде RemoteXY у вас есть следующая строка в функции Setup. Возможно есть какой либо конфликт по прерываниям.

 attachInterrupt(digitalPinToInterrupt(BTN), handleButtonPress, CHANGE);

Ну и попробуйте убрать все лишнее что не относится к серве:

//////////////////////////////////////////////
//        RemoteXY include library          //
//////////////////////////////////////////////

// определение режима соединения и подключение библиотеки RemoteXY
#define REMOTEXY_MODE__WIFI_POINT

#include <WiFi.h>
#include <ESP32Servo.h>

Servo myservo;

// настройки соединения
#define REMOTEXY_WIFI_SSID "HummerBot1"
#define REMOTEXY_WIFI_PASSWORD "HummerBot1"
#define REMOTEXY_SERVER_PORT 6377


#include <RemoteXY.h>

// конфигурация интерфейса RemoteXY
#pragma pack(push, 1)
uint8_t RemoteXY_CONF[] =  // 45 bytes
  { 255, 3, 0, 0, 0, 38, 0, 17, 0, 0, 0, 31, 1, 200, 84, 1, 1, 2, 0, 5,
    19, 10, 60, 60, 32, 16, 28, 31, 1, 140, 27, 24, 24, 1, 16, 1, 208, 163, 208, 180,
    208, 176, 209, 128, 0 };

// структура определяет все переменные и события вашего интерфейса управления
struct {

  // input variables
  int8_t stick_x;  // oт -100 до 100
  int8_t stick_y;  // oт -100 до 100
  uint8_t hummer;  // =1 если кнопка нажата, иначе =0

  // other variable
  uint8_t connect_flag;  // =1 if wire connected, else =0

} RemoteXY;
#pragma pack(pop)

/////////////////////////////////////////////
//           END RemoteXY include          //
/////////////////////////////////////////////

int servoPin = 18;

void setup() {
  Serial.begin(115200);

  myservo.setPeriodHertz(50);// Standard 50hz servo
  myservo.attach(servoPin, 1000, 2000); //MG945

  RemoteXY_Init();
}

void loop() {
  /* обработчик событий модуля RemoteXY */
  RemoteXY_Handler();

  if(RemoteXY.hummer == 1){
    Serial.println("Серво запускается...");
    myservo.write(0);
    RemoteXY_delay(1000);
    Serial.println("Серво Выключается...");
    myservo.write(180);
    RemoteXY_delay(1000);
  }

}