Servomotores

283 Flares Twitter 0 Facebook 283 Google+ 0 283 Flares ×

Um servomotor é um atuador eletromecânico utilizado para posicionar e manter um objeto em uma determinada posição. Para isso, ele conta com um controle de malha fechada que permite o cálculo do erro de sua posição atual de modo a sempre se manter na posição desejada. Diferentemente dos motores CC ou motores de passo que podem girar indefinidamente, o eixo dos servomotores possui a liberdade de apenas 180º. Entretanto os servos podem ser modificados para uma rotação contínua ou já possuírem essa característica de fábrica como o DS04 – NFC. Este tipo de servo é interessante pois dispensa o uso de uma ponte H.

 

Hardware

Servomotores geralmente possuem 3 pinos:

  • Alimentação positiva (vermelho) – 5V;
  • Terra (Preto ou Marrom) – GND;
  • Controle. (Amarelo, Laranja ou Branco) – Ligado a um pino de entrada e saída;

Atenção!!

Servomotores consomem uma corrente significativa ao se movimentarem. A utilização de uma fonte externa pode ser necessária e é recomendada. Lembre-se de conectar o pino GND da fonte externa ao GND do Arduino para que a referência seja a mesma.

Apesar de sua posição ser controlada através do duty cycle de um sinal PWM enviado ao pino de controle não é necessária a conexão do pino de controle a um pino que possua PWM, pois utilizaremos a biblioteca Servo.h.

A utilização de analogWrite produzirá um controle de menor precisão e poderá até danificar alguns servos por sua frequência (490 Hz) ser 10 vezes superior a frequência típica de controle de alguns servos.

 

Software

Na elaboração do software utilizaremos a biblioteca Servo.h. Esta biblioteca implementa as  funcionalidades de um servomotor tornando sua utilização extremamente simples. Entretanto alguns cuidados devem ser tomados:

A biblioteca suporta a ligação de até 12 servomotores na maioria das placas Arduino e 48 no Arduino Mega. O uso da biblioteca desabilita o usa da função analogWrite nos pinos 9 e 10 (*exceto no Arduino Mega). No Mega o uso de 12 a 23 servomotores desabilitará o a função analogWrite nos pinos 11 e 12.

 

Conectando e Desconectando o Servo

A função attach conecta o servo a um canal de controle. Esta função retornará o canal na qual o servo foi conectado ou zero se falhar.

uint8_t  servo.attach(pino, min, max);
  1. pino: pino na qual o controle do servo está conectado.
  2. min (opcional): largura de pulso em microssegundos correspondente a posição de 0 graus.
  3. max (opcional): largura de pulso em microssegundos correspondente a posição de 180 graus.

 bool  servo.attached();

void  servo.detach();

As funções attached e detach podem ser utilizadas para checar se um servo está conectado ou desconectá-lo respectivamente.

 

Controlando a Posição do Servo

A função write define em um servo padrão o ângulo em graus na qual ele deve se posicionar. Em servos de rotação contínua essa função define a velocidade do servo onde 0 corresponde a velocidade máxima em um sentido 180 a velocidade máxima no sentido oposto e 90 velocidade nula.

void  servo.write(valor);
  1. valor: posição em graus para servos comuns ou velocidade para servos de rotação contínua.

Exemplo de Código 1

Nesse exemplo faremos com que o servo faça uma varredura de N passos.

#include <Servo.h>

const uint8_t servo_pin = 8; // Pino onde o controle do servo está conectado;
const uint8_t steps = 10; // Quantidade de passos, deve ser maior ou igual a 2;

Servo servo; // Constrói objeto;

void setup() {
  Serial.begin(9600);
  servo.attach(servo_pin); // Conecta o servo a um canal;
  servo.write(0); // Manda o servo para a posição 0 graus;
  delay(1000);
  /* Utilizado para detectar se o Arduino esta resetando
     devido a uma possível sobrecarga causada pelo servo */
  Serial.println(".");
}

void loop() {
  // Varre de 0 a 180 graus
  for (uint8_t pos = 0; pos < 180; pos += 180/(steps-1)) {
    servo.write(pos); // Determina a nova posição;
    delay(1000/steps); // Espera o servo chegar na posição específicada;
  }
  // Varre de 180 a 0 graus
  for (uint8_t pos = 180; pos > 0; pos -= 180/(steps-1)) {
    servo.write(pos); // Determina a nova posição;
    delay(1000/steps); // Espera o servo chegar na posição específicada;
  }
}

Exemplo de Código 2

Nesse exemplo nós conectaremos um sensor ultrassônico ao servo motor e faremos com que o servo faça uma varredura de N passos.

#include <Servo.h>

const uint8_t trig_pin = 10;
const uint8_t echo_pin = 9;

const uint8_t servo_pin = 8; // Pino onde o controle do servo está conectado;
const uint8_t steps = 10; // Quantidade de passos, deve ser maior ou igual a 2;

Servo servo; // Constrói objeto;

void setup() {
  Serial.begin(9600);

  // Configuração do estado inicial dos pinos Trig e Echo.
  pinMode(trig_pin, OUTPUT);
  pinMode(echo_pin, INPUT);
  digitalWrite(trig_pin, LOW);

  servo.attach(servo_pin); // Conecta o servo a um canal;
  servo.write(0); // Manda o servo para a posição 0 graus;
  delay(1000); 

  /* Utilizado para detectar se o Arduino esta resetando
     devido a uma possível sobrecarga causada pelo servo */
  Serial.println(".");
}

/* Posiciona o servo, calcula a distância utilizando
   o sensor ultrassônico e imprime na porta serial.  */

void ping(const uint8_t& pos) {
  servo.write(pos); // Determina a nova posição;
  delay(1000/steps); // Espera o servo chegar na posição específicada;

  // Pulso de 5V por pelo menos 10us para iniciar medição.
  digitalWrite(trig_pin, HIGH);
  delayMicroseconds(11);
  digitalWrite(trig_pin, LOW);

  /* Mede quanto tempo o pino de echo ficou no estado alto, ou seja,
  o tempo de propagação da onda. */
  uint32_t pulse_time = pulseIn(echo_pin, HIGH);

  /* A distância entre o sensor e o objeto será proporcional a velocidade
    do som no meio e a metade do tempo de propagação. Para o ar na
    temperatura ambiente Vsom = 0,0343 cm/us. */
  double distance = 0.01715 * pulse_time;

  // Imprimimos o valor na porta serial;
  Serial.print(distance);
  Serial.println(" cm");
}

void loop() {
  // Varre de 0 a 180 graus
  for (uint8_t pos = 0; pos < 180; pos += 180/(steps-1)) {
    ping(pos);
  }
  // Varre de 180 a 0 graus
  for (uint8_t pos = 180; pos > 0; pos -= 180/(steps-1)) {
    ping(pos);
  }
}

Apostila Arduino 800px

283 Flares Twitter 0 Facebook 283 Google+ 0 283 Flares ×

Rodolfo Picoreti

Estudante de Engenharia Elétrica e integrante do PET Elétrica UFES.

You may also like...

  • Matheus

    Boa tarde, estou com uma dúvida.. se eu quiser que o servo vire as rodas da frente do meu carrinho para esquerda ou direita, como eu ligaria as rodas no motor ? Será que poderia me ajuda com um esquema ?
    Obrigado

  • Euclides Rezende

    Bem confuso…a biblioteca é a que vem com o Arduino? Ou tem que baichar de outro lugar? Esta biblioteca transforma todos os pinos em PWM? Ou só dá para usar os já configurados do Arduino? Viu? como falta informação?