Bom dia Pessoal!

Preciso fazer um projeto que controle um Servo-Motor 9G com um Controle Remoto IR no Arduino.
Até ai tudo bem, consegui fazer o projeto, porém preciso que, ao escolher o ângulo do Servo no controle remoto, o mesmo se movimente para o ângulo escolhido. Ou seja, se eu apertar os números do controle: 1, 2 e 0 e apertar o botão de "play" do controle, o Servo se movimente para a posição de 120°. Se eu apertar os números 1, 8 e 0, o Servo se movimente para a posição 180°. E por ai vai....
Alguém sabe dizer se é possível fazer isso? Se sim, poderiam ajudar?

Por enquanto, no meu projeto ele está com teclas definidas do controle para os ângulos de 0, 45, 90 e 180, e a possibilidade de mover ele ângulo por ângulo, porém se fizer da forma exposta acima, ficaria mais interessante!

Segue código:

#include <IRremote.h>
#include <Servo.h>

Servo ServoMotor;
int pino = 2;
float resultado;
int ang;

IRrecv IRpino(pino);
decode_results codigo_recebido;

void setup() {

Serial.begin(9600);
IRpino.enableIRIn();
ServoMotor.attach(3);
ang = 0;
}

void loop() {

if (IRpino.decode(&codigo_recebido)) {
Serial.println(codigo_recebido.value, HEX);
Serial.println(ang);


switch (codigo_recebido.value) {
case 0xE0E0A659: //botao <, posicao: 45
ang = 45;
break;

case 0xE0E08679: //botao |<, posicao: 0
ang = 0;
break;

case 0xE0E006F9: //botao >|, posicao: 90
ang = 90;
break;

case 0xE0E046B9: //botao >, posicao: 180
ang = 180;
break;

case 0xE0E048B7: // botao Ch+
ang = ang + 4;
if (ang > 180) {
ang = 180;
}
break;

case 0xE0E008F7: // botao Ch-
ang = ang - 4;
if (ang < 0) {
ang = 0;
}
break;
}
ServoMotor.write(ang);

IRpino.resume();
}
}

Exibições: 1184

As respostas para este tópico estão encerradas.

Respostas a este tópico

Oi JCA, boa tarde.

veja se este code ajuda:

Rui

Anexos

Oi Rui, boa noite!

Cara, primeiramente, gostaria de agradecer por ter me respondido, já estava, praticamente, mudando todo o projeto por causa desse problema!

Enfim, testei o código aqui e, aparentemente, é isso mesmo, porém quando testei, precisei tirar o IRpino.resume() de dentro do IF do flag, pois não estava funcionando. Dai ficou assim:

if (flag == 1) // Enquanto valor for válido
{
ServoMotor.write(ang);
}
IRpino.resume();
}

Desta forma até funciona, porém quando entro no monitor serial para ver se o ângulo que eu escolhi no controle aparece lá, ele mostra um outro número.

Por exemplo, se eu apertar a tecla 1 e depois play, ele move o servo e mostra no monitor serial o ângulo 1.

Se eu apertar a tecla 2 e depois play, ele move o servo e mostra no monitor serial o ângulo 2.

Ele faz isso até a tecla 9 perfeitamente, porém quando aperto a partir do 10, ele muda!

Se eu apertar 10 e play, ele mostra no monitor serial 16. Se eu apertar 20 e play, ele mostra 32. Se eu apertar 30 e play, ele mostra 48. Por fim, se eu aperto 180, ele mostra 384.

Eu preciso converter alguma?

Outra coisa, ele não está com uma precisão muito boa, pois, as vezes quando digito 180, ele volta para o ângulo 0. Eu preciso mudar algo também?

Vou postar aqui o código novamente para você ver como ficou com as alterações.

Mais uma vez, muito obrigado pela ajuda!

Anexo.

Anexos

Esse problema dos valores, mostrar 16 no lugar de 10 e 32 no lugar de 20, se da pelo forma como os dados estão sendo tratados.

Quando você pressiona a tecla 1, ele salva o valor 1, valor pressionar a tecla 0 ele irá deslocar esse valor em 4 bits, ou seja 10000 e somar 0 (em binário), portando o resultado será, em decimal, 16 e ao fazer o mesmo com o 20, o resultado será 100000 em binário que corresponde a 32 em decimal.

A minha sugestão é ao em vez de tratar os valores como binário e deslocar 4 bits, trate-os como decimal e multiplique por 10, por exemplo

Teclado = Teclado*10 + X

sendo X o numero correspondente a tecla (0, 1, 2 ... ) 

Apenas como curiosidade: Deslocar 4 bits a esquerda em binário é equivalente a multiplicar por 16 em decimal.

Boa noite!

João Arthur, gostaria de agradecer por sua ajuda!

Alterei o código com a sua sugestão e funcionou perfeitamente!

Muito obrigado a todos pela ajuda!!!

Olá JCA,

Faça o seguinte:

declare um array de char:

char entrada[4];

declare um ponteiro para qual elemento de entrada, iniciando com 0:

int qualchar = 0;

ao receber um valor do controle remoto, entre como o char correspondente no elemento corrente apontado pelo qualchar:

entrada[qualchar] = chardocontrole;

em seguida, aponte para o proximo elemento:

++qualchar;

repita até que o controle envie o caractere do play:

if(chardocontrole = caracteredoplay) { entrada[qualchar] = '\0' }

obs.: '\0' indica que a sequencia de char (string) terminou

converta sua entrada para numero:

int grau = atoi(entrada);

pronto! Fácil, indolor e incolor!!!

Boa sorte,

  'Eiju

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço