O que é Servomotor? Controlando um Servo com Arduino
Nesse tutorial aprenderemos o que é um servomotor e como controla-lo usando um Arduino, mais especificamente o Arduino Uno, usando a biblioteca nativa da IDE Arduino Servo.h. Para esse tutorial usaremos o Micro Servo motor SG90.
[toc]
O que é um Servomotor e como funciona?
Entre os atuadores temos um motor bem especial. Os servomotores, também chamados de servos, são muito utilizados quando o assunto é robótica. De forma simplificada, um servomotor é um motor na qual podemos controlar sua posição angular através de um sinal PWM.
Dessa forma, um servomotor é um atuador eletromecânico utilizado para posicionar e manter um objeto em uma determinada posição. Para isso, ele conta com um circuito que verifica o sinal de entrada e compara com a posição atual do eixo.
Como você pode ver na figura anterior, o ângulo do servomotor é proporcional ao Duty Cycle (tempo que o sinal é positivo) do sinal PWM.
Diferentemente dos motores de corrente continua ou motores de passo que podem girar indefinidamente, o eixo de um servo possui a liberdade de apenas 180º. Existem ainda alguns servos que são adaptados para girar indefinidamente, mas não entraremos nesse mérito aqui.
Servomotores geralmente possuem 3 pinos:
- Alimentação positiva (vermelho) – 5V;
- Terra (Preto ou Marrom) – GND;
- (Amarelo, Laranja ou Branco) – Ligado a um pino digital de entrada e saída;
Atenção!!
Servomotores consomem uma corrente significativa ao se movimentarem. A utilização de uma fonte externa pode ser necessária e é recomendada. Lembre-se de conectar o pino GND da fonte externa ao GND do Arduino para que a referência seja a mesma.
Apesar de sua posição ser controlada através do duty cycle de um sinal PWM enviado ao pino de controle não é necessária a conexão do pino de controle a um pino que possua PWM, pois utilizaremos a biblioteca Servo.h.
A utilização de analogWrite produzirá um controle de menor precisão e poderá até danificar alguns servomotores por sua frequência (490 Hz) ser 10 vezes superior a frequência típica de controle de alguns servomotores.
Além de mais preciso e recomendado, o uso da biblioteca Servo.h faz com que o uso do servomotor seja mais fácil. Isso se dá pelo fato de você só precisar definir o ângulo que você deseja, não necessitando o uso dos valores de PWM (0 a 255).
Mãos à obra – Controlando um Servomotor com Arduino – Micro Servo motor SG90
Componentes necessários
- Micro Servo motor SG90 ou outro Servomotor
- Placa Arduino Uno ou similar
- Fios Jumper’s
- Protoboard
- Potenciômetro
Montando o projeto
Agora vamos conectar os componentes do projeto. Para isso, desligue o cabo USB de seu Arduino e monte seu circuito conforme a figura a seguir.
O microservo tem três fios saindo dele. Um será vermelho e irá para os +5 V. Outro, preto ou marrom, irá para o GND. O terceiro, branco, amarelo ou laranja, será conectado ao pino digital 8.
Monte o potenciômetro com os seus pinos externos conectados um no +5 V e o outro no GND e o pino do meio ao pino analógico A0.
Conectando o Arduino ao computador
Conecte seu Arduino ao computador e abra a IDE Arduino.
Antes de carregar um programa, você precisa selecionar qual porta você deseja usar para fazer carregar o programa no Arduino (upload). Dentro do Arduino IDE, clique no menu Ferramentas (tools) e abra o submenu Porta(Port). Clique na porta que seu Arduino está conectado, tal como COM3 ou COM4. Geralmente aparece o nome da placa Arduino : “COM3 (Arduino/Genuino Uno)”.
Você também precisa garantir que o tipo de placa apropriado está selecionado em Ferramentas(Tools) no submenu Placa (Board).
Programando
Crie um programa (sketch) e salve com o nome de “programa_servo”.
Nesse exemplo utilizaremos a biblioteca Senvo.h que já é nativa da IDE Arduino e deve ser adicionada em: Sketch > Incluir Biblioteca > Servo.
Com o seu programa salvo, escreva nele o código conforme escrito abaixo.
#include <Servo.h> Servo servo1; // cria um objeto servo1 // Esta função "setup" roda uma vez quando a placa e ligada ou resetada void setup() { servo1.attach(5); // anexa o servomotor (físico), no pino 5, ao objeto servo1 (lógico) } void loop() { int angulo = analogRead(0); // Lê o valor do potenciômetro angulo = map(angulo, 0, 1023, 0, 180); // Mudança de Escala servo1.write(angulo); // Escreve o ângulo para o servomotor delay(20); // Espera de 20ms, Suficiente para que o servomotor atinja a posição }
Após escrever o código, salve e depois clique em Carregar (Upload) para que o programa seja transferido para seu Arduino.
Colocando para funcionar
Se tudo deu certo, conforme você variar a resistência do potenciômetro o servomotor irá se mover.
Entendendo a fundo
Entendendo o Software
Biblioteca Servo.h
Na elaboração do software utilizamos a biblioteca Servo.h. Esta biblioteca implementa as funcionalidades de um servomotor tornando sua utilização extremamente simples. Entretanto alguns cuidados devem ser tomados.
Importante:
A biblioteca suporta a ligação de até 12 servomotores na maioria das placas Arduino e 48 no Arduino Mega. O uso da biblioteca desabilita o uso da função analogWrite nos pinos 9 e 10 (*exceto no Arduino Mega). No Mega o uso de 12 a 23 servomotores desabilitará o a função analogWrite nos pinos 11 e 12.
Declarando um Servomotor
Ao usar essa biblioteca trataremos cada servomotor como um objeto, dessa forma precisamos declará-lo no início do código.
Servo servo1; // Cria um objeto servo1
Depois de declarado, sempre que quisermos mexer em alguma função desse servo, devemos usar o nome da função precedida do nome do servo e ponto.
servo1.exemplo(); // chama função exemplo() para o objeto servo1
Você poderá declarar quantos servos for usar, levando em conta a limitação física de sua placa Arduino. Cada servo pode ter qualquer nome, mas é aconselhável que se use nomes intuitivos.
Declarando porta de controle do Servomotor
Agora é preciso definir em que porta esta conectado o fio de controle do servo, para isso usamos a função attach(pino).
servo1.attach(5); // Anexa o servomotor (físico), no pino 5, ao objeto servo1 (lógico)
Controlando a Posição do Servomotor
A função write define em um servomotor padrão o ângulo em graus na qual ele deve se posicionar.
servo1.write(angulo); //angulo: posição em graus para servos comuns
Fechamento
Esperamos que tenham gostado, deixe seu comentário com duvidas, sugestões ou com a foto ou vídeo de seu projeto!! Compartilhe à vontade.
Engenheiro Eletricista pela UFES, Técnico em Automação industrial pelo IFES, MBA Gestão de Projetos pela USP e Fundador do Vida de Silício. Sonhador com uma única pretensão, fazer a diferença.
22 Comments
Deixe uma pergunta, sugestão ou elogio! Estamos ansiosos para ter ouvir!Cancelar resposta
Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.
muito otimo prof como faço pra controlar o sevo , pelo sensor para abrir e fechar
Allan, bom dia. Muito boa a aula, até “eu” aprendi. KKKKK. Tenho uma pergunta. Minha pretensão é comprar um TESTADOR DE SERVO, não só para testar servos, mas para testar Motores Brushless e Escs (motores para Phantom 1, 2, 3 tipo 2212 e 2312 com Escs de 30 A) só que eu me deparei com infinitos testadores no Banggood e este aquir: https://bit.ly/2UJ0I9b é um deles. A pergunta é o seguinte: Quando vc abrir este link este testador servirá aos meus propósitos? seja, servirá para testar este motores e os Escs descritos acima?
Allan, gostaria de poder mexer o braço do servo usando um LDR. Quando eu ligar 1 led, o LDR iria perceber a luz e acionaria o servo para mexer 90 graus o braço. É possível fazer isso com um circuito bem pequeno e simples ?
Salve, Allan! Tudo em Paz?
No circuito, você conectou o controle do servo no pino 8(Digital) e no sketch está no pino 5 (que é a porta analógica de leitura do Potenciômetro). Deve ser por isso que alguns colegas tiveram dificuldade, não!?
Obrigado.
Reginaldo
Amigo, muito bom, estou com dúvidas pois adquiri dois servos do modelo SG90, tentei controlar com alimentação via Arduino e não funcionou, ele só “rangeu os dentes” sem mexer… Coloquei uma fonte externa ATX e liguei nos 5V, ele até foi 180 graus comoprogramado, porém ele não saiu disso, ficou fazendo barulho querendo ir além… não estou entendendo, só preciso que ele abra uma catraca ou seja de 0 a 90 graus e retornando a 0 após um período.. Me ajude por favor
olá boa noite amigo! Poderia me dizer se um potenciômetro de 1k é pouco? Pois fiz o o circuito e programei conforme o artigo e nada aconteceu. Poderia me ajudar?
Boa tarde, como seria o comando para que eu fizesse o servo ir mais rapido e voltar mais lentamente utilizando o arduino uno?
Boa noite !!
vc poderia elaborar um passo a passo para programar um motor de passo??
abrs e parabens
Fabiano, Em breve teremos um tutorial sobre motor de passos. Está na fila para confecção. Obrigado pela sugestão!! =D
Quando o servo motor pára, ele fica vibrando, tem como evitar que isso ocorra ?
Tem como inverter o sentido do servo, começando a girar da direita para a esquerda.
Sou leigo no assunto e to querendo fazer um painel pra jogar Euro Truck 2
Olá tenho uma dúvida, o que aconteceria se eu tivesse um tempo de duty cicle maior do que o limite de rotação do servo?
Funcionou, apenas o servo fica vibrando as vezes quando para. Parabéns pelo exemplo, utilizei um Arduino Nano Generico.
Olá
Eu sou estudante de Engenharia Mecatrônica e Robótica, gostaria esclarecer algumas duvidas por email isso é possível é muito importante.
Olá, ótimo artigo, bem simples e objetivo. Apenas uma correção: no código está sendo declarado o pino 5 e no esquema de montagem está o pino 8, um dos dois está errado. Fora isso, perfeito, funciona. :)
Muito bom Parabens.
muito bom, bem simples e explicativo, parabéns.
Obrigado Leandro!
Olá sou aluno de robótica e estou aprendendo a utilizar as funções do Arduino, teria como fazer um servo ir 0° para 90° a cada 12 horas , sem utilizar o delay, para não travar a programação de sensores?
Você pode usar um RTC para ter a referência de hora. Da uma olhada nesse tutorial aqui: https://portal.vidadesilicio.com.br/real-time-clock-rtc-ds3231/
Bom dia, você sabe como controlar o servo via html? Att, Obrigado
Bao noite voce sabe e explica se eh possivel controla a posica usando ldr