Veremos como controlar o servo motor de hobby SG90 com ESP32, também a biblioteca e o conhecimento se aplicam à maioria dos servos pequenos. Um servo motor é um motor cujo controle é mais fino, usa um sistema de feedback para velocidade e posição.
Isso significa que você pode (como veremos) comandá-lo para parar e ficar em qualquer ângulo que desejar. Isso torna os servos muito especiais para obedecer ao controle fino de posição. Servos industriais, por exemplo, podem atingir posições de frações de graus.
O servo em questão neste artigo é o SG90, um modelo genérico (que pode ser comprado aqui, meu link de afiliado), cuja folha de dados está aqui. Ele é capaz de fazer uma rotação de 180 graus (90 graus para cada lado) e girar 60 graus em 120 milissegundos. Ele tem uma força de 1,8 kgf.cm.
O primeiro código que tentaremos deve ser instalado de dentro do Arduino IDE. Vá para “Sketch > Add library > Manage library” e digite “ESP32servo”. Instale o de Kevin Harrington; então abra o exemplo Sweep indo para “File > Examples > ESP32Servo > Sweep”. O código é replicado abaixo.
Observe que mudamos o número do pino de myservo.attach(9) para myservo.attach(D9) para o ESP32-C6. Ao testar, percebi que o pino D9 não estava funcionando, então mudei para o pino D3, como myservo.attach(D3).
Outro detalhe importante é o consumo de energia do servo. Esta fonte fala sobre 360mA em stall (corrente máxima, travado). Meu ESP32-C6 não consegue fornecer essa corrente sozinho, então usaremos uma fonte de alimentação externa de 5V. Então a placa de desenvolvimento do ESP32-C6 será alimentada por uma porta USB e o servo por outra porta USB.
O código
#include <ESP32Servo.h>
Servo myservo; // create servo object to control a servo
// 16 servo objects can be created on the ESP32
int pos = 0; // variable to store the servo position
// Recommended PWM GPIO pins on the ESP32 include 2,4,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
#if defined(CONFIG_IDF_TARGET_ESP32S2) || defined(CONFIG_IDF_TARGET_ESP32S3)
int servoPin = D3;
#elif defined(CONFIG_IDF_TARGET_ESP32C3)
int servoPin = D3;
#else
int servoPin = D3;
#endif
void setup() {
// Allow allocation of all timers
ESP32PWM::allocateTimer(0);
ESP32PWM::allocateTimer(1);
ESP32PWM::allocateTimer(2);
ESP32PWM::allocateTimer(3);
myservo.setPeriodHertz(50); // standard 50 hz servo
myservo.attach(servoPin, 1000, 2000); // attaches the servo on pin D3 to the servo object
// using default min/max of 1000us and 2000us
// different servos may require different min/max settings
// for an accurate 0 to 180 sweep
}
void loop() {
for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
// in steps of 1 degree
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
myservo.write(pos); // tell servo to go to position in variable 'pos'
delay(15); // waits 15ms for the servo to reach the position
}
}
Observe o cabo USB cinza na imagem, este alimenta o servo. O preto à esquerda alimenta e se comunica com o ESP32-C6.
O resultado do código
No vídeo abaixo é possível ver o servo fazendo 90 graus para cada lado, e depois repetindo. Ele é lento e isso é normal, já que seu controle não é tão rápido e sua mecânica é toda de plástico.
Pra finalizar
Controlar um servo com um ESP32-C6 no ambiente Arduino é super fácil e direto. Você pode usar sua criatividade para criar mais exemplos, além do que foi mostrado aqui.
Quer saber mais sobre aplicações do ESP32-C6? confira este artigo. Além disso, se você quiser comprar um dos servos estudados neste artigo, use meu link de afiliado.
Deixe um comentário