0

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

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

To use BrandCaptcha you must get an API Key