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.
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.