Control a servo motor with an Arduino and a potentiometer
Iniciante
- 503componentes na bancada
- 44placas rodando agora
- 1.00xtempo real, em todas as placas
Um servo de hobby é o jeito mais fácil de fazer um Arduino mover alguma coisa para um ângulo exato: três fios, um pino de sinal e um número de 0 a 180. O circuito acima é um servo do tipo SG90 no pino 9 de um Arduino Uno, com um potenciômetro deslizante no A0 definindo para onde o braço do servo aponta. Ele está rodando no seu navegador, num ATmega328P simulado.
Abra no editor e arraste o controle deslizante enquanto ele roda: o braço vai até o novo ângulo na velocidade de um SG90 de verdade, e o monitor serial imprime a leitura e o ângulo cada vez que eles mudam.
What you need
- Um Arduino Uno
- Um servo de hobby SG90 (ou parecido)
- Um potenciômetro de 10 k (aqui um deslizante; um rotativo é ligado do mesmo jeito)
- Uma protoboard e jumpers
Wiring
| Componente e pino | Vai para | Nota |
|---|---|---|
| Fio marrom do servo (GND) | GND | |
| Fio vermelho do servo (VCC) | 5 V | Abaixo de 4 V o servo não se mexe |
| Fio laranja do servo (sinal) | Pino 9 | Qualquer pino digital serve |
| Ponta 1 do potenciômetro | 5 V | |
| Ponta 3 do potenciômetro | GND | |
| Cursor do potenciômetro | A0 | Lê de 0 a 1023 ao longo do curso |
O que um servo realmente escuta
O fio de sinal do servo não recebe PWM no mesmo sentido que um LED. O ciclo de trabalho não significa nada para ele. O que ele mede é a largura de cada pulso: com os números da biblioteca Servo, 544 microssegundos colocam o braço numa ponta, 2400 microssegundos na outra e 1472 microssegundos no meio, repetidos cerca de cinquenta vezes por segundo. O servo mantém a última posição que recebeu e vai até ela na própria velocidade, mais ou menos um décimo de segundo para sessenta graus.
É por isso também que você não consegue controlar um servo com analogWrite() num Uno. O PWM do Uno roda a cerca de 490 ou 980 hertz, rápido demais para um servo ler como largura de pulso. A biblioteca Servo gera o pulso ela mesma.
O código, explicado
O sketch lê o potenciômetro quatro vezes e tira a média das leituras, para o braço não tremer por causa do último bit, cheio de ruído, do conversor. O map() transforma 0 a 1023 em 0 a 180 graus, o write() envia o pulso correspondente, e o loop espera 20 milissegundos, que é o período de quadro do próprio servo. O ângulo só é impresso quando muda, então o monitor serial fica legível como uma frase em vez de virar uma cachoeira.
void loop() {
long sum = 0;
for (int i = 0; i < 4; i++) {
sum += analogRead(FADER);
}
int reading = (int)(sum / 4);
int angle = (int)map(reading, 0, 1023, 0, 180);
horn.write(angle);
delay(20);
}A mesma coisa com a biblioteca Servo
O exemplo que já vem pronto usa o header de servo do próprio Mokxi, mas as chamadas da biblioteca Servo do Arduino compilam do jeito que estão, em todas as placas que compilam no navegador. O sketch clássico sweep abaixo roda sem mudanças, com as larguras da biblioteca original: attach(pin) usa de 544 a 2400 microssegundos, write(90) envia 1472, e attach(pin, min, max) define outra janela. Vale saber de uma pequena diferença: cada write() envia um pulso em vez de iniciar um timer, então um sketch que precisa manter o servo firme sob carga chama refresh() a partir do loop().
Para um tutorial de ESP32, o ESP32Servo.h é a mesma classe com o nome que esses tutoriais usam.
#include <Servo.h>
Servo myservo;
void setup() {
myservo.attach(9);
}
void loop() {
for (int pos = 0; pos <= 180; pos++) {
myservo.write(pos);
delay(15);
}
}Experimente no editor
Abra o circuito no editor e mude a chamada do map() para map(reading, 0, 1023, 45, 135). Agora o controle deslizante só cobre os noventa graus do meio, que é como você dá a um potenciômetro um controle mais fino numa faixa menor.
Depois selecione o servo e olhe as propriedades dele: min_pulse, max_pulse, range e speed. Coloque a velocidade em 60 graus por segundo e mexa o controle deslizante rápido; agora o braço vai se arrastando atrás, como faria um servo grande e lento. Por padrão, min_pulse e max_pulse são 544 e 2400, a janela da biblioteca Servo; um servo configurado com attach(pin, 1000, 2000) também precisa de 1000 e 2000 ali.
Para controlar um segundo servo, arraste outro para o canvas, ligue o sinal dele no pino 10 e acrescente um segundo objeto Servo no sketch.
Common mistakes
Alimentar o servo pela placa e achar que vai dar tudo certo. Numa bancada de verdade, um SG90 pode puxar um quarto de ampère quando trava, o suficiente para derrubar a tensão de um Uno alimentado pela USB, e esse é o motivo mais comum para um projeto com servo ficar reiniciando sozinho. O simulador não modela a corrente da fonte, então um circuito que cairia na sua mesa roda sem problemas aqui. Se for montar de verdade, dê ao servo uma fonte de 5 volts só para ele e ligue os terras juntos.
Esquecer o terra comum. O sinal é medido em relação ao terra do próprio servo, então se as duas fontes não têm nada em comum o pulso não significa nada.
Pedir ângulos que o servo não alcança. Um pulso além de qualquer ponta da janela do servo deixa o braço naquela ponta, do mesmo jeito que um SG90 de verdade força contra o batente. Se o braço para antes de 0 ou de 180, confira se a janela no attach() bate com o min_pulse e o max_pulse do servo.
Atualizar o servo num loop apertado sem delay. Mandar pulsos mais rápido do que a cada 20 milissegundos não adianta nada, porque o servo só atualiza na própria taxa de quadros.
Perguntas
Quais pinos do Arduino conseguem controlar um servo?
Qualquer pino digital. A biblioteca gera o pulso por software, então o servo não precisa de um dos pinos de PWM marcados com til.
Dá para controlar dois servos ao mesmo tempo?
Dá. Crie dois objetos Servo em dois pinos e escreva em cada um. Quando tiver mais de um servo de verdade, dê a eles uma fonte própria, porque a corrente vai somando.
Por que meu servo treme?
Normalmente porque a leitura que ele segue tem ruído. Tirar a média de algumas amostras do analogRead(), como este sketch faz, ou ignorar mudanças de um ou dois graus, deixa ele firme. No hardware de verdade, uma fonte que cai também faz o servo tremer.
Qual é a diferença entre um servo e um motor de passo?
Um servo vai até um ângulo e fica lá, com a própria realimentação dentro dele, normalmente numa faixa de 180 graus. Um motor de passo gira em passos contados, o quanto você quiser, e não tem a menor ideia de onde está a não ser que você conte. O tutorial de motor de passo fala do 28BYJ-48.
Continuar
Monte isto de verdade
Abra o editor, mude um valor e veja o número mudar junto. Nada para instalar, e não precisa de conta.