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.

27 pensou em “Controlando dois (ou mais) servo motores com Arduino.

  1. Olá, Renato.

    Estou fazendo um projeto onde trabalho e estou com uma dúvida. É possivel enviar o sinal do arduino a um servo motor de maior porte? Um com uma alimentação de 220V por exemplo. Talvez eu precisasse de uma ponte H? Se sim, tem alguma indicação de qual aponte H usar ou qualquer uma serve? Desde já agradeço.

  2. Ola !Gostei muito do programa! Eu Precisava de uma ajuda para um comando de 7 servos onde sendo controlados por controle remoto (Um Braço Robotico) preciso movimentar grau por grau nos servos segurando um botão. ou seja um botão incrementa grau a grau enquanto tiver pressionado e outro decrementa grau a grau enquanto tiver pressionado quando soltar os botões os servos devem parar onde estiverem, pode ser comando usando serial.
    Obrigado

  3. Renato, boa noite.
    Será que pode me ajudar nessa situacao?

    Tenho um sensor optico e um servo que precisam se comportar da seguinte forma.

    O servo deve iniciar em agulo 10, quando o sensor optico atuar deve manter o servo em 10, quando sair deve movimentar o servo para 90.

    Estou com bastante dificuldade com esse código, se puder axiliar fico muito grato.

    Desde já agradeço. Abraço

  4. Olá renato,estou desenvolvendo uma aplicação muito similar a sua,mas com a diferença que estou usando o NIA(neural impulse actuator),e gostaria de saber como vc fez a comunicação do programa do emotiv epoc com a plataforma arduino,por estou desenvolvendo uma protese robotica onde tenho 5 servomotores que quero controlar atraves do cerebro,de forma que o giro de cada um controla o movimento de um dos dedos da mão.
    Espero muito sua ajuda,pois estou cursando engenharia de controle e automação e esse projeto eu pretendo usar ano que vem como meu tcc.
    agradeço a atenção

    • Olá Yuri! Tudo bem?

      O seu projeto parece bem legal. Parabéns!
      O Emotiv Epoc e o NIA são de fabricantes diferentes, portanto cada um possui o seu SDK e bibliotecas. Nunca mexi com o NIA então não vou poder te ajudar diretamente com isso. Procure por fóruns no site do fabricante, e também pela documentação do equipamento, isso me ajudou bastante no desenvolvimento com o Epoc.
      A aplicação que fiz utilizando o Epoc e o Arduino está no meu github, fique a vontade para baixar e estuda-la: http://github.com/renatopeterman

      Boa sorte no projeto!

      Renato Peterman

  5. Olá, estou desenvolvendo uma aplicação C# que faz comunicação com o arduino porém estou com um problem. Na minha aplicação há um trackbar que quando eu movimento-o ele aciona um evento onde envia indices via porta serial de 0 a 255. O problema é que minha IDE arduino só vai entender decimal se eu eviar caractere ASCII, por exemplo: Quando eu envio “0” lá na IDE do arduino ele entende 48. Eu preciso de um algoritmo que converta decimal pra ASCII para que ele entenda decimal novamente lá na IDE do arduino, então quando eu mexer no trackbar e ele enviar o indice 15, por exemplo, eu quero que a IDE arduino entenda 15 quando eu for dar um serial.Read(). Você conhece algum algoritmo que converte, ou alguma forma para enviar decimal e entender decimal? Obrigado.

  6. 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) ?

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

  8. 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. [email protected]

  9. 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 [email protected]

    Agradeço desde já.

Deixe um comentário

O seu endereço de e-mail não será publicado.

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.