Код для поиска

ESP32 Урок 17/55 - Управление серводвигателем с помощью ESP32 и потенциометра - Обучающий набор ESP32 для Интернета вещей

ESP32 Урок 17/55 - Управление серводвигателем с помощью ESP32 и потенциометра - Обучающий набор ESP32 для Интернета вещей

В этом руководстве мы научимся управлять сервоприводом с помощью микроконтроллера ESP32 и потенциометра из набора ESP32 IoT Learning kit от SunFounder. К концу этого проекта вы сможете плавно регулировать угол поворота сервопривода с помощью потенциометра, что обеспечит точное управление. Это отличный способ изучить возможности ESP32 и то, как он взаимодействует с двигателями.

Углубляясь в детали, мы рассмотрим необходимые аппаратные компоненты, инструкции по подключению и примеры кода, чтобы всё заработало. Для более наглядного представления обязательно посмотрите видео, связанное с этим руководством (в видео на 0:30).

Объяснение аппаратной части

Основными компонентами этого проекта являются микроконтроллер ESP32, сервопривод (SG90) и потенциометр. ESP32 — это мощный микроконтроллер со встроенными Wi-Fi и Bluetooth, что делает его подходящим для проектов IoT. Он способен управлять различными устройствами, включая двигатели, с высокой точностью.

Сервопривод SG90 — широко используемый компонент, который может поворачиваться примерно на 270 градусов. Он работает на основе сигнала широтно-импульсной модуляции (ШИМ), где угол поворота определяется шириной импульса, отправляемого на него. Потенциометр действует как переменный резистор, позволяя регулировать напряжение, подаваемое на ESP32, которое, в свою очередь, управляет положением сервопривода.

Данные из технического описания

Производитель SG
Номер детали SG90
Логическое/IO напряжение 3,3 В (ESP32)
Напряжение питания 5 В
Выходной ток (на канал) 1,2 А
Пиковый ток (на канал) 2,5 А
Рекомендуемая частота ШИМ 50 Гц
Пороги входной логики 0,2 В (низкий), 2,5 В (высокий)
Падение напряжения / RDS(on) / насыщение 0,5 В
Тепловые пределы Макс. 85 °C
Корпус Пластиковый
Примечания / варианты Доступен с разными типами шестерен

 

  • Убедитесь, что сервопривод питается от подходящего напряжения (5 В).
  • Подключите землю сервопривода к земле ESP32 для общего опорного потенциала.
  • Используйте соответствующие ШИМ-сигналы для управления положением сервопривода.
  • Учитывайте требования сервопривода по току; при необходимости используйте внешний источник питания.
  • Проверьте правильность назначения контактов при подключении, чтобы избежать ошибок конфигурации.

Инструкции по подключению

ESP32-17-Sevo_motor-wiring

Чтобы подключить сервопривод и потенциометр к ESP32, начните с соединения провода заземления сервопривода (обычно чёрного или коричневого) с одним из контактов заземления на ESP32. Затем подключите провод питания сервопривода (обычно красный) к контакту 5 В на ESP32. Наконец, подключите сигнальный провод (обычно оранжевый или белый) от сервопривода к контакту 25 на ESP32.

Для потенциометра подключите один крайний контакт к контакту 3,3 В на ESP32, а другой крайний контакт — к земле. Средний контакт потенциометра должен быть подключён к контакту 34 на ESP32. Эта схема позволяет ESP32 считывать изменяющееся выходное напряжение потенциометра, которое будет использоваться для управления положением сервопривода.

Примеры кода и пояснения

Следующий фрагмент кода инициализирует сервопривод и задаёт параметры для управления его движением:

#include 

Servo myServo;
const int servoPin = 25;
const int minPulseWidth = 500; // 0,5 мс
const int maxPulseWidth = 2500; // 2,5 мс

void setup() {
  myServo.attach(servoPin, minPulseWidth, maxPulseWidth);
  myServo.setPeriodHertz(50); // Стандартный сервопривод 50 Гц
}

В этом коде мы включаем библиотеку ESP32Servo и создаём экземпляр сервопривода с именем myServo. Мы определяем номер контакта для сервопривода и задаём минимальную и максимальную ширину импульсов, которые соответствуют пределам угла поворота сервопривода.

ESP32_servo_lib

Далее рассмотрим цикл, который непрерывно перемещает сервопривод вперёд и назад:

void loop() {
  for (int angle = 0; angle <= 180; angle++) {
    int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
    myServo.writeMicroseconds(pulseWidth);
    delay(15);
  }
  for (int angle = 180; angle >= 0; angle--) {
    int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
    myServo.writeMicroseconds(pulseWidth);
    delay(15);
  }
}

Этот цикл постепенно изменяет угол от 0 до 180 градусов и обратно, используя функцию map для преобразования угла в соответствующую ширину импульса для сервопривода. Каждое изменение сопровождается короткой задержкой, чтобы сервопривод плавно достиг нового положения.

Демонстрация / Что ожидать

После того как всё будет подключено и код загружен, вы должны увидеть, как сервопривод плавно движется от 0 до 180 градусов и обратно. Если вы повернёте потенциометр, сервопривод должен отразить новое положение в зависимости от напряжения, подаваемого потенциометром. Будьте осторожны с переполюсовкой при подключении, так как это может повредить компоненты (в видео на 3:45).

Временные метки видео

  • 00:00 Начало
  • 1:56 Что такое сервопривод
  • 5:00 Страница документации
  • 6:33 Подключение сервопривода объяснено
  • 7:45 Выбор COM-порта для ESP32 в Arduino IDE
  • 9:27 Объяснение кода Arduino
  • 14:31 Демонстрация управления сервоприводом с помощью ESP32
  • 16:04 Питание сервопривода не от 5 В
  • 18:47 Управление сервоприводом без цикла
  • 20:15 Управление сервоприводом с помощью потенциометра
  • 21:37 Объяснение кода Arduino для сервопривода с потенциометром

Изображения

ESP32-17-Sevo_motor-schematic
ESP32-17-Sevo_motor-schematic
ESP32-17-Sevo_motor-wiring
ESP32-17-Sevo_motor-wiring
ESP32_servo_lib
ESP32_servo_lib
816-ESP32 Tutorial 17/55- Arduino code for controling servo motor
Язык: C++
#include <ESP32Servo.h>

 // Определите сервопривод и контакт, к которому он подключен.
Servo myServo;
const int servoPin = 25;

 // Определите минимальную и максимальную ширину импульса для серво.
const int minPulseWidth = 500; // 0,5 мс
const int maxPulseWidth = 2500; // 2.5 мс

void setup() {
 // Прикрепите сервопривод к указанному контакту и установите диапазон ширины его импульса.
  myServo.attach(servoPin, minPulseWidth, maxPulseWidth);

 // Установите частоту ШИМ для сервопривода.
  myServo.setPeriodHertz(50); // Стандартный серводвигатель 50Гц
}

void loop() {
 // Поверните сервопривод от 0 до 180 градусов.
  for (int angle = 0; angle <= 180; angle++) {
    int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
    myServo.writeMicroseconds(pulseWidth);
    delay(15);
  }

 // Поверните серво с 180 до 0 градусов.
  for (int angle = 180; angle >= 0; angle--) {
    int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
    myServo.writeMicroseconds(pulseWidth);
    delay(15);
  }
}

Ресурсы и ссылки

Файлы📁

Технический паспорт (pdf)

Другие файлы