Невозможно управлять серводвигателем с помощью платы ESP32 при использовании RGB-светодиода.

Я новичок в использовании плат ESP32. По какой-то причине сервопривод не работает при использовании кода RGB-светодиодов. Я искал везде, но не нашёл решения. Буду благодарен за любую помощь. Вот код, который я использую:

#include <ESP32Servo.h>
#include "BluetoothSerial.h"

#define LEDC_CHANNEL_R 0
#define LEDC_CHANNEL_G 1
#define LEDC_CHANNEL_B 2
#define LEDC_TIMER 0
#define LEDC_BASE_FREQ 5000 // Частота в Гц
#define LEDC_RESOLUTION 8  // 8-битное разрешение (0-255)

const int redPin = 18;
const int greenPin = 19;
const int bluePin = 21;
Servo indexServo;
BluetoothSerial SerialBT; 

void setup() {
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  indexServo.attach(14,1000,2000);
  Serial.begin(115200);
  SerialBT.begin("ESP32_BT_Test");

  ledcAttachChannel(redPin, LEDC_BASE_FREQ, LEDC_RESOLUTION, LEDC_CHANNEL_R);
  ledcAttachChannel(greenPin, LEDC_BASE_FREQ, LEDC_RESOLUTION, LEDC_CHANNEL_G);
  ledcAttachChannel(bluePin, LEDC_BASE_FREQ, LEDC_RESOLUTION, LEDC_CHANNEL_B);
}

void loop() {
  indexServo.writeMicroseconds(1000);
  delay(1200);
  indexServo.writeMicroseconds(2000);
  delay(1200);
  ledcWrite(redPin, 255);  
  ledcWrite(greenPin, 0); 
  ledcWrite(bluePin, 0); 

  delay(50);
}

Если я закомментирую эти строки:

  /*ledcAttachChannel(redPin, LEDC_BASE_FREQ, LEDC_RESOLUTION, LEDC_CHANNEL_R);
  ledcAttachChannel(greenPin, LEDC_BASE_FREQ, LEDC_RESOLUTION, LEDC_CHANNEL_G);
  ledcAttachChannel(bluePin, LEDC_BASE_FREQ, LEDC_RESOLUTION, LEDC_CHANNEL_B);*/

  //ledcWrite(redPin, 255);  
  //ledcWrite(greenPin, 0); 
  //ledcWrite(bluePin, 0); 

Серводвигатель движется вперед и назад без каких-либо проблем. Я даже попробовал функцию analogWrite() для светодиода, и возникла та же проблема.

Сервопривод подключен к контакту 14 и питается от внешнего источника. Контакты RG&B светодиода подключены к контактам 18, 19 и 21. Подключение правильное, поскольку светодиод и сервопривод работают нормально по отдельности. Проблема возникает только при запуске кода для обоих светодиодов и сервопривода.

Я не могу понять, в чём проблема. Любая помощь будет очень полезна. Спасибо

, 👍0

Обсуждение

пожалуйста, отредактируйте свой пост ... добавьте информацию об электрических соединениях, @jsotola


1 ответ


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

0

Проблема связана с тем, как ESP32 обрабатывает каналы ШИМ. Вижу, что вы пытаетесь использовать один и тот же таймер/канал для библиотеки сервоприводов и ШИМ-управления светодиодами, что приводит к конфликту. Также рекомендую использовать определение выводов, в котором указаны выводы для светодиодов. Ключевым моментом является правильное управление таймером и каналами для системы ШИМ ESP32.

Попробуйте этот код:

#include <ESP32Servo.h>
#include "BluetoothSerial.h"

// Каналы ШИМ для RGB-светодиодов
#define LEDC_CHANNEL_R 1  // Изменено с 0, чтобы избежать конфликта
#define LEDC_CHANNEL_G 2
#define LEDC_CHANNEL_B 3
#define LEDC_TIMER 1      // Измененный таймер
#define LEDC_BASE_FREQ 5000
#define LEDC_RESOLUTION 8

// Определения контактов
const int redPin = 18;
const int greenPin = 19;
const int bluePin = 21;
const int servoPin = 14;

Servo indexServo;
BluetoothSerial SerialBT;

void setup() {
  Serial.begin(115200);
  SerialBT.begin("ESP32_BT_Test");
  
  // Настройка светодиодной ШИМ
  ledcAttachChannel(redPin, LEDC_BASE_FREQ, LEDC_RESOLUTION, LEDC_CHANNEL_R);
  ledcAttachChannel(greenPin, LEDC_BASE_FREQ, LEDC_RESOLUTION, LEDC_CHANNEL_G);
  ledcAttachChannel(bluePin, LEDC_BASE_FREQ, LEDC_RESOLUTION, LEDC_CHANNEL_B);
  
  // Настройка сервопривода
  ESP32PWM::allocateTimer(0); // Использовать таймер 0 для сервопривода
  indexServo.setPeriodHertz(50); // Стандартный сервопривод 50 Гц
  indexServo.attach(servoPin, 1000, 2000);
}

void loop() {
  // Сервопривод
  indexServo.writeMicroseconds(1000);
  delay(1200);
  indexServo.writeMicroseconds(2000);
  delay(1200);
  
  // управление светодиодами
  ledcWrite(redPin, 255);  // Красный
  ledcWrite(greenPin, 0);  // Зеленый
  ledcWrite(bluePin, 0);   // Синий
  
  delay(50);
}

Я изменил каналы светодиодов так, чтобы они начинались с 1 вместо 0 (сервопривод обычно использует канал 0), использовал другой таймер для ШИМ светодиодов и выделил таймер для сервопривода с помощью ESP32PWM::allocateTimer(0) (подробнее об этом можно прочитать здесь: https://madhephaestus.github.io/ESP32Servo/classESP32PWM.html)

Кроме того: я добавил правильную настройку частоты сервопривода с помощью setPeriodHertz(50) (не переусердствуйте). Если проблема всё ещё актуальна, возможно, дело в версии ESP-IDF.

,

Спасибо, это решение. Теперь всё работает как надо., @rover cj