Tutorial ESP32 17/55 - Controlando o Motor Servo usando ESP32 e Potenciômetro - Kit de Aprendizado IoT ESP32
Neste tutorial, vamos aprender como controlar um servo motor usando um microcontrolador ESP32 e um potenciômetro do kit de aprendizado IoT ESP32 da SunFounder. Ao final deste projeto, você será capaz de ajustar o ângulo do servo motor suavemente usando o potenciômetro, permitindo um controle preciso. Esta é uma ótima maneira de explorar as capacidades do ESP32 e como ele se conecta a motores.

À medida que mergulhamos nos detalhes, abordaremos os componentes de hardware necessários, as instruções de fiação e exemplos de código para colocar tudo em funcionamento. Para uma representação mais visual, não deixe de conferir o vídeo associado a este tutorial (no vídeo em 0:30).
Hardware Explicado
Os componentes principais para este projeto incluem o microcontrolador ESP32, um motor de passo (SG90) e um potenciômetro. O ESP32 é um microcontrolador poderoso que oferece Wi-Fi e Bluetooth integrados, tornando-o adequado para projetos de IoT. Ele é capaz de controlar vários dispositivos, incluindo motores, com alta precisão.
O motor servo SG90 é um componente amplamente utilizado que pode girar aproximadamente 270 graus. Ele opera com um sinal de modulação por largura de pulso (PWM), onde o ângulo de rotação é determinado pela largura do pulso enviado a ele. O potenciômetro atua como um resistor variável, permitindo ajustar a voltagem enviada ao ESP32, que por sua vez controla a posição do servo.
Detalhes da Ficha Técnica
| Fabricante | SG |
|---|---|
| Número da peça | SG90 |
| Tensão de lógica/IO | 3,3 V (ESP32) |
| Tensão de alimentação | 5 V |
| Corrente de saída (por canal) | 1.2 A |
| Corrente de pico (por canal) | 2,5 A |
| Orientação sobre a frequência de PWM | 50 Hz |
| Limiares lógicos de entrada | 0,2 V (baixo), 2,5 V (alto) |
| Queda de tensão / RDS(on)/ saturação | 0,5 V |
| Limites térmicos | 85 °C máx |
| Pacote | Plástico |
| Notas / variantes | Disponível em diferentes tipos de equipamentos |
- Certifique-se de que o servo esteja alimentado com uma tensão adequada (5V).
- Conecte o terra do servo ao terra do ESP32 para uma referência comum.
- Use sinais PWM apropriados para controlar a posição do servomotor.
- Esteja ciente dos requisitos de corrente do servo; use uma fonte de alimentação externa, se necessário.
- Verifique as designações de pinos corretas ao fazer a fiação para evitar reconfigurações incorretas.
Instruções de Fiação

Para conectar o motor servo e o potenciômetro ao ESP32, comece ligando o fio de terra do servo (geralmente preto ou marrom) a um dos pinos de terra no ESP32. Em seguida, conecte o fio de potência (geralmente vermelho) do servo ao pino de 5V no ESP32. Por fim, conecte o fio de sinal (geralmente laranja ou branco) do servo ao pino25no ESP32.
Para o potenciômetro, conecte uma das extremidades ao pino de 3.3V no ESP32 e a outra extremidade ao terra. O pino do meio do potenciômetro deve ser conectado ao pino34no ESP32. Esta configuração permite que o ESP32 leia a saída de tensão variável do potenciômetro, que será usada para controlar a posição do servo.
Exemplos de Código e Passo a Passo
O seguinte trecho de código inicializa o servomotor e define os parâmetros para controlar seu movimento:
#include
Servo myServo;
const int servoPin = 25;
const int minPulseWidth = 500; // 0.5 ms
const int maxPulseWidth = 2500; // 2.5 ms
void setup() {
myServo.attach(servoPin, minPulseWidth, maxPulseWidth);
myServo.setPeriodHertz(50); // Standard 50Hz servo
}
Neste código, incluímos oESP32Servobiblioteca e crie uma instância do servo com o nomemyServoDefinimos o número do pino para o servo e configuramos as larguras de pulso mínima e máxima que correspondem aos limites de ângulo do servo.
Em seguida, vamos dar uma olhada no loop que move continuamente o servo para frente e para trás:
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);
}
}
Este loop altera gradualmente o ângulo de 0 a 180 graus e de volta.mapfunção para converter o ângulo na largura de pulso correspondente para o servomotor. Cada alteração é seguida por um curto atraso para permitir que o servomotor atinja sua nova posição suavemente.
Demonstração / O que Esperar
Uma vez que tudo esteja conectado e o código esteja carregado, você deve ver o motor de servo se movendo suavemente de 0 a 180 graus e de volta. Se você ajustar o potenciômetro, o servo deve refletir a nova posição com base na voltagem fornecida pelo potenciômetro. Tenha cuidado com a polaridade invertida ao conectar, pois isso pode danificar seus componentes (no vídeo às 3:45).
Marcação de Tempo do Vídeo
- 00:00 Início
- 1:56 O que é um motor servo
- 5:00 Página de documentos
- 6:33 Fiação para servo explicada
- 7:45 Selecionando a porta COMP para ESP32 no Arduino IDE
- 9:27 Código Arduino explicado
- 14:31 Demonstração de controle de servos utilizando ESP32
- 16:04 Alimentando servo diferente de 5V
- 18:47 Controlando o servo sem o loop
- 20:15 Controlando Servo com Potenciômetro
- 21:37 Servo com código Arduino explicado
#include <ESP32Servo.h>
// Defina o servo e o pino ao qual está conectado
Servo myServo;
const int servoPin = 25;
// Defina as larguras de pulso mínima e máxima para o servo.
const int minPulseWidth = 500; // 0,5 ms
const int maxPulseWidth = 2500; // 2,5 ms
void setup() {
// Anexe o servo ao pino especificado e defina sua faixa de largura de pulso.
myServo.attach(servoPin, minPulseWidth, maxPulseWidth);
// Defina a frequência PWM para o servo
myServo.setPeriodHertz(50); // Servo padrão de 50Hz
}
void loop() {
// Gire o servo de 0 a 180 graus
for (int angle = 0; angle <= 180; angle++) {
int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
delay(15);
}
// Gire o servo de 180 a 0 graus.
for (int angle = 180; angle >= 0; angle--) {
int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth);
myServo.writeMicroseconds(pulseWidth);
delay(15);
}
}
Common Course Links
Common Course Files
Recursos e referências
-
DocumentaçãoTutorial ESP32 17/55 - Documentação do motorservo SunFunderdocs.sunfounder.com
Arquivos📁
Folha de dados (pdf)
-
Folha de dados do motor servo DS5160
DS5160_datasheet.pdf0.33 MB
Outros arquivos
-
Baixar a ficha técnica do SG90 (PDF)
robojax-servo-sg90_datasheet.pdf