Controlar um Servomotor com Arduino sem livrarias

Neste tutorial, vai aprender a controlar um servomotor com Arduino sem usar livrarias. O problema em utilizar uma livraria é que pode entrar em conflito com outras livrarias. Por essa razão vamos hoje demonstrar como fazer este controlo sem livrarias adicionais.

 

Controlo do servomotor

Um servomotor controla-se através de um ‘comboio’ de pulsações elétricas de duração variável, a duração destas pulsações serve para determinar o ângulo em que o servo se vai posicionar.

Por norma geral, os servos aceitam uma pulsação cada 2.5ms, se enviamos uma pulsação de 1.5ms o servo vai-nos girar a 90º, um pulso de 0.5ms vai colocar o servo a 0º e uma pulsação de 2.5ms e vai colocá-lo a 180º. Estes valores são aproximados e podem variar ligeiramente segundo o servomotor que estamos a usar.
 

Sketch de ensaio

Agora vamos ver como enviar este ‘comboio’ de pulsações ao servomotor. Sabendo que para conseguir 180º no servomotor deve-se enviar uma pulsação de aproximadamente 2500 microsegundos podemos aplicar uma regra de três:

tempo = (ângulo x 2000) / 180 + 500

A função moverServo recebe como parâmetros o pino do Servomotor e o ângulo que deve girar. Usamos a regra dos 3 para calcular o tempo que deve estar acendido do pino digital do servo. O código está comentado linha a linha para um melhor entendimento:

 

int servoPin = 9;  //Conetamos o servo ao pino digital 9

void setup()
{
 pinMode(servoPin, OUTPUT);     // Declaramos o pino digital 9 como saída
 digitalWrite(servoPino, LOW);   // Colocamos o pino digital 9 em LOW
}

void loop() {
// Chamamos a função "moverServo(pino, graus);" 
// o comboio de pulsações, já que cada ciclo apenas pode enviar uma pulsação 
moverServo(servoPino, 180);      
}

// Função para simplificar a regra dos 3 (modificada para um servomotor Tower PRO SG90)
void moverServo(int pino, int angulo)    // Recolhemos as variáveis PIN e ANGULO em cada chamada 
{
   float pausa;                         // Declaramos a variável float para recolher os resultados da regra dos 3
   pausa = angulo*2000.0/180.0 + 700;   // Calculamos a largura da pulsação aplicando a regra dos 3
   digitalWrite(pino, HIGH);             // Colocamos o pino em HIGH 
   delayMicroseconds(pausa);            // Esperamos com o pino em HIGH durante o resultado da regra dos 3
   digitalWrite(pino, LOW);              // E colocamos de novo o pino em LOW
   delayMicroseconds(25000-pausa);      // Completamos o ciclo e começamos um novo para criar assim o comboio de pulsações
}

Controlar a velocidade da rotação

Se testou o código anterior vai comprovar que o servomotor roda muito rápido e às vezes isto não nos interessa, para controlar a velocidade da rotação do servomotor podemos modificar ligeiramente o código e adicionar um laço FOR. O código esta comentado linha a linha:

 

int servoPin = 9;  //Conetamos o servo ao pino digital 9
int lapausa = 20;  // Declaramos uma variavel de tipo INTEGER para regular o movimento do servo

void setup()
{
 pinMode(servoPino, OUTPUT);     // Declaramos o pino digital 9 como saida
 digitalWrite(servoPino, LOW);   // Colocamos o pino digital 9 em LOW
}

void loop() {
for(int i = 0; i < 180; i++) // Iniciamos um laço de 0 a 180 graus
{
  moverServo(servoPino, i);   // Movemos um pouco o servomotor 
  delay(pausa);            // Fazemos um delay definido pela variável "pausa"
} 
}

// Função para simplificar a regra dos 3 (modificada para um servomotor Tower PRO SG90)
void moverServo(int pino, int angulo)    // Recolhemos as variaveis PIN y ANGULO em cada chamada 
{
   float pausa;                         // Declaramos a variavel float para recolher os resultados da regra dos 3
   pausa = angulo*2000.0/180.0 + 700;   // Calculamos a largura da pulsação aplicando a regra dos 3
   digitalWrite(pino, HIGH);             // Colocamos o pino em HIGH 
   delayMicroseconds(pausa);            // Esperamos com o pin em HIGH durante o resultado da regra dos 3
   digitalWrite(pino, LOW);              // E colocamos de novo o pino em LOW
   delayMicroseconds(25000-pausa);      // Completamos o ciclo e começamos um novo para criar assim o comboio de pulsação
}

Gostaram deste artigo ? Deixem o vosso comentário no formulário a baixo.

Não se esqueçam de fazer like na nossa página no facebook.

Todos os produtos utilizados neste artigo podem ser encontrados na loja de componentes eletrónicos ElectroFun.

Comments

Comentários

ArduinoPortugal.pt:
Related Post