Código de Pesquisa

Lição 86: Controle a posição de um servomotor usando potenciômetro

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:

Fiação Arduino para servomotor com potenciômetro
Fiação Arduino para servomotor com potenciômetro

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 myservo que 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

Imagens

Arduino wiring or servo motor with pot
Arduino wiring or servo motor with pot
SG90_servo_motor-1
SG90_servo_motor-1
SG90_servo_motor-0
SG90_servo_motor-0
892-Lesson 86: Controlling a servo position using a potentiometer (variable resistor)
Idioma: C++
/*
 * 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
}
 

Recursos e referências

Arquivos📁

Outros arquivos