12 - Servo Motores

12 - Servo Motores

12 – SERVO MOTORES

Servos são "máquinas" com motores que giram um determinado ângulo.

Usaremos como exemplo o "Tower Pro 9g SG90 Micro Servo"

(dados técnicos em http://akizukidenshi.com/download/ds/towerpro/SG90.pdf).

281_sg90

É aconselhável usar uma fonte externa e não os 5V do próprio Arduino. Conforme a carga aplicada, o Arduino pode não suportar a corrente deste servo. No nosso exemplo, sem carga, podemos alimentar o servo com os 5V do arduino.

Segundo o fabricante, o eixo do servo leva cerca de 300 milisegundos para girar os 180 graus (de 0º a 179º). Adquiri vários destes servos na robocore (R$ 19,00 em 2017) e servem muito bem para pequenas aplicações. É claro que não teriam capacidade para administrar os controles de um aeromodelo a jato...

O que precisamos?

... uma biblioteca (librarie) que possua um programa para "administrar" o servo motor (ela já vem na instalação do aplicativo do Arduino no seu computador, a ). No meu caso ela estava na pasta F: arduino-nightlylibrariesServosrcServo.h

... uma saída PWM no Arduino para acionar o servo;

282_sg_ardu

Vejamos o programa:

 

// Controlando a posicao do servo SG90

// Por Carlos L. Pires, 2017

 

#include  //carrega a biblioteca chamada Servo.h, com as instruções para o servo motor

Servo sv1; // cria um objeto chamado sv1 (sg90)

int unsigned grau; //angulo do eixo do servo

 

void setup() //**********************************************************

{

sv1.attach(9); // Definir (atar) pin 9 para o servo sv1. Deve ser uma saida PWM modulada de 0 a 179

} //*********************************************************************

 

void loop() //####################################################### LOOP

{

sv1.write(0); // Move o eixo do servo para a posicao inicial 0 graus

delay(1000); // Aguarda o servo atingir a posicao e um tempo para observacao

sv1.write(30); //Move o eixo para 30º

delay(1000); //idem

sv1.write(60); // gira a 60º

delay(1000); //idem

sv1.write(90); //posicao a 90º

sv1.write(135); //posição a 135º

delay(1000); //idem

sv1.write(179); //posicao final

delay(3000); //espera 3 segundos

 

//a rotina seguinte faz o eixo voltar a posicao 0º, de um em um grau

for (grau = 179; grau = 0; grau--) //variável "grau" que decresce de 179 a 0 em uma unidade de cada vez

{

sv1.write(grau); //muda o angulo do servo

}

delay(5000); //aguarda 5 segundos antes de reiniciar o loop

} //########################################################## FIM DO LOOP

 

Agora vamos usar um potenciômetro para mudar a posição do eixo do servo; como foi visto no capítulo 10 – Entradas Analógicas.

Chamaremos de "valorPot" o valor lido no pino "A0" do potenciômetro.

Chamaremos "grau" o valor da posição do servo, de 0 a 179.

Usaremos a instrução variável 2 = map(variável 1, inicio 1, fim 1, inicio 2, fim 2); onde:

- variável 2 será a variável cuja faixa de valores queremos mudar

- variável 1 será a variável com os valores iniciais, no caso a leitura do potenciômetro

- inicio 1 é o valor inicial da leitura "analógica" do potenciômetro, ou 0

- fim 1 é o valor final da leitura do potenciômetro, ou 2048

- inicio 2 é o inicio da nova faixa de valores a serem convertidos, neste caso 0

- fim 2 é o ultimo valor, correspondente a 2048, que no nosso caso é 179

A instrução ficará:

grau = map(valorPot, 0, 2048, 0, 179);

291_sg_pot

O programa ficará:

#include   //inclui a biblioteca chamada Servo.h, com as instruções para o servo motor

Servo sv1; // cria um objeto chamado sv1 (sg90)

int unsigned valorPot; //valor inteiro positivo lido no potenciomentro

int unsigned grau; //valor inteiro positivo aplicado no servo

 

void setup() //**********************************************************

{

  pinMode(A0, INPUT_PULLUP); // Define pino A0 para leitura analogica do potenciometro

  sv1.attach(9); // Define pin 9 (PWM) para o servo sv1

} //*********************************************************************

 

void loop() //####################################################### LOOP

{

  valorPot = analogRead(A0); //Le a posicao do cursor do potenciomentro

  //converte o valor do potenciomentro para o valor do servo

  // grau = map(valorPot, 0, 1024, 0, 180);  //sentido antihorario

  grau = map(valorPot, 0, 1024, 180, 0); //sentido horario

  //outra opcao seria inverter as polazicoes + e - no potenciometro

  sv1.write(grau); // Move o eixo do servo para a posicao indicada

  delay(5); // Aguarda o servo atingir a posição

 } //########################################################## FIM DO LOOP