Conhecimento

Controle de servomotor com Arduíno

Você sabe o que é um servomotor? Neste artigo vamos descobrir e também testar um, ver como ele se comporta e como controlá-lo. Um servo motor é um motor elétrico acoplado a um controle eletrônico, objetivando controlar de forma fina sua posição e velocidade. 


Existe no eixo do servomotor um encoder ou outro elemento de feedback cujo sinal varia conforme a velocidade e a posição do mesmo. Um sistema de controle embarcado então lê este sinal e compara à um sinal de posição ou velocidade desejada, enviado pelo usuário. A diferença entre estes sinais é o que o servomotor vai buscar corrigir.


Fonte: https://maquinaseletricasi.blogspot.com/2017/04/aula-20-servomotor.html


Na imagem acima podemos ver o comparador, responsável por diferenciar o sinal do sensor de posição do sinal de comando. Observe que é um sistema em malha fechada, possibilitando um controle bem preciso. Alguns servomotores comerciais tem uma resolução de fração de graus, algo muito fino.


Servo motor com Arduino


Um dos servomotores mais comuns para se utilizar com Arduino é o SG-90, aquele modelo azul semi-transparente com três fios, da imagem abaixo. 


Fonte: https://www.ryndackcomponentes.com.br/servomotor-9g-tower-pro-sg90-com-acessorios-1-6kg-cm.html 


Ele é facilmente encontrado no comércio e serve para pequenas automações, atendendo muito bem quando exigido. As informações sobre sua especificação são bem desencontradas na internet, alguns dizem que possui um ângulo de rotação de 150º, outros falam em 180º. Em termos de velocidade existem informações entre 0,1 e 0,12 segundos por 60º. Já em termos de força, encontra-se algo entre 1,2kgf e 1,6kgf. Fonte: https://www.friendlywire.com/projects/ne555-servo-safe/SG90-datasheet.pdf 


A forma de controle deste servomotor é por um sinal similar ao PWM, o importante é o tempo que o sinal fica em nível alto. Veja a tabela abaixo para compreender melhor: para girar até 135º deve-se ter um tempo em nível alto de 2ms (milissegundos).

Fonte: https://www.amazon.com.br/Smraza-Caminhada-Helic%C3%B3ptero-Controle-Projeto/dp/B07L2SF3R4?th=1

 

O código necessário é bem simples, existem bibliotecas prontas para tal. Caso você queira se aventurar, é possível criar sua própria função. Basta para isso gerar um sinal PWM e respeitar os tempos da tabela acima.

 

O código e testes

 

Pegue seu Arduino (no meu caso vou utilizar uma placas Wemos D1) e seu servomotor SG-90. Monte o circuito conforme indicado no diagrama esquemático abaixo. Veja que não é necessária nem uma fonte externa, podemos utilizar alimentação vinda do próprio Arduino. Isso não é verdade para montagens com mais servomotores, onde é indicada utilização de uma fonte externa.

Fonte: o autor

 

Abra o software IDE do Arduino e copie/cole o código abaixo. Não é necessária a instalação de nenhuma biblioteca, visto que o suporte à servomotor já vem com a IDE do Arduino. O exemplo se chama “sweep” e está disponível em “Arquivo > Exemplos > Servo > Sweep”.

// Programa: Controlando um servo motor com Arduino (servo motor arduino code)
 
#include  // Inclui a biblioteca Servo para controlar servos
 
Servo meuServo; // Cria um objeto Servo para controlar o servo motor
int pos; // Declara uma variável para controlar a posição do servo motor
 
void setup() {
    meuServo.attach(D1); // Associa o servo motor ao pino digital 6 do Arduino
    meuServo.write(0); // Define a posição inicial do servo motor para 0 graus
}
 
void loop() {
    // Movimento do servo de 0 a 180 graus
    for (pos = 0; pos < 180; pos++) {
        meuServo.write(pos); // Define a posição atual do servo
        delay(15); // Aguarda 15 milissegundos antes de mover para a próxima posição
    }
    delay(1000); // Aguarda 1 segundo antes de iniciar o próximo movimento
 
    // Movimento do servo de 180 a 0 graus
    for (pos = 180; pos >= 0; pos--) {
        meuServo.write(pos); // Define a posição atual do servo
        delay(15); // Aguarda 15 milissegundos antes de mover para a próxima posição
    }
    delay(1000); // Aguarda 1 segundo antes de iniciar o próximo ciclo
}

Inicialmente criamos um objeto “meuServo” do tipo “Servo”; aí fazemos “meuServo.attach(D1)” para indicar o pino D1 como controle do servomotor. Fazendo “meuServo.write(0)” levamos o motor para a posição zero. Então finalmente fazendo “meuServo.write(pos)” nós movemos o eixo para posições entre 0 e 180º. 


O objetivo do programa é ficar movendo o eixo entre 0 e 180º indefinidamente, executando uma passagem a cada 15ms (milissegundos) até completar o ciclo e reiniciar. Sugiro você alterar valores do código, como por exemplo os 15ms entre iterações ou os 180º, para ver como o servomotor vai se comportar.


Para finalizar deixo um vídeo com o teste do sketch acima, aproveite: https://youtube.com/shorts/2WZHPnwhRTw?feature=share

Autor


Avatar

Clovis Fritzen

Engenheiro eletricista e técnico em eletrônica, tem um interesse por sistemas embarcados (aos quais chama de "plaquinhas") e eletrônica desde muito cedo. Tem um blog em Inglês (FritzenLab.net) e outro em Português (FritzenLab.com.br), onde posta tutoriais e reviews das "plaquinhas".