ÍNDICE DE CONTEÚDO
- Franzininho WiFi: Display 7 Segmentos TM1637
- Franzininho WiFi: Primeiros passos na Arduino IDE
- Franzininho WiFi: Explorando as GPIOs com Arduino
- Franzininho WiFi: Leitura de entradas analógicas com Arduino
- Franzininho WiFi: PWM (Pulse Width Modulation) com Arduino
- Franzininho WiFi: Comunicação Serial (UART) com Arduino
- Franzininho WiFi: Servo Motor com Arduino
- Franzininho WiFi: Web Server
- Franzininho WiFi: Display OLED
- Franzininho WiFi: Sensor de temperatura e umidade DHT22
- Franzininho WiFi: Sensor de temperatura DS18B20
- Franzininho WiFi: Display LCD 16×2 com comunicação I2C
Introdução ao servo motor
O Servo Motor é um equipamento eletromecânico controlável por comandos gerados por um sinal PWM (Pulse Width Modulation). Internamente ao servo, há um encoder junto a um controlador responsáveis por interpretar e executar a movimentação de acordo com a posição e velocidade pretendida. Esse atuador possui modelos com eixo de 180° e outros modelos de 360°. A rotação do eixo varia entre 0 e o valor máximo (180° ou 360°). Caso esse limite seja ultrapassado por um esforço mecânico, pode danificar as engrenagens e acabar inutilizando o mesmo.
Os servos são compostos por três componentes: atuador, encoder e controlador. O atuador é um conjunto de engrenagens (plásticas ou metálicas) responsável por fornecer o torque e velocidade necessários. O encoder tem a função de identificar a posição do servo, geralmente com um minúsculo potenciômetro interno, onde cada valor da resistência elétrica é associado a diferentes posições do eixo do motor. O controlador é responsável por ler o sinal PWM e, através de uma malha fechada (realimentação e comparação), corrigir a posição e executar a movimentação.
O servo motor é um atuador fundamental em projetos de robótica, automação e controle. Ao final deste artigo, você estará apto a desenvolver mecanismos utilizando servos e dar vida às suas criações com a Franzininho WiFi.
Biblioteca ESP32Servo para controle do Servo motor com a Franzininho WiFi
Nesta sessão vamos apresentar os métodos mais comuns utilizados pela biblioteca ESP32Servo, derivada da biblioteca Servo, comumente utilizada em projeto com Arduino, permanecendo os mesmos métodos e exemplos de projetos (Knob e Sweep).
Embarcados Experience 2024: Evento Presencial
Participe do Embarcados Experience 2024 em São Paulo. Conhecimento técnico, palestras, workshops e oportunidade de networking com profissionais experientes.
attach()
Seleciona a GPIO para o motor servo. Para selecionar o pino é importante lembrar que a GPIO deve ter suporte para gerar o sinal PWM. Devido a sobrecarga do método temos duas opções de configurar, segue abaixo:
1 |
uint8_t attach(int pin); |
- pin : pino para o motor servo
1 |
uint8_t attach(int pin,int min,int max); |
- pin : pino para o motor servo
- min : configura o valor mínimo para rotação (valor em microsegundos)
- max : configura o valor máximo para rotação (valor em microsegundos)
Retorna o número do canal ou INVALID_SERVO caso não registrou a GPIO
write()
Seleciona o valor em graus do servo.
1 |
void write(int value); |
- value : valor do ângulo desejado
writeMicroseconds()
Seleciona o valor em milissegundos do comprimento dos pulso do sinal modulador (PWM).
1 |
void writeMicroseconds(int value); |
- value : valor em milissegundos
read()
Pega o último escrito para comprimento do pulso.
1 |
int read(void); |
Retorna o valor em graus da posição atual do servo.(0 – 180).
readMicroseconds()
Pega o último escrito para comprimento do pulso.
1 |
int readMicroseconds(void); |
Retorna o valor em microsegundos da posição atual do servo.
attached()
Verifica se a GPIO foi configurada.
1 |
bool attached(void); |
Retorna true se o servo foi configurado caso contrário false
detach()
Para de utilizar a GPIO configura para o servo
1 |
bool detach(void); |
Materiais necessários
Para desenvolver nossa aplicação os materiais utilizados foram:
- Placa Franzininho WiFi
- Servo Motor 9g
- Potenciômetro
- Jumpers (Opcional)
- Arduino IDE
Circuito para controle do Servo motor com a Franzininho WiFi
No circuito proposto utilizamos o motor servo 9g (GPIO 18) conectado ao 5V da placa Franzininho, abaixo segue uma imagem do circuito.
Código
O projeto proposto utilizou a comunicação serial para receber pelo Monitor Serial os valores de ângulos que o motor servo vai executar. Nesse projeto é necessário adicionar a biblioteca ESP32Servo.h, para isso acesse Ferramentas -> Gerenciador de Biblioteca (Tools -> Library Manager ), digite no campo de texto o nome da biblioteca, instale e já está pronta para utilizar.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
/* Autor: Equipe Embarcados */ // Incluir biblioteca #include <ESP32Servo.h> // Declarar as variáveis String cmd; int current_angle; int angle; //Declarar o construtor Servo servo; //Definir o pino do servo const int servo_pin = 18; void setup() { // Inicializa o canal serial e o baud rate Serial.begin(115200); // Configura a GPIO e os limites mínimos e máximos em milisegundos servo.attach(servo_pin,500, 2400); // Move o eixo para o ângulo 0 servo.write(0); // Aguarda 1 segundo delay(1000); // Imprime na serial Serial.println("Iniciando Projeto com Motor Servo"); Serial.println(" Insira o angulo: "); } void loop() { // Caso receba algum dado na Serial, então ... if(Serial.available()>0) { // Ler todo o buffer da serial antes de chegar no \n( carácter fim de linha) cmd = Serial.readStringUntil('\n'); // Realizar um cast de String para um valor inteiro angle = atoi(cmd.c_str()); // Imprimir um carácter "">>" Serial.print(">> "); // Se o ângulo for maior que 0 e menor que 180, então ... if(angle >=0 && angle <=180) { // Imprime o valor do ângulo na tela Serial.println(angle); // Move o eixo do motor para o ângulo desejado servo.write(angle); } // Caso não seja um valor dentro dos limites então... else { // Imprime na saída do monitor serial Serial.println ("Valor inválido"); } } } |
Simule esse exemplo no Wokwi: https://wokwi.com/projects/363626452192856065
Explicação do Código
Nesta seção explicaremos cada trecho do código a fim de esclarecer como nosso programa funciona.
Inclusão da biblioteca ES32Servo.h
1 2 |
// Incluir bibiloteca #include <ESP32Servo.h> |
Declaração das variáveis, para receber os comandos da serial (cmd) e o valor do ângulo desejado (angle).
1 2 3 |
// Declarar as váriaveis String cmd; int angle; |
Cria o objeto do tipo servo:
1 2 |
//Declarar o construtor Servo servo; |
Declara o pino onde está conectado o motor servo:
1 2 |
//Definir o pino do servo const int servo_pin = 18; |
No setup(), temos a inicialização da comunicação serial e a seleção da velocidade de comunicação. Configuramos o pino que está conectado ao motor servo no método attach com os valores máximo e mínimo o quais são padrões. E por fim imprimimos uma mensagem para o usuário inserir os valores dos ângulos:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
void setup() { // Inicializa o canal serial e o baud rate Serial.begin(115200); // Configura a GPIO e os limites mínimos e máximos em milisegundos servo.attach(servo_pin,500, 2400); // Move o eixo para o ângulo 0 servo.write(0); // Aguarda 1 segundo delay(1000); // Imprime na serial Serial.println("Iniciando Projeto com Motor Servo"); Serial.println(" Insira o angulo: "); } |
No loop, construímos nossa lógica propriamente dita para receber os comandos da Serial e realizar a execução dos movimentos no motor servo. Dentre os métodos apresentada nesse exemplo de projeto, o que pode ser que não esteja familiarizado é o readStringUntil(), bem esse método apenas pega todos os caracteres que entraram Serial e devolver até último caractere antes do ‘\n’ (fim de linha):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
void loop() { // Caso receba algum dado na Serial, então ... if(Serial.available()>0) { // Ler todo o buffer da serial antes de chegar no \n( carácter fim de linha) cmd = Serial.readStringUntil('\n'); // Realizar um cast de String para um valor inteiro angle = atoi(cmd.c_str()); // Imprimir um carácter "">>" Serial.print(">> "); // Se o ângulo for maior que 0 e menor que 180, então ... if(angle >=0 && angle <=180) { // Imprime o valor do ângulo na tela Serial.println(angle); // Move o eixo do motor para o ângulo desejado servo.write(angle); } // Caso não seja um valor dentro dos limites então... else { // Imprime na saída do monitor serial Serial.println ("Valor inválido"); } } } |
Conclusão
Nesse artigo abordamos sobre o motor servo e os métodos da biblioteca (ESP32Servo), esse atuador possui elevada precisão e é muito simples de realizar sua montagem no circuito. Devido a sua popularidade esse motor atende a uma vasta quantidade de aplicações: robótica, aeromodelismo, automação, Controle Eletromecânicos e diversas outras áreas. No exemplo de projeto apresentamos uma das possíveis formas de criar uma interface Serial para o controle de servos, mas encorajamos a procurar outros projetos para explorar mais esse atuador.
Saiba mais
Franzininho WiFi: PWM (Pulse Width Modulation) com Arduino
Franzininho WiFi: PWM com CircuitPython