Skip to Content

Servos Posicionais versus Servos Contínuos

Servos Posicionais versus Servos Contínuos

Os servos são amplamente utilizados em várias aplicações. Neste artigo, vamos explorar as diferenças entre servos posicionais e contínuos e ajudá-lo a perceber qual é o mais indicado para o seu projeto.

Os servos posicionais, como o nome indica, são concebidos para se moverem até uma posição específica e manterem essa posição até receberem um novo sinal. São normalmente usados em aplicações onde a precisão e a estabilidade são essenciais. Estes servos têm um alcance de movimento limitado, normalmente cerca de 180 graus, e são ideais para aplicações que exigem controlo preciso da posição do motor, como braços robóticos, direção de carros RC e controlo de drones.

Os servos contínuos, por outro lado, foram desenhados para rodar continuamente em qualquer direção. Ao contrário dos servos posicionais, não mantêm uma posição específica. São usados em aplicações onde é necessário movimento contínuo, como robôs com rodas ou sistemas de câmara pan-tilt.

Um servo muito popular, disponível tanto na versão posicional como contínua, é o SG90. A seguir, vamos ver as especificidades dos SG90 Micro Servos, como os ligar e as diferenças de controlo entre o tipo posicional e o contínuo.

Materiais necessários

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Para este projeto vai precisar dos seguintes materiais. Note que os servos posicionais e contínuos podem ser idênticos por fora! Procure uma descrição ou etiqueta que diga continuous ou 360 degrees para servos contínuos, e 180 degrees ou positional para servos posicionais.

Arduino Uno

Dupont wire set

Conjunto de cabos Dupont

USB Data Sync cable Arduino

Cabo USB para Arduino UNO

basic servo motor

Servo SG90 Posicional

basic servo motor

Servo SG90 Contínuo

Especificidades dos SG90 Micro Servos

O micro servo SG90 é um motor servo popular e amplamente utilizado em várias aplicações. É conhecido pelo seu tamanho compacto, preço acessível e versatilidade. Aqui estão algumas características principais do SG90 micro servo:

Tamanho e Peso

O SG90 micro servo é um servo de pequenas dimensões, medindo aproximadamente 23mm x 12,2mm x 29mm. É leve, pesando cerca de 9 gramas, o que o torna adequado para projetos onde o espaço e o peso são uma preocupação.

Tensão de Funcionamento

O SG90 micro servo funciona numa gama de tensão de 4,8V a 6V. Isto torna-o compatível com a maioria das fontes de alimentação comuns, como baterias LiPo ou fontes de alimentação.

Binário e Velocidade

O SG90 micro servo oferece um binário razoável para o seu tamanho. Normalmente fornece um binário de cerca de 1,6 kg/cm a 4,8V e 2,2 kg/cm a 6V. A velocidade do servo é de aproximadamente 0,12 segundos por 60 graus a 4,8V e 0,10 segundos por 60 graus a 6V.

Sinal de Controlo

O SG90 micro servo utiliza um sinal de controlo PWM (Pulse Width Modulation) padrão para funcionar. Requer um sinal de controlo com frequência de 50Hz e largura de pulso entre 1ms e 2ms. A largura do pulso determina a posição do eixo do servo, no caso de um servo posicional, ou a velocidade de rotação no caso de um servo contínuo.

Compatibilidade

O SG90 micro servo é compatível com a maioria dos microcontroladores e placas de desenvolvimento, como Arduino, Raspberry Pi e ESP32. Pode ser facilmente controlado usando bibliotecas de software e linguagens de programação comuns na comunidade maker.

Ligar o SG90 Micro Servo

Siga estes passos para ligar o SG90 Micro Servo:

servo-motor-with-arduino-uno-wiring-diagram-schematic-circuit-tutorial
  1. Comece por ligar a alimentação ao servo. O SG90 Micro Servo funciona numa gama de tensão de 4,8V a 6V. Ligue o fio positivo (vermelho) do servo ao pino 5V do seu microcontrolador ou fonte de alimentação.
  2. Depois, ligue o fio negativo (preto ou castanho) do servo ao pino de terra (GND).
  3. De seguida, ligue o fio de sinal de controlo do servo ao PIN 9 do seu microcontrolador. O fio de sinal de controlo é normalmente amarelo, branco ou laranja.

