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.
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) ?
Olá Rodrigo,
Você pode fazer isso no código, não sei se vai usar um timer ou botões, caso for utilizar um timer de uma olhada no site do arduino (arduino.cc) lá na documentação as funções delay() ou sleep().
Caso for utilizar botões lá também tem um tutorial (http://arduino.cc/en/Tutorial/Button).
Bons estudos!
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
Olá José,
Não sei extamente como está a sua implementação, mas você consegue controlar isso no seu código com um “if” bem simples.
Recomento a leitura também deste post:
http://www.renatopeterman.com.br/blog/2010/07/28/controlando-servo-motor-a-partir-do-teclado-com-arduino-e-c/
Boa sorte!
renato, boa tarde, eu estou com duvida em qual é a ordem da pinagem da porta serial mais adequada para realizar esse controle. desde ja eu agradeço
Olá Madson, tudo bem ?
Desculpe, mas não entendi muito bem a sua pergunta.
Você está utilizando o Arduino ?
Renato
Olá amigo,
estou com problemas em encontrar um software par comunicar o APC220 ao pc!
agradeço muito a ajuda.
Olá Narramor,
Infelizmente nunca mexi com esse módulo e não vou poder lhe auxiliar.
Tenho certeza que deve haver tutoriais ou alguma documentação na web que possa lhe auxiliar, de uma pesquisada no fórum do arduino (http://www.arduino.cc/forum/).
Renato
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
Muito bom a dica. vlw
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á.