Nesse artigo vou te mostrar tudo que você precisa saber sobre o servo motor Arduino, com esses servos motores você consegue construir vários projetos robóticos como: braço robótico, robôs, avião, helicóptero, consegue controlar por rádio frequência com seu smartfone e de forma automática.
Vou te mostrar como funciona o servo motor Arduino destrinchando-o para você entender, o bom é que nem precisa abrir, já que este modelo SG90 é transparente e já dá para você entender um pouco mais sobre o seu funcionamento.
O que você vai aprender?
- Como funciona um servo motor Arduino;
- 3 Modos de programação;
- Como controlar servo motor com potenciômetro;
- Como ligar servo motor no Arduino e muito mais…
Sumário
Servo motor Arduino
Dos 3 tipos de programações que irei te mostrar a primeira é a que eu mais gosto, é a mais simples de todas e utilizei uma parecida para controlar um braço robótico que fiz esses dias, mas é bom que você aprenda todos porque vai variar de projeto.
Esse braço robótico foi meu amigo Paulo quem trouxe para a gente programar, ele imprimiu em 3d, mas você consegue fazer sem imprimir também.
Por mais simples que ele seja você já consegue aprender muita coisa e utilizando apenas quatro servos motores.
Eu comprei esses servos motores no AliExpress ha muito tempo e paguei apenas R$4,50 em cada um.
Enfim, vamos ao conteúdo…
Tenha cuidado com a corrente
Então uma coisa que precisamos saber sobre os servos motores é que ele vai variar a corrente que puxa de acordo a força que vai estar fazendo, a tensão de alimentação desse micro servo azul é de 3 a 6v e a corrente vária entre 0,1 a 1,2 amperes.
Dependendo de quantos servos motores e a força que vão estar fazendo, temos que ligar uma fonte externa, um detalhe importante é não esquecer de interligar o GND da fonte com o GND do Arduino
Muita gente já me perguntou porque o projeto não estava dando certo, porque os servos motores não funcionavam, quando eu ia analisar era apenas o GND que faltava interligar, então preste atenção nesse detalhe.
Lembre-se do efeito alavanca que quando mais próximo do eixo, menor a força que o servo motor Arduino vai estar fazendo e quanto mais longe do eixo maior a força.
Se é uma força maior vai puxar mais corrente, então preste atenção, pois pode ter a necessidade de ligar uma fonte externa.
Dica: para reduzir o tremor do servo motor você deve ligar a um capacitor eletrolítico, você liga em paralelo.
Como funciona um servo motor
Para entender como funciona um servo motor, antes de mais nada vamos conferir tudo que tem dentro dele… Basicamente tem um potenciômetro, um circuito de controle, o motor e a caixa de redução para aumentar o torque.
Para que serve o potenciômetro?
Ele vai servir como sensor de posição, de acordo o motor for rotacionando vai também rotacionar o potenciômetro que vai causar uma variação da corrente e tensão.
Portanto, baseado nessa variação o circuito de controle vai saber exatamente a posição que o eixo do Servo motor Arduino está.
Como funciona o circuito de controle?
O circuito de controle recebe um sinal do Arduino e compara com a posição atual que o potenciômetro está, se houver uma diferença entre o sinal do Arduino e a posição atual, ele calcula essa diferença e corrige, rotacionando o motor no sentido anti-horário ou horário.
Como ligar servo motor no Arduino
Primeiramente, vamos falar sobre a ligação de cada fio do servo motor no Arduino.
Temos 2 tipos de padrão de cores laranja, vermelho e marrom, onde marrom é o negativo, vermelho positivo e laranja o sinal.
Também temos o preto, vermelho e branco, onde o preto é negativo, vermelho positivo e branco o sinal.
Estes dois servos motores chegam a 180 graus, vão de 0 a 180, mas também existem servos motores que giram 360 graus, tudo isso vai ser baseado no projeto que você quer fazer e não esqueça de ler as especificações antes de comprar.
Conectando cada fio ao Arduino:
Servo motor Arduino programação
Chegamos então à programação… Vou começar com a programação automática que é uma programação que acho bem legal e é a mais simples de todas.
Em todos os exemplos o servo motor foi conectado a porta 9 como a imagem acima.
Controle automático
Já fiz o código todo comentado para facilitar o entendimento, lembrando que servos motores devem ser ligados no pino PWM.
//Autor: Luan Silver - GuiaRobotica.com
// Inclusão da biblioteca Servo
#include <Servo.h>
Servo myservo; // Cria um objeto baseado na biblioteca Servo
void setup() {
myservo.attach(9); // Diz que o objeto "myservo" está ligado ao pino 9
}
void loop() {
myservo.write(180); // Comando para mandar o servo para posição 180
delay(500); // Espera de 500 ms
myservo.write(0); // Comando para mandar o servo para posição 0
delay(500); // Espera de 500 ms
myservo.write(90); // Comando para mandar o servo para posição 90
delay(500); // Espera de 500 ms
}
Esse delay é importante, pois é necessário enviar um comando para o servo motor e esperar ele chegar nessa posição para somente depois mandar ir para outra posição.
Se eu diminuir todos os delay para 50 milissegundos ele vai ficar desorientado, porque nem chegou em 180° e já pedi para ele ir para 0° ou algo assim, é muito importante você colocar um tempo adequado.
E, porque gosto do controle automático?
No projeto do braço robótico que te mostrei ali em cima foi usado uma programação semelhante a esta, mas utilizei uma biblioteca diferente a biblioteca var sped servo.h, com ela eu tenho controle da posição e velocidade do servo motor Arduino.
Criei uma condição que quando um objeto entrar na frente do sensor de obstáculos os servos vão fazer uma sequência de movimentos como visto no GIF.
Então se você quiser saber como controlar a velocidade do servo motor utilizando pouco código, eu tenho um artigo completo clique aqui para acessar.
Controlar servo motor com potenciômetro
Agora vamos fazer um controle diferente, um controle com o potenciômetro, vou utilizar o tinkercad para ficar mais fácil de você entender.
Lembrando que o potenciômetro tem 3 terminais e a do meio é o que vou usar, com o servo motor a ligação é a mesma forma do projeto acima.
Esta programação para controlar servo motor com potenciômetro é um dos exemplos que já vem no Arduino basta ir em Arquivos>exemplos > Servo > knob.
Mas eu irei colocar aqui com comentários em português para ficar melhor para você entender.
//Inclusão da biblioteca Servo
#include <Servo.h>
Servo myservo; // Cria um objeto baseado na biblioteca Servo
int potpin = 0; // Pino analógico ligado ao potenciômetro
int val;// Variável para ler o valor do potenciômetro
void setup() {
myservo.attach(9); // Diz que o objeto "myservo" está ligado ao pino 9
}
void loop() {
val = analogRead(potpin); // Ler e armazena o valor do potenciometro
val = map(val, 0, 1023, 0, 180); // Faz um mapeamento
myservo.write(val); // Comando para mandar o servo para posição "val" que foi mapeada
delay(15); // Espera de 15 ms
}
O que é mapeamento?
Vamos usar este exemplo de programação, o valor de uma entrada analógica vai de 0 a 1023 no Arduino, já a angulação do servo motor vai de 0 a 180, então tenho que fazer um mapeamento.
Dessa forma, estou informando que quando o valor do potenciômetro for 0, a angulação será 0° e quando o valor do potenciômetro for 1023 a angulação vai ser 180°.
Quando o potenciômetro estiver na metade, a angulação será 90°, e assim por diante a função basicamente faz uma regra de 3.
De acordo eu for rodando o potenciômetro vai variando sua resistência, que varia a tensão na porta analógica, dessa maneira também consigo controlar o servo motor pelo potenciômetro.
Utilizando a estrutura FOR
Vamos agora ao último exemplo de programação.
Para esse não iremos precisar do potenciômetro e também é um exemplo que temos na IDE do Arduino é só carregar na placa basta ir em arquivos > exemplos > Servo > sweep.
Mas também vou deixar a programação aqui com comentários em português.
// Inclusão da biblioteca Servo
#include <Servo.h>
Servo myservo;// Cria um objeto baseado na biblioteca Servo
int pos = 0;// Variável para controle de posição
void setup() {
myservo.attach(9);// Diz que o objeto "myservo" está ligado ao pino 9
}
void loop() {
// Incremento de 1 em 1
for (pos = 0; pos <= 180; pos += 1) { // Vai de 0 a 180
myservo.write(pos); // Usa o valor de "pos" atribuido ao loop
delay(15); // Espera 15ms
}
// Decremento de 1 em 1
for (pos = 180; pos >= 0; pos -= 1) { // Vai de 180 a 0
myservo.write(pos);// Usa o valor de "pos" atribuido ao loop
delay(15);// Espera 15ms
}
}
Este exemplo fica movimentando o servo motor de 0 a 180 graus, em uma velocidade baixa, deixa eu te explicar de maneira rápida como funciona:
pos é uma variável para controlar a posição;
For (pos = 0; pos <= 180; pos += 1): FOR é uma estrutura de repetição que é executada enquanto a condição for verdadeira,
pos = 0; Inicialização,
pos <= 180 Condição,
pos += 1 Incremento.
É assim que o comando for funciona, portanto, a inicialização coloquei em 0, a condição que seja, menor ou igual 180 e o incremento é de um em um.
Então, o programa vai começar na posição 0, no próximo loop do FOR vai para 1, dois para 2 e assim por diante até chegar em 180.
Mesma coisa no caso do decremento para ele mudar o sentido, só que antes estava de 0 a 180, agora está fazendo o caminho inverso de 180 a 0, com decremento de -1, ou seja 180, depois 179, e assim por diante.
Agora faremos uma modificação na velocidade mudando apenas o valor de incremento e decremento
- Primeiro pos += 1 e pos -= 1 (velocidade do exemplo);
- Segundo pos += 2 e pos -= 2 ;
- Terceiro pos += 4 e pos -= 4.
Conclusão
Existem servos motores que a angulação vai de 0 a 180 graus, outros giram 360 graus e tudo isso vai depender do projeto.
Leia sempre as especificações antes de comprar.
Também é importante prestar atenção no torque que o motor suporta, qual a tensão e a corrente de trabalho.
Dependendo do projeto não esqueça de usar uma fonte externa, vai variar de acordo a quantidade de corrente solicitada pelo circuito.
Quando utilizar fonte externa não esqueça de interligar o GND do Arduino com o GND da fonte.
Em suma, vimos três programações:
- A que só coloco o ângulo e vai automática;
- Controlando servo motor com potenciômetro, de acordo eu rodo o potenciômetro vai rodando o servo motor visto que fez um mapeamento;
- Utilizando a estrutura FOR, que vai de 0 a 180 e 180 a 0, segue nesse ciclo.
Tem algum projeto que você gostaria de construir com servo motores? Deixa um comentário aqui para mim e se teve alguma coisa que você não entendeu pode perguntar que te respondo.
Forte abraço e tamo junto!
Link permanente
Adquiri recentemento 10 servo-motor 9g SG90 e 6 placas Arduino Uno, para um projeto no trabalho.
Ao realizar a ligação do servo motor no arduino, medindo no multimetro, o 5V está passando normal, mas o pino de sinal está em 0. Assim, após upar o código de exemplo do servo no arduino, o mesmo não apresenta nenhum sinal de vida.
Testei os 10 motores nas 6 placas, e todas apresentaram o mesmo problema. Parece que, independente da porta PWM que coloco o pino de sinal do motor, ele não funciona de jeito nenhum.
Testei também os motores em um Arduino Leonardo e em um Arduino Nano, com o mesmo problema.
Outros componentes funcionaram corretamente: coloquei um potenciometro na porta 9 e no monitor serial, consigo ler os dados dele. Ao colocar o servo motor na mesma porta, não ocorre nenhuma leitura e o motor simplesmente não funciona, mesmo medindo os 5V no fio vermelho.
Alguém saberia dizer se, por azar, comprei um lote danificado de 10 servo motor? Ou se existem outros procedimentos de testes e resolução do problema?
Já testei o pino de sinal do servo nas nas entradas 3,6, 7, 8, 9 e 10, sem sucesso em todos os motores com todas as placas.
Outra coisa que percebi, sem querer, é quem em um dado momento, enquanto o arduino estava ligado na porta USB do computador, sem querer, encostei o dedo no metal da conexão USB e assim, o motor apresentou um sinal de vida, se moveu um pouco e depois parou também.
Senti também que o motor vem com uma espécie de óleo quando tiro do plástico. Parece algo que envolve ele e deixa o dedo meio oleoso.
Se puderem ajudar, agradeço muito.
Link permanente
Muito boa a matéria.. obrigado..
Se tiver algum material com o sensor de cores, passe para nos..
Parabéns..
Link permanente
Não precisa ser uma porta PWM. Na verdade, a funçãoPWM é desativada. A função da rotina Servo(.h) lembra PWM.
Link permanente
Vdd.