Lição 86: Controle a posição de um servomotor usando potenciômetro
Imagine girar um simples botão e observar um braço mecânico seguir precisamente cada um dos seus movimentos. Essa é a mágica de combinar um potenciômetro com um servomotor. Este projeto, parte do Curso Passo a Passo de Arduino da Robojax, demonstra um conceito fundamental e incrivelmente útil em eletrônica: traduzir uma entrada analógica em movimento físico preciso. Você aprenderá a ler uma tensão variável de um potenciômetro, mapear esse valor para uma faixa de ângulos e comandar um servomotor para girar até essa posição exata. Esta é a sua porta de entrada para construir projetos intuitivos e interativos onde o controle manual encontra a automação.

As aplicações para essa habilidade são vastas e práticas. Aqui estão apenas algumas ideias para inspirar você:
- Controle de Braço Robótico: Use um potenciômetro para posicionar manualmente cada junta de um braço robótico para operações precisas de pegar e colocar.
- Sistema de Pan e Tilt para Câmera: Construa um suporte de câmera controlado remotamente para time-lapses ou vigilância, fazendo pan e tilt suavemente com um giro do botão.
- Réplica de Medidor Analógico: Crie um medidor de painel físico (como um velocímetro ou mostrador de temperatura) que se move com base em dados de sensores, com o potenciômetro atuando como uma ferramenta de sobreposição manual ou calibração.
- Instalações de Arte Interativas: Crie esculturas cinéticas que respondem à entrada do espectador, onde girar um botão muda a posição das partes móveis.
- Direção de Veículos Modelo: Controle o ângulo de direção de um carro ou barco modelo remotamente, proporcionando uma sensação mais intuitiva e analógica do que botões digitais.
Este guia é baseado no tutorial em vídeo Lição 86: Controle a posição de um servomotor usando potenciômetro da Robojax (no vídeo em 00:00). Ele conduz você por todo o processo, desde entender a fiação até explicar o código que faz tudo funcionar. Vamos começar.
Hardware e Componentes
Para acompanhar este projeto, você precisará dos seguintes componentes:
- Uma placa Arduino (ex.: Uno, Nano)
- Um servomotor padrão (ex.: SG90 ou MG996R)
- Um potenciômetro (resistor variável, tipicamente 10kΩ)
- Fios jumper
- Uma protoboard (opcional, para conexões mais fáceis)
Entendendo a Fiação
A fiação para este projeto é simples. O segredo é fornecer as conexões corretas de energia e sinal tanto para o servo quanto para o potenciômetro. O servo é um dispositivo que consome bastante energia, então ele recebe sua alimentação diretamente do pino 5V do Arduino. O potenciômetro atua como um divisor de tensão, e lemos a tensão no seu cursor (o pino do meio) para determinar sua posição. (no vídeo em 01:05)
Um truque inteligente que este projeto usa é criar uma fonte adicional de 5V em um pino digital para alimentar o potenciômetro, já que algumas placas Arduino têm apenas um pino dedicado de 5V. Isso é feito no código definindo um pino digital (pino 8) como HIGH, que emite 5V. (no vídeo em 00:39)
Aqui está o diagrama de fiação mencionado no vídeo:
Vamos detalhar as conexões:
- Servomotor:
- Alimentação (fio vermelho) → pino 5V do Arduino
- Terra (fio marrom/preto) → pino GND do Arduino
- Sinal (fio laranja/amarelo) → pino 3 do Arduino (um pino com capacidade PWM)
- Potenciômetro:
- Pino esquerdo → pino GND do Arduino
- Pino do meio (Cursor) → pino analógico A0 do Arduino
- Pino direito → pino 8 do Arduino (definido como VCC2 no código)
Explicação do Código
O código para este projeto é elegantemente simples. Ele utiliza algumas funções-chave do Arduino para ler o potenciômetro e controlar o servo. Vamos focar nas partes configuráveis pelo usuário que você pode ajustar para seus próprios projetos. (no vídeo em 03:00)
No topo do sketch, você definirá os pinos e criará o objeto do servo. Estas são as principais variáveis que você mudará com base na sua fiação:
#include <Servo.h>
Servo myservo; // cria objeto servo para controlar um servo
int potpin = A0; // pino analógico usado para conectar o potenciômetro
int servoPin = 3; // define um pino digital (com PWM) para o servo. Pode usar apenas os pinos 3, 5, 6, 9, 10, 11
int VCC2 = 8;// define VCC extra para o potenciômetro
int val; // variável para ler o valor do pino analógico
Aqui está o que cada parte faz:
- Servo myservo;: Esta linha cria um objeto chamado
myservoque usaremos para controlar nosso servomotor específico. Você pode renomeá-lo, mas deve usar o mesmo nome mais adiante no código. - int potpin = A0;: Isso define qual pino analógico o cursor do potenciômetro está conectado. Se você mover o fio para um pino analógico diferente, deve atualizar este número.
- int servoPin = 3;: Isso define o pino digital para o fio de sinal do servo. É crucial usar um pino com capacidade PWM (geralmente aqueles marcados com um '~' na placa). O comentário lista os pinos válidos para a maioria dos Arduinos.
- int VCC2 = 8;: Este é o pino que estamos usando como fonte secundária de 5V para o potenciômetro. Se você tiver uma placa com múltiplos pinos de 5V, pode conectá-lo diretamente e remover esta parte do código.
Na função setup(), o código inicializa o servo e configura o pino de alimentação extra. A função myservo.attach(servoPin) é essencial, pois informa ao Arduino qual pino está conectado ao fio de sinal do servo.
void setup() {
Serial.begin(9600); // configura a serial
myservo.attach(servoPin); // conecta o servo no pino 3 ao objeto do servo
pinMode(VCC2, OUTPUT);// define o pino 8 como saída
digitalWrite(VCC2, HIGH);// define o pino 8 como HIGH para atuar como pino de 5V
}
A lógica principal está na função loop(). Ela lê o valor do potenciômetro, converte-o em um ângulo e comanda o servo para se mover. As duas funções críticas aqui são analogRead() e map(). (no vídeo em 04:27)
void loop() {
val = analogRead(potpin); // lê o valor do potenciômetro (valor entre 0 e 1023)
val = map(val, 0, 1023, 0, 180); // converte para usar com o servo (valor entre 0 e 180)
myservo.write(val); // define a posição do servo de acordo com o valor convertido
Serial.print(val);
Serial.println();
delay(50); // aguarda o servo chegar à posição
}
Veja como funciona:
- analogRead(potpin): Esta função lê a tensão do cursor do potenciômetro e retorna um valor entre 0 (0V) e 1023 (5V).
- map(val, 0, 1023, 0, 180): Esta é a chave de todo o projeto. Ela pega o valor bruto do potenciômetro (0 a 1023) e o converte proporcionalmente em um ângulo do servo (0 a 180 graus). Por exemplo, se o potenciômetro ler 511 (aproximadamente a metade), a função
map()retornará 90, movendo o servo para sua posição central. - myservo.write(val): Esta função pega o ângulo calculado (agora armazenado em
val) e instrui o servo a girar para essa posição. - delay(50): Isso adiciona uma pequena pausa no final de cada loop. Controla a taxa de atualização. Um atraso maior (como 200ms) faz o servo se mover em etapas, enquanto um atraso menor (como 50ms) torna o movimento muito suave. Você pode ajustar isso para alterar a capacidade de resposta. (no vídeo em 07:26)
Demonstração ao Vivo do Projeto
No vídeo, você pode ver o projeto em ação. Conforme o botão do potenciômetro é girado, o braço do motor servo segue sua posição proporcionalmente. O monitor serial imprime o ângulo atual, confirmando que o mapeamento está funcionando corretamente. Quando o potenciômetro está em sua posição mínima, o servo está a 0 graus. Ao girar o botão até o máximo, o servo gira suavemente até 180 graus. (no vídeo em 06:33)
Este loop de feedback em tempo real demonstra a integração perfeita de um sensor analógico com um atuador digital, criando um sistema de controle responsivo e intuitivo.
Capítulos
- [00:00] Introdução e Visão Geral do Projeto
- [01:05] Esquemático e Diagrama de Ligação
- [02:07] Demonstração da Ligação Física
- [03:00] Explicação do Código
- [06:33] Demonstração ao Vivo e Testes
- [07:26] Ajustando a Velocidade de Resposta do Servo
/*
* Lesson 88: Controlling Servo motor a with Potentiometer
* 📚⬇️ Download and resource page https://robojax.com/RJT763
watch full video tutroial: https://www.youtube.com/watch?v=ntRW77mNFFk
Controlling a servo position using a potentiometer (variable resistor)
by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>
modified on 8 Nov 2013
by Scott Fitzgerald
http://www.arduino.cc/en/Tutorial/Knob
Update by Ahmad Shamshiri on Jan 01, 2019 in Ajax, Ontario, Canada
*/
#include <Servo.h>
Servo myservo; // create servo object to control a servo
int potpin = A0; // analog pin used to connect the potentiometer
int servoPin = 3; // define a digital pin (with PWM) for servo. Can use only pin 3, 5, 6,9, 10, 11
int VCC2 = 8;// define extra VCC for potentiometer
int val; // variable to read the value from the analog pin
void setup() {
//
Serial.begin(9600); // setup serial
myservo.attach(servoPin); // attaches the servo on pin 3 to the servo object
pinMode(VCC2, OUTPUT);// set pin 8 as output
digitalWrite(VCC2, HIGH);// set pin 8 HIGH so it acts as 5V pin
}
void loop() {
val = analogRead(potpin); // reads the value of the potentiometer (value between 0 and 1023)
val = map(val, 0, 1023, 0, 180); // scale it to use it with the servo (value between 0 and 180)
myservo.write(val); // sets the servo position according to the scaled value
Serial.print(val);
Serial.println();
delay(50); // waits for the servo to get there
}
Coisas que você pode precisar
-
Amazonas
-
Amazonas
-
eBay
-
AliExpressCompre o motor Servo SG90 180 ou 360 no AliExpresss.click.aliexpress.com
Recursos e referências
Arquivos📁
Outros arquivos
-
Folha de dados do motor SG90 Seroo
robojax-servo-SG90_datasheet.pdf0.12 MB