– Arduino + Motor Servo

Boas Pessoal…

Mais uma vez cá estou eu para mais um pequeno tutorial…

Bom depois de toda a tarde a ver se conseguia fazer um “hack” qualquer no meu motor shield para controlar servos, o certo é que nao consegui… E Desisti, porque a partir de certa altura achei que tava a desperdiçar tempo…

Entao decidi estudar um pouco a biblioteca que nos permite controlar tao facilmente os servos (Servo.h), e decidi entao fazer dois tutoriais pelo preço de um… 😀 😀 😀

Espero que gostem….

Material Necessario (Hardware):
– Servo
– Arduino
– Potenciometro
– 6x Fios De ligação
– Rectangulo de Pele (ou outro material nao condutor) para proteger o arduino
– Cabo USB
– Computador
– BreadBoard

Material Necessário (Software):
– Arduino 0017 (Disponivel em arduino.cc)

1º Passo

Primeiro que tudo temos de recolher todo o material necessario e ter uma secretaria minimamente limpa para puder trabalhar á vontade..

2º Passo

– Ligar o fio branco da ficha do servo no pino 8 do nosso arduino.
– Ligar o fio vermelho da ficha do servo no pino 5v do nosso arduino.
– Ligar o fio preto da ficha do servo no pino GND do nosso arduino.

3º Passo

Abrir o programa Arduino 0017.
Visitar este link para se ficar a conhecer melhor a biblioteca Servo.h.

Depois de esturdar-mos um pouco a biblioteca referida em cima, vamos entao proceder á programação.

4º Passo

Depois de vermos do que a bliblioteca é capaz passemos á programação. Em baixo fica o codigo que alterei para melhor compreensão.

Está tudo comentado para que todos os que se iniciem em programação nao tenham grande dificuldade em perceber qualquer parte do codigo aqui estudado.

#include // Biblioteca que permite controlar mais facilmete os Servos
Servo servo1; // Criação de um objecto que permitira controlar o servo

int posicao = 0; // inicialização da variavel posiçao a 0
int contagem = 0; // inicialização da variavel posiçao a 0
void setup()
{
servo1.attach(8); // Porta onde ira ser ligado o servo
}

void loop()
{
if (contagem < 20){ // Condiçao, se a variavel contagem for menor que 20 faz o codigo que esta ente {}
for(posicao = 0; posicao < 180; posicao +=1) // Servo gira da posiçao 0 para a posiçao 180 de 1 em 1 grau { servo1.write(posicao); // “Escreve” no pino 8 a posiçao para onde o servo se vai deslocar delay(3); // Espera de 3 milisegundos para que o servo possa chegar á sua posiçao } for(posicao = 180; posicao>=1; posicao-=1) // Servo gira da posiçao 180 para a posiçao 0 de 1 em 1 grau
{
servo1.write(posicao); // “Escreve” no pino 8 a posiçao para onde o servo se vai deslocar
delay(3); // Espera de 3 milisegundos para que o servo possa chegar á sua posiçao
}
contagem ++; // Adiciona mais 1 á variavel contagem
}
}

Coloquei um pequeno contador para o servo nao estar infinitamente a girar para um lado e outro, assim depois de 20, que é mais que suficiente para vermos que está tudo ok, o servo para.

5º Passo

Vamos agora proceder ao Upload do codigo para o arduino.

Primeiro ligamos o USB ao Arduino

FOTO INDISPONIVEL

Depois ao PC

Depois é so carregar no botao de Upload

E por fim esperar que no canto inferior esquerdo apareça a mensagem “Done Uploading”

NOTA: Se neste passo acontecer algo e nao aparecer essa mensagem, recomendo a verificarem o codigo e/ou se o cabo está correctamente ligado ao PC e ao Arduino.

6º Passo

Testar o servo com o potenciometro e sem o potenciometro.

(Video Brevemente Disponivel) -> Tou sem Camera…

Montagem com potenciometro

Para controlarmos um servo com um potenciometro teremos que seguir estes passos…

A – Ligar o terminal do meio do potenciometro a um dos pinos analogicos do arduino (eu utilizei o 0).

B – Ligar o terminal de um dos lados do potenciometro aos 5v do nosso arduino

C – Ligar o ultimo terminal ao GND do arduino

D – Ligar o fio preto ao GND do arduino.

E – Ligar o fio vermelho ao terminal do potenciometro onde se encontram os 5v (provenientes do arduino)

F – Ligar o fio branco do servo a um pino do arduino (Eu utilizi o 8 )

G – Utilizando a mesma biblioteca (Servo.h) vamos entao programar o nosso Atmega para que se possa controlar o servo pelo potenciometro…

