Невозможно управлять серводвигателем с помощью платы 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. Подключение правильное, поскольку светодиод и сервопривод работают нормально по отдельности. Проблема возникает только при запуске кода для обоих светодиодов и сервопривода.
Я не могу понять, в чём проблема. Любая помощь будет очень полезна. Спасибо
@rover cj, 👍0
Обсуждение1 ответ
Лучший ответ:
Проблема связана с тем, как 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
- Установка значения float до двух знаков после запятой
- ESP32-CAM первый: 0x8 TG1WDT_SYS_RESET загрузочный цикл
- ESP32 в Arduino-IDE с FS.h и SPIFFS
- esp32 Stack canary watchpoint срабатывает
- Проверка размера во флэш-памяти Esp32
- Программаторы для этой платы отсутствуют - Программирование ESP32 Cam с помощью Ardunio IDE
- Ошибка Cast from 'char*' to 'uint8_t {aka unsigned char}' loses precision [-fpermissive]
- Порт не распознается при работе с esp32 в arduino ide 2.2.1 (Windows 11 Home Edition)
пожалуйста, отредактируйте свой пост ... добавьте информацию об электрических соединениях, @jsotola