Note que, se ligar vários servos a um Arduino, especialmente quando os servos estão sob carga, o Arduino pode não conseguir fornecer energia suficiente para todos os servos ao mesmo tempo. Isto pode resultar em movimentos erráticos dos servos, desempenho reduzido ou até fazer com que o Arduino reinicie ou bloqueie! Neste caso, vai precisar de uma fonte de alimentação extra para os servos.

Agora que já sabe como ligar o SG90 Micro Servo, vamos explorar as principais características dos servos posicionais na próxima secção.

Principais Características dos Servos Posicionais

Os servos posicionais, também conhecidos como servos standard, são amplamente utilizados em várias aplicações devido ao seu controlo preciso da posição angular. Aqui estão algumas das principais características dos servos posicionais:

Controlo Angular : Os servos posicionais permitem um controlo preciso da posição angular do eixo do servo. Podem rodar até um ângulo específico dentro de um intervalo definido, normalmente entre 0 e 180 graus.

Feedback de Posição : Estes servos vêm equipados com mecanismos de feedback de posição, como potenciómetros ou encoders, que fornecem informação sobre a posição atual do eixo do servo. Este feedback permite um posicionamento e controlo precisos.

Binário : Os servos posicionais são desenhados para fornecer um binário elevado, permitindo-lhes exercer uma força significativa. Isto torna-os adequados para aplicações que exigem mover ou manipular objetos com resistência.

Estabilidade : Os servos posicionais são conhecidos pela sua estabilidade e capacidade de manter uma posição depois de a atingir. Têm circuitos integrados que ajudam a manter a posição desejada, mesmo sob forças externas ou variações de carga.

No geral, os servos posicionais são ideais para aplicações que exigem controlo angular preciso, estabilidade e elevado binário. São frequentemente usados em robótica, veículos RC, automação industrial e outros projetos onde o posicionamento exato é crucial.

Código para Controlar Servos Posicionais

Normalmente, não se controla um servo escrevendo o código para gerar os sinais PWM necessários, mas sim usando uma biblioteca. A biblioteca mais popular para este fim é a Servo. Na sua documentação encontra o seguinte code exemplo:

#include <Servo.h>

Servo myservo;  // create servo object to control a servo
int pos = 0;    // variable to store the servo position

void setup() {
  myservo.attach(9);  // attaches the servo on pin 9 to the servo object
}

void loop() {
  for (pos = 0; pos <= 180; pos += 1) { // goes from 0 degrees to 180 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
  for (pos = 180; pos >= 0; pos -= 1) { // goes from 180 degrees to 0 degrees
    myservo.write(pos);              // tell servo to go to position in variable 'pos'
    delay(15);                       // waits 15ms for the servo to reach the position
  }
}

Este código serve para mover o servo da posição de 0 graus até 180 graus e depois voltar atrás.

No entanto, se tentar isto com algumas marcas de servos SG90, muitas vezes não vai funcionar! No meu caso, por exemplo, o servo não para no ângulo de 0 graus, mas faz uma rotação completa na direção errada para chegar à próxima posição. Isto acontece porque os fabricantes nem sempre seguem rigorosamente os padrões de temporização do sinal PWM (link).

Ajuste fino dos ângulos

Por isso, é necessário fazer alguns ajustes para que funcione corretamente. Em baixo está um exemplo de código melhorado:

#include <Servo.h>

const int range = 780;
const int mid = 1600;  // 90 degrees
Servo servo;

void setup() {
  servo.attach(9);  // PIN 9
}

void rotate(int angle, int wait) {
  angle = map(angle, 0, 180, mid - range, mid + range);
  servo.writeMicroseconds(angle);
  delay(wait);
}

void loop() {
  rotate(0, 1000);
  rotate(90, 1000);
  rotate(180, 1000);
  rotate(90, 1000);
}

Note que o comportamento é um pouco diferente. Em vez de mudar a posição de forma incremental, movemos diretamente de 0 graus para 90 graus, depois para 180 graus e finalmente de volta para 90 graus, com um tempo de espera de 1000ms entre cada movimento. Isto é apenas para simplificar. Pode alterar o código para fazer o mesmo que o exemplo anterior, mudando a loop função para:

void loop() {  
  for (int angle = 0; angle <= 180; angle += 1) {
    rotate(angle, 15);
  }	
  for (int  angle = 180; angle >= 0; angle -= 1) {
    rotate(angle, 15);
  }
}

A parte importante aqui é a rotate() função, que recebe um angle (e um tempo de espera) e maps este ângulo para comprimento de pulso. Em teoria, um comprimento de pulso de 1000ms corresponde totalmente à esquerda (0 graus), 2000ms totalmente à direita (180 graus) e 1500ms ao centro (90 graus). Isto aplica-se à maioria dos servos posicionais comuns que têm um intervalo de ângulo de 0 a 180 graus.

Ajuste fino do ponto médio

Na prática, os comprimentos de pulso realmente necessários são diferentes e, por isso, o servo não se move como esperado. Começamos por definir o ponto médio, o ângulo de 90 graus, que deve estar nos 1500ms de comprimento de pulso. Para isso, coloca-se o horn no servo, define-se a constante mid para 1500 e altera-se a loop função para:

void loop() {
  rotate(90, 1000);
}

Dependendo do encaixe, o horn pode não ficar exatamente no ângulo desejado. Por exemplo, imagine que quer que os 90 graus fiquem como na imagem abaixo, mas o horn está ligeiramente fora do centro.

Podemos corrigir isto ajustando a mid constante até obter o alinhamento perfeito. No exemplo de código acima, tive de definir mid=1600 para conseguir isto.

Ajuste fino dos pontos finais

De seguida, ajustamos as posições de 0 e 180 graus alterando a range constante. Para isso, modificamos o código no loop da seguinte forma

void loop() {
  rotate(0, 1000);
  rotate(180, 1000);
}

Depois deixamos o servo funcionar, observamos as posições finais e ajustamos a range constante, começando com um valor de 500, até obtermos os ângulos mostrados abaixo.

Por exemplo, no código acima, tive de definir a range=780, para conseguir isto nos meus servos. Note que estes valores ajustados para o comprimento de pulso diferem bastante dos valores padrão. Por isso, é necessário algum ajuste fino para que os servos façam exatamente o que pretende.

Para mais detalhes, veja o nosso tutorial sobre How to control servo motors with Arduino.

A seguir, vamos ver as principais características dos servos contínuos.

Principais Características dos Servos Contínuos

Os servos contínuos, também conhecidos como servos de rotação contínua ou servos de 360 graus, rodam continuamente em qualquer direção. Ao contrário dos servos posicionais, que têm um alcance de movimento limitado a cerca de 180 graus, os servos contínuos rodam sem paragens físicas. Aqui estão algumas das principais características dos servos contínuos:

Controlo de Velocidade : Os servos contínuos permitem um controlo preciso da velocidade. Ao ajustar o sinal PWM enviado ao servo, pode controlar a velocidade de rotação. Isto torna os servos contínuos ideais para aplicações que exigem controlo de velocidade variável, como robôs com rodas.

Rotação Bidirecional : Os servos contínuos podem rodar tanto no sentido dos ponteiros do relógio como no sentido contrário.

Sem Feedback de Posição : Ao contrário dos servos posicionais, os servos contínuos não fornecem feedback de posição. Isto significa que não pode controlar com precisão a posição ou o ângulo do eixo do servo. Em vez disso, só pode controlar a velocidade e a direção da rotação.

Os servos contínuos oferecem vantagens únicas em relação aos servos posicionais, especialmente em aplicações que exigem movimento contínuo e controlo de velocidade variável. No entanto, não permitem controlar com precisão a posição do eixo do servo.

Código para Controlar Servos Contínuos

O código de controlo para um servo contínuo é praticamente idêntico ao de um servo posicional. Apenas mudamos os nomes das variáveis e constantes para clarificar a intenção do código:

#include <Servo.h>

const int maxspeed = 700;
const int stop = 1500;
Servo servo;

void setup() {
  servo.attach(9); // PIN 9
}

void rotate(int speed, int wait) {
  speed = map(speed, -100, +100, stop - maxspeed, stop + maxspeed);
  servo.writeMicroseconds(speed);
  delay(wait);
}

void loop() {
  rotate(0, 1000);
  rotate(-100, 1000);
  rotate(+100, 1000);
}

Uma diferença importante, no entanto, está no mapeamento. Aqui map mapeamos velocidades de -100% a +100% (em vez de ângulos) para as durações de pulso necessárias para o controlo do servo.

Como antes, teoricamente, um comprimento de pulso de 1000ms seria usado para velocidade máxima no sentido contrário ao dos ponteiros do relógio, 2000ms para velocidade máxima no sentido dos ponteiros do relógio, e para um comprimento de pulso de 1500ms o servo não deveria mover-se.

Nos meus servos, uma duração de pulso de 1500ms realmente fazia o servo parar. No entanto, as velocidades máximas foram atingidas em 1500ms-700ms = 800ms e 1500ms + 700ms = 2200ms, que estão acima dos valores padrão de 1000ms e 2000ms.

Tal como no ajuste fino de um servo contínuo, começa-se por encontrar o ponto médio, que é o valor para a stop constante, onde o servo não se move. Depois aumenta-se a maxspeed constante (começando nos 500ms) até deixar de observar melhorias na velocidade de rotação.

Para mais detalhes, veja o nosso tutorial sobre How to Control a 360 Degree Servo Motor with Arduino.

Escolher entre Servos Posicionais e Contínuos

Quando chega a altura de escolher entre servos posicionais e contínuos, aqui fica um pequeno resumo dos fatores a considerar.

Servos Posicionais

Os servos posicionais são desenhados para rodar até um ângulo específico e manter essa posição. Por isso, são ideais para tarefas que envolvem mover objetos para locais ou ângulos específicos.

Principais características dos servos posicionais incluem:

  • Controlo de Posição : Os servos posicionais permitem definir o ângulo de rotação desejado e mantêm essa posição até receberem outra instrução.
  • Mecanismo de Feedback : Estes servos normalmente incluem um potenciómetro ou encoder que fornece feedback sobre a posição atual do servo.
  • Binário : Os servos posicionais são conhecidos pela sua capacidade de fornecer binário elevado, tornando-os adequados para aplicações que exigem mover cargas pesadas.

Servos Contínuos

Por outro lado, os servos contínuos são desenhados para rodar continuamente em qualquer direção. Por isso, são ideais para tarefas que envolvem rodar rodas, hélices ou outros componentes rotativos.

Principais características dos servos contínuos incluem:

  • Rotação Contínua : Ao contrário dos servos posicionais, os servos contínuos podem rodar continuamente em qualquer direção.
  • Controlo de Velocidade : Estes servos normalmente incluem um mecanismo de controlo de velocidade, permitindo ajustar a velocidade de rotação.
  • Sem Controlo de Posição : Os servos contínuos não têm controlo de posição como os servos posicionais. Não mantêm um ângulo específico.

Escolher o Servo Certo

Se precisa de controlo preciso da posição do servo e de elevado binário, um servo posicional é a escolha certa. Por outro lado, se precisa de movimento contínuo e controlo de velocidade, um servo contínuo será mais adequado.

Conclusão

Neste artigo, vimos as diferenças entre servos posicionais e contínuos, as suas principais características e como os controlar.

Os servos posicionais são desenhados para rodar dentro de um intervalo específico de ângulos, tornando-os ideais para aplicações que exigem posicionamento preciso. Por outro lado, os servos contínuos oferecem rotação contínua em qualquer direção, sendo adequados para aplicações que exigem movimento contínuo, como motores de rodas para pequenos robôs ou veículos.

Ao decidir entre servos posicionais e contínuos, considere os requisitos específicos do seu projeto. Se precisa de controlo preciso da posição do servo, o servo posicional é a melhor opção. No entanto, se precisa de movimento contínuo ou da possibilidade de modificar o servo para aplicações específicas, o servo contínuo é a escolha mais indicada.

Neste artigo, focámo-nos nas especificidades dos micro servos SG90, que são muito usados em projetos de hobby devido ao seu tamanho reduzido e preço acessível. No entanto, os conceitos discutidos aplicam-se também a outros motores servo.

Em resumo, perceber as principais características e diferenças entre servos posicionais e contínuos é essencial para escolher o motor servo certo para o seu projeto. Considere os requisitos e aplicações específicas e escolha em conformidade. Boas experiências com servos!

Nota

Implementamos uma função especial rotate() que faz o mapeamento de ângulos ou velocidades para durações de pulso. A função attach() da Servo library tem dois parâmetros adicionais (min e max) que conseguem um efeito semelhante.

attach(pin, min, max)

No entanto, isto não permite ajustar o ponto médio e, para velocidades de -100% a +100%, seria necessário um mapeamento separado. Por isso, optámos pela solução mais genérica apresentada acima.

Conclusões

Neste tutorial aprendeu as diferenças entre servos posicionais e contínuos.

Para mais informações sobre servos contínuos, veja o nosso tutorial sobre How to Control a 360 Degree Servo Motor with Arduino. Para servos posicionais, consulte o tutorial How to control servo motors with Arduino e, se quiser controlar um servo com um comando IR, leia o tutorial How to Control a Servo with an IR Remote.

Se tiver dúvidas, sinta-se à vontade para as deixar na secção de comentários.

Boas experiências e bons projetos ; )