Um servomotor é um atuador eletromecânico utilizado para posicionar e manter um objeto em uma determinada posição. Para isso, ele conta com um controlo de malha fechada que permite o cálculo do erro de sua posição atual de modo a manter se na posição desejada. Diferentemente dos motores DC ou motores de passo que podem girar indefinidamente, o eixo dos servo motores possui a liberdade de apenas 180º. Entretanto os servos podem ser modificados para uma rotação contínua ou já possuírem essa caraterística de fábrica.
Este tipo de servo é interessante pois dispensa o uso de uma ponte H.
Hardware
Servo motores geralmente possuem 3 pinos:
- Alimentação positiva (Vermelho) – 5V VCC
- Terra (Preto) – GND;
- Sinal (Amarelo, Laranja ou Branco) – Ligado a um pino de saída digital do nosso Arduino
Cuidados a ter
Servo motores consomem uma corrente significativa ao se movimentarem. A utilização de uma fonte externa pode ser necessária e é recomendada. Lembre-se de ligar 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 ligação do pino de controle a um pino que possua PWM, pois utilizaremos a biblioteca Servo.h.
A utilização de analogWrite produzirá um controlo 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 Arduino Mega o uso de 12 a 23 servomotores desabilitará o a função analogWrite nos pinos 11 e 12.
Ligando e desligando o Servomotor
A função attach liga o servo a um canal de controlo. Esta função retornará o canal na qual o servo foi ligado ou zero se falhar.
uint8_t servo.attach(pino, min, max);
- pino: pino na qual o servomotor está ligado.
- min (opcional): largura de pulso em microssegundos correspondente a posição de 0 graus.
- 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 verificar 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 (zero) corresponde a velocidade máxima em um sentido 180 a velocidade máxima no sentido oposto e 90 velocidade nula.
void servo.write(valor);
- valor: posição em graus para servos comuns ou velocidade para servos de rotação contínua.
Exemplo de Código 1
Neste 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 controlo do servo está conetado; 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); // Coneta o servo a um canal; servo.write(0); // Manda o servo para a posição 0 graus; delay(1000); /* Utilizado para detetar 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 ligaremos um sensor ultrassônico ao servo motor e faremos com que o servo faça uma varredura de N passos.
#include 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á conetado; 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 detetar se o Arduino esta a reiniciar devido a uma possível sobrecarga causada pelo servo */ Serial.println("."); } /* Posiciona o servo, calcula a distância utilizando o sensor ultrassonico 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 especificada; // 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); } }
Artigo gentilmente cedido por Vida de Silicio
Todos os produtos utilizados neste artigo podem ser encontrados na Loja de Eletrónica e Robótica – ElectroFun.
Gostaram deste artigo? Deixem o vosso comentário no formulário a baixo e partilhem com os vossos amigos.
Não se esqueçam de fazer like na nossa Página no Facebook.
Podem ainda colocar as vossas dúvidas no nosso Forum da Comunidade Arduino em Portugal ou no nosso Grupo no Facebook Arduino Portugal – Qual o teu projeto?