Comentei todo o codigo para que todos facilmente o entendam…

#include // Biblioteca que permite controlar mais facilmete os Servos

Servo servo1; // Criação de um objecto que permitira controlar o servo

int pinopot = 0; // Declaração da variavel para o pino que vai ler o valor do potenciometro, neste caso é o pino analogico 0
int valor; // Declaração da variavel onde vai ser colocado o valor lido do pino analogico 0

void setup()
{
servo1.attach(8); // Porta onde ira ser ligado o servo
}

void loop()
{
valor = analogRead(pinopot); // leitura do valor do potenciometro e “escrita” desse valor na variavel valor
valor = map(valor, 0, 1023, 0, 179); // Escala para que o valor do potenciometro possa corresponder a um valor de posiçao no servo
servo1.write(valor); // Gira o servo de acordo com a escala da linha acima
delay(1); // Espera de 1 milisegunda para que o servo possa atingir a sua posiçao
}

Depois do passo “G” é so continuar com o 5º e 6º passo mencionados em cima…

Espero que tenham Gostado e peço desculpa por algum erro…

Cumps
AndréD.

Comentários
  1. Ronaldo diz:

    Ola Amigo, Sou novato com arduino e não tenho muita experiência nesse assunto antão talvez você possa tirar essa duvida quando faço a alimentação do arduino externamente o servo obedece ao comandos perfeita mente e o giro é suave e continuo até o ponto desejado mais ao fazer a alimentação via usb o movimento e feito com pausas ou seja parecendo que o servo esta travando (tanto para um servo de parabólica e um mg995) você sabe qual o problema e se tem solução pois quero usar a comunicação serial para controlar o servo e não consegui alimentá-lo externamente mantendo a conexão serial fico grato pela reposta se a mesma vier
    Parabéns pelo site ótimo post.

    • Gustavo diz:

      Eu estou com o mesmo problema no meu servo motor, ainda nao testei usar a fonte do arduino, porém por enquanto que estou usando a USB, ele se movimenta pausadamente e interfere no funcionamento do resto do circuito(relés etc…) vou tentar com a fonte para ver se resolve….

  2. Bruno Valada diz:

    Boas, eu ja ando a trabalhar no arduino a algum tempo, e agora estou a realizar um projeto de final de curso, a minha duvida é … um servo vai fechar uma porta se a temperatura for elevada, se não ele abre a porta, eu ando de volta do codigo, mas u servo acaba sempre por girar para os dois lados, sendo que eu quero que ele gire para um lado se temperatura estiver elevada…… para… e se detetar temperatura normal, ele gira para o outro….. a parte do sensor de temperatura esta a funcionar bem… agora servo nem por isso.
    Seme poder ajudar agradeço
    cumprimentos

  3. Filipe diz:

    #include

    #define SERVO 6 // Porta Digital 6 PWM

    Servo s; // Variável Servo
    int pos; // Posição Servo

    void setup ()
    {
    s.attach(SERVO);
    Serial.begin(9600);
    s.write(0); // Inicia motor posição zero
    }

    void loop()
    {
    for(pos = 0; pos < 90; pos++)
    {
    s.write(pos);
    delay(15);
    }
    delay(1000);
    for(pos = 90; pos < 0; pos–)
    {
    s.write(pos);
    delay(15);
    }
    }

  4. Filipe diz:

    Boa tarde!

    Poderia me ajudar?

    Consigo fazer meu servo se movimentar de 0 a 180 graus (indo e vindo), e no meio desse movimento quero que ao pressionar um botão o servo pare,veja quantos graus esta e ande mais 5 graus e se mantenha parado.

    Explicando melhor: tenha uma garra robótica que ao detectar que pegou um objeto (botão foi pressionado) quero que ele veja quantos graus andou ( botão foi pressionado e estava em 90 graus) quero que ele ande mais 5 graus e pare (95 graus) (para detectar e segurar com firmeza o objeto)

    Segue o código que tenho:

    #include

    Servo myservo; // create servo object to control a servo

    // a maximum of eight servo objects can be created

    int pos = 0; // variable to store the servo position

    void setup()
    {
    myservo.attach(9); // attaches the servo on pin 9 to the servo object
    }
    void loop()

    {

    for(pos = 0; pos =1; pos-=1) // goes from 180 degrees to 0 degrees

    {

    myservo.write(pos); // tell servo to go to position in variable ‘pos’

    delay(15); // waits 15ms for the servo to reach the position

    }

    }

Deixe uma resposta para Bruno Valada Cancelar resposta