Controlando dois (ou mais) servo motores com Arduino.

Já recebi varios e-mails perguntando se é possível controlar dois ou mais servo motores com o Arduino, fiquei de postar o código aqui mas sempre acabava esquecendo.

Como você já deve ter visto, no projeto que desenvolvi com o Emotiv Epoc + Arduino utilizo dois servo motores para representar o protótipo.

Se é a primeira vez que você vai se aventurar com Arduino e servo motores, aconselho dar uma lida neste post (Controlando Servo Motor utilizando o teclado com Arduino e C#), e claro, para isso, é necessário que você já tenha um mínimo de conhecimento no assunto. Caso queira pesquisar mais, sugiro que de uma olhada no site oficial do Arduino (arduino.cc).


O conceito é o mesmo do post em que mostro como controlar um servo a partir do teclado com C#. Então, se você entendeu e deu tudo certo lá, não terá problemas com essa modificação.

O que eu fiz foi colocar um bloco “if” e fazendo a verificação da string de entrada via serial para identificar para qual servo motor queremos enviar o comando.

É simples, no projeto com apenas um servo, enviamos uma string, por exemplo: “180″, e o servo movimenta 180 graus. Com dois, acrescentamos um caracter ao final, por exemplo: “180a”, movimentamos o servo A 180 graus.

Abaixo segue o código na íntegra do programa.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
//Biblioteca do Arduino para
//controlar Servo Motores
#include <Servo.h>

Servo servo1;
Servo servo2;

char buffer[4];
int received;

void setup(){
 
  //Inicia a porta serial
  Serial.begin(9600);
 
  //Atribui as entradas do Arduino
  //as variaveis
  servo1.attach(8);
  servo2.attach(9);
 
  //Movimentamos ambos os motores para 90 graus
  servo1.write(90);
  servo2.write(90);
 
  received = 0;
}

void loop(){
 
  //Verifica se possui alguma entrada de dados
  //na entrada Serial
  if(Serial.available()){
   
    char c = Serial.read();
   
    // Se o "c" for igual ao caracter "A" (97 na tabela ASCII)
    if(c == 97){
      Serial.println(buffer);
      int numero = atoi(buffer);
      servo1.write(numero);
      received = 0;
    }
   
    // Se o "c" for igual ao caracter "B" (98 na tabela ASCII)
    if(c == 98){
      Serial.println(buffer);
      int numero = atoi(buffer);
      if(numero >= 60){
        servo2.write(numero);
        received = 0;
      }
      received = 0;
    }
   
    if(c != 97 && c != 98){
      buffer[received++] = c;
    }
   
    Serial.flush();
  }

}

No código acima os servos foram conectados as entradas 8 e 9 no Arduino.

Como você deve já ter observado, a comparação é feita utilizando o código do caracter de acordo com a tabela ASCII.

Se você precisar controlar mais de dois servo motores, é só implementar mais condições (seria mais elegante usar o bloco “switch”) e utilizar outros caracteres (da tabela ASCII) para se identificar os motores.

Não sei se essa é a forma mais elegante de se implementar isto, mas foi uma solução que encontrei quando me deparei com este problema, se alguém possui alguma outra forma, por favor contribua. ;)

Acho que é isso ai pessoal.

Como eu disse anteriormente, se você já seguiu este tutorial não terá problema algum em entender o funcionamento e vai lhe servir muito bem.

Bons estudos, e qualquer dúvida estou a disposição.

11 ideias sobre “Controlando dois (ou mais) servo motores com Arduino.

  1. Renato, como modificar para os servos trabalharem sozinhos a partir de um start e pararem em um stop (como um botão para parada de emergência) ?

  2. Como posso implementar a utilização de um receptor de modelismo para fazer com que os servos acionem a partir dos sinais recebidos por ele?

    Os receptores recebem sinais PWM e acionam diretamente os servos, porém preciso fazer com que ao acionar um servo o outro fique inativo e vice-versa.

    Grato

  3. Olá amigão, tudo bem? Tem como eu controlar 4 servos INDEPENDENTES? É que eu tava vendo aqui na internet e cheguei a conclusão de que para controlar servomotores independentes um do outro pelo arduino, eu teria que comprar aquele “Motor drive shield”. Porém, esses drives só comportam 2 servos ou 4 motores DC, e eu precisava realmente de 4 servos no meu projeto. Tem alguma dia pra me dar? Desde já agradeço, muito obrigado! Adriano. adrianoroad@hotmail.com

  4. Renato, boa tarde. Espero que vc possa me ajudar… Sou fonoaudióloga e estou a procura de pessoas que tenham mais informações, principalmente, sobre o Emotiv Epoc. Não consigo encontrar em sites de pesquisa…
    Por gentileza, quando e se puder, entre em contato comigo pelo annaintini@gmail.com

    Agradeço desde já.

Deixe uma resposta

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

*

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>