Ir ao conteúdo

Posts recomendados

Postado

Bom dia Amigos!
Preciso fazer um projeto em que controle um Servo-Motor 9G com um Controle Remoto IR.
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, 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?

Obrigado!

  • Membro VIP
Postado

Melhor você falar + sobre isso:

24 minutos atrás, Jean Coutinho Alves disse:

Até ai tudo bem, consegui fazer o projeto,

Bem mais...

Postado

Eu criei um projeto onde consigo mover o Servo em um determinado grau: Por exemplo, aperto um botão e ele se move para a posição 0°, aperto outro e se move para 45° e outros dois botões para 90 e 180°. Sendo que eu preciso fazer ele se mover de acordo com o grau escolhido no controle remoto pelos botões númericos, conforme citado no post.

Postado

Isadora, segue projeto anexo.

 

O Sensor IR e o Servo-Motor estão conectados nas seguintes portas do Arduino Uno:

O Sensor IR - Pino 2

Servo-Motor - Pino 3.

 

Além das posições pré-definidas para os ângulos de 0, 45, 90 e 180, coloquei mais duas teclas do controle remoto para o Servo ficar se movendo.

codigoProjeto.txt

  • Membro VIP
Postado

Apesar que "suspeitei desde o princípio", só agora mencionas arduíno. Que bom que sua linguagem é = ao c.

Pra quem tem preguiça (=eu) ou receio de clicar em links... seu 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 graus
       ang  = 45;
       break;

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

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

     case 0xE0E046B9: //botao >, posicao: 180 graus
       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();
 }
}

você vai ter que decodificar as teclas pra montar seu angulo. Talvez esperar um enter sei lá ou não.

tens que ter certeza que o 1º dado recebido é centena p.ex. algo como

unsigned char retorna_angulo(void)
{
unsigned char angulo=0,i;
for (i=100;i;i/=10)
{
switch (codigo_recebido.value) {
     case 0xE0E0xxxx: // tecla 0
a=0; break;
     case 0xE0E0xxxx: // tecla 1
a=1; break;
     case 0xE0E0xxxx: // tecla 2
a=2; break;
//... etc
     case 0xE0E0xxxx: // tecla "enter"
return;
}
angulo+=(a*i);
}

Teoricamente a função retorna o dado numérico de 000 a 999 digitado no ct. rem depois de digitar 3 números centena dezena unidade

você pode não acreditar mas digitei isso agora. Vais ter que lapidar este diamante bruto que pode estar impuro. P.ex. colocar filtros para teclas não desejadas

 

Em tempo... não tenho afinidade com arduínos e cia. A linguagem acima é c. Nem adianta crtl-c ctrl-v. è só pra você ver o conceito

 

Postado

Certa ocasião um colega queria saber como calcular o período Ton de um servo em função do ângulo desejado.

Fiz um pequeno estudo e o apresento aqui. Talvez seja o suficiente para você. Este é um "Sistema Aberto", ou seja você calcula o período Ton em função do ângulo desejado e aplica o valor de Ton em um TIMER. O servo vai desviar o ângulo para o valor de Ton imposto. Mas aí você não vai saber o quanto o ângulo final ficou próximo do ângulo desejado. Se desejar maior precisão, tem que "Fechar o Loop do Sistema", ou seja, tem que fazer uma realimentação negativa. Neste caso, você tem que medir o ângulo que o servo posicionou e comparar com o ângulo desejado. A diferença é usada para corrigir o ângulo que o servo posicionou. Quanto menor for essa diferença, menor será o erro cometido. 

Segue o cálculo de Ton.

MOR_AL

Servo_Angulo.JPG

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...