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).
É 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;
Vejamos o programa:
// Controlando a posicao do servo SG90
// Por Carlos L. Pires, 2017
#include
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);
O programa ficará:
#include
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