Framework Arduino II: Aula 22 Servo Motor

imagem meramente ilustrativa


Introdução

   Outro elemento muito utilizado em projetos robóticos e de modelismo são os servo motores. Com eles podemos dar movimentos a braços robóticos, movimentar sistemas de direcionamento em miniaturas de barcos e aeromodelos, etc. Esse será o nosso assunto de hoje.

Exemplo do que se pode fazer com servo motores
Exemplo do que se pode fazer com servo motores

Entendendo o que é um Servo Motor

    Um servo motor é um mecanismo eletromecânico que transforma energia elétrica em movimento de forma semelhante a um motor, porém, ao invés de executar um movimento giratório contínuo, os servos executam movimentos angulares de no máximo meia-volta.

    Internamente um servo motor é constituído por um motor, um conjunto de engrenagens para lhe aumentar o seu torque e um conjunto controlador que permite movimento precisos em diferentes velocidades e posicionamentos. 

    Nesse conjunto controlador podemos ter um potenciômetro e/ou um encoder atrelado ao eixo do motor para fornecer informações de posição e velocidade para os devidos ajustes do circuito.

Tutorial da Solid Works que ilustra um Servo Motor

    Externamente o servo possui um case que encapsula todo o conjunto, dando a ele proteção e um formato bem característico.  A um rotor externo das engrenagens pode ser acoplado três tipos de braço atuadores: simples, duplo e cruzeta, que podem acionar outros mecanismos articulados de um projeto.

Exemplo de Servo Motor para Arduino com os três tipos de braços atuadores
Exemplo de Servo Motor para Arduino com os três tipos de braços atuadores

Exemplo de mecanismos comercializados para servo motor
Exemplo de mecanismos comercializados para servo motor

         Em termos de especificações, os servo motores mais utilizados para projetos maker com Arduinos trabalham de 3 a 6V, com corrente de operação em torno de 220 mA, ângulo máximo de 180º, velocidade de 0,12 seg/60 Graus (4,8V) sem carga e um torque variando de 1,2 kg.cm (4,8V) a 1,6 kg.cm (6,0V). Geralmente possuem um cabo com três terminais, sendo um VCC, um GND e outro para sinal PWM.

    Cabe esclarecer que existem diversos tipos e modelos de servo motores disponíveis para projetos embarcados. Temos, por exemplo, os servos lineares onde um braço se estende para frente e trás. 

Recomendações da Arduino

    Segundo a documentação do Arduino é recomendável o uso de uma fonte externa de alimentação para os servo motores, sendo recomendável a utilização de concomitante de capacitores para estabilizar o fornecimento de energia, minimizar quedas de tensão e reduzir ruído elétrico. 

    Abaixo temos uma imagem retirada da documentação da Arduino (ver referências) onde destaquei os capacitores em um circuito com o uso de potenciômetro (componente azul) para controle de um servo motor. 

Recomendação da Arduino para uso de capacitores
Recomendação da Arduino para uso de capacitores

    Para os chamados circuitos de varredura, isto é, que vão de um ponto e voltam a posição original, onde os controles são feito geralmente por dois botões, a Arduino recomenda apenas o capacitor superior da imagem de exemplo.

Bibliotecas

    Atualmente a biblioteca que tem recebido maior número de estrelas na Arduino Doc é a Adafruit PWM Servo Driver para uso com drivers deste fabricante para controle de servo motores utilizando o protocolo I2C.

    No entanto para uso genérico temos também a  Servo utilizada na maioria dos tutoriais encontrados pela Web brasileira, que permite o controle de até 12 servo motores com um único timer em um Arduino Uno com uma fonte externa de alimentação. É ela que utilizaremos nos nossos exemplos.

Montagem

    Vou disponibilizar uma montagem pronta no Wokwi mostrando o uso básico de um servo motor com dois botões de controle que o estudante poderá acessar com sua conta e salvar um cópia nos seus projetos. Não colocarei capacitor, pois o Wokwi não disponibiliza.

