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.
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.
Olá Joas,
Não tenho muito conhecimento nesse tipo de situação.
Infelizmente não vou poder ajudar.
Renato Peterman
Olá, Joas.
Você deve utilizar um Driver de Potência… Dê uma pesquisada na internet.
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
Olá Leandro! Tudo bem ?
Dê uma olhada no tutorial do link abaixo, ele ensina como controlar os servos utilizando comunicação serial.
O conceito é o mesmo.
https://renatopeterman.com.br/blog/2010/07/28/controlando-servo-motor-a-partir-do-teclado-com-arduino-e-c/
Bons estudos!
Renato Peterman
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
Olá Marcelo! Tudo bem ?
O código contido nesse post é para controlar um ou mais servos.
Aconselho dar uma olhada no seguinte post: https://renatopeterman.com.br/blog/2010/07/28/controlando-servo-motor-a-partir-do-teclado-com-arduino-e-c/
Nesse link há um tutorial explicando detalhadamente como movimentar um servo pela porta serial.
Bons estudos!
Renato Peterman
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
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.
Olá Jonatas,
Você pode tentar usar as funções atoi(), atol(), ou atof() que convertem de char para int, long ou float respectivamente.
Renato
legal
Olá, estou desenvolvendo um Braço Mecanico porém gostaria de controla-los via Bluetooth com o Celular é possivél?
Existe algum tutorial modelo?
Olá Diego,
Acredito que sim.
Existem tutoriais de como integrar o Arduino com bluetooth (usando shields e etc). De uma pesquisada.
Para controla-lo com o celular, acredito que irá precisar desenvolver um app que faça essa comunicação.
Boa sorte!
Renato
Renato onde eu conecto os servos a mais?? e tem como conectar tres servos no mesmo arduino do mesmo jeito que voce conectou dois?
Olá Marcos,
De uma olhada neste tutorial: https://renatopeterman.com.br/blog/2010/07/28/controlando-servo-motor-a-partir-do-teclado-com-arduino-e-c/
Abraç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:
https://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. [email protected]
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 [email protected]
Agradeço desde já.