Montagem no Wokwi para servo motor
Montagem no Wokwi para servo motor


    Link: https://wokwi.com/projects/415297193498031105

Sketch

    O código é bem fácil. Estamos incluindo a biblioteca Servo, depois declarando as constante que vão definir os pinos usados para o sinal pwm do servo e para entradas dos botões azul e verde. Também estou declarando uma variável para armazenar a posição. 

    Na linha 6 eu estou instanciando o objeto servo1 com base na classe Servo da biblioteca e na função setup eu estou iniciando o objeto servo1 informando que ele está no pino especificado pela constante pwm. 

    Depois estou definindo os pinos dos botões como entradas. Repare que não foi necessário configurar o pino do pwm. Também iniciei o monitor serial e utilizei o método read da biblioteca para ler a posição inicial do servo. Ao executar o código repare que ele não começa exatamente em 90 graus.

    Na função loop eu estou dando um delay para capturar o pressionamento dos botões e de acordo com o botão pressionado, faço o servo se movimentar dando pulsos com o método write() em ângulos controlados pela variável posicao.  Isso está sendo feito com laços, variando o ângulo de 1 em 1.

    Quando pressionado o botão verde ele varia a posição de 0 a 180 e o azul de 180 a 0. Eu não quis complicar implementando mais coisas, mas o código está permitindo que se pressione os botões da mesma cor seguidamente. Uma sugestão para o estudante seria brincar modificando o if para uma condição dupla que impedisse  isso.

  1. #include <Servo.h>
  2. int const pwm=11;
  3. int const azul=12;
  4. int const verde=13;
  5. int posicao = 0;
  6. Servo servo1;

  7. void setup() {
  8.   servo1.attach(pwm);
  9.   pinMode(verde, INPUT);
  10.   pinMode(azul, INPUT);
  11.   Serial.begin(9600);
  12.   Serial.println(servo1.read());
  13. }

  14. void loop() {
  15.   delay(100);
  16.   if (digitalRead(verde)==HIGH){
  17.     for (posicao = 0; posicao <= 180; posicao++) { 
  18.       servo1.write(posicao);     
  19.       delay(15);      
  20.     }
  21.   }
  22.   if (digitalRead(azul)==HIGH){
  23.     for (posicao = 180; posicao >= 0; posicao--) { 
  24.       servo1.write(posicao);  
  25.       delay(15);     
  26.     }
  27.   }
  28. }

    Agora que você entendeu o básico vou deixar abaixo o link para um projeto simples de um pequeno robô disponibilizado pela Science Buddies que utiliza poucos componentes e material facilmente encontrado. O áudio está em inglês, mas a descrição contém vários links para o passo a passo do projeto. Basta clicar na imagem.

Projeto da Science Buddies para robozinho com servo motor
Projeto da Science Buddies para robozinho com servo motor


Próxima Aula                                                                                                                        Aula Anterior

Referências

ARDUINO DOCS. Servo. Disponível em <https://docs.arduino.cc/libraries/servo/> Acesso em 23 nov 2024.

ARDUINO DOCS. Noções básicas de servo motor com Arduino. Disponível em <https://docs.arduino.cc/learn/electronics/servo-motors/> Acesso em 23 nov 2024.

BLOG ELETROGATE. Servo Motor: Conheça Aplicações e Aprenda a Usar. Disponível em <https://blog.eletrogate.com/servo-motor-para-aplicacoes-com-arduino/> Acesso em 23 nov 2024.

MAKER HERO. O que é servo motor? Funcionamento, tipos e como testar. Disponível em <https://www.makerhero.com/blog/o-que-e-servo-motor/> Acesso em 23 nov 2024.

MUNDO DA ELÉTRICA. O que é Servo motor e como funciona? Disponível em <https://www.mundodaeletrica.com.br/o-que-e-servo-motor-e-como-funciona/> Acesso em 23 nov 2024.

SERVOMOTOR. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2024. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Servomotor&oldid=67609568>. Acesso em: 23 nov. 2024.