quinta-feira, 27 de setembro de 2012

Review Thumb Joystick Module + Towerpro MG995 Metal Servo

Olá!!

Esse review vai juntar dois items muito bons, que não podem faltar a ninguém, um deles é o Thumb Joystick do dealextreme, e o outro é o servo Towerpro MG955. Vamos aproveitar esse posta para comentar sobre os dois items a fundo, seu funcionamento, e um exemplo muito legal.
Ambos os items podem ser comprados no DX, com ótimos preços,  e qualidade muito boa.É dificil achar preço melhor em outros lugares da internet.

Sobre o Thumb Joystick:


Esse modulo pode ser usado em qualquer microcontrolador, ele é feito de dois potenciômetros, um para o eixo X e outro para o eixo Y, alem disso se você pressionar, ele possui um botão. Suas aplicações são infinitas, nesse exemplo eu vou fazer a leitura analógica dos potenciômetros, e depois de fazer essa leitura vou colocar esses valores no servo motor Towerpro MG955.

Imagens do Thumb Joystick:



Lateralmente:


A parte preta é removível, expondo seu circuito interno:


Por outros ângulos fica fácil de ver os potenciômetros:



Usando o Thumb Joystick:


Para usar é bem simples, como se trata de um potenciômetro variável, a primeira coisa que vamos fazer é ligar os pinos no microcontrolador, o pino GND tem que ser ligado ao terra, o pino +5V deve ser ligado a tensão, os pinos VRx e VRy devem ser ligados em canais analógicos, para fazer a leitura que varia entre 0 e 1023, sendo o minimo 0V e o máximo 5V.
Feita essa leitura voce pode jogar esses dados em uma outra variavel, nesse exemplo vai ser quantos graus o motor servo deve se mover, vai ficar mais tranquilo de entender quando eu postar o codigo. Mas primeiro vamos falar do servo motor.


O que é um Servo Motor:

Um servo motor é um dispositivo eletromecânico com características especiais que possibilitam o posicionamento preciso de um eixo em qualquer ângulo entre 0° e 180°. Geralmente possui alto torque devido às reduções por meio de engrenagens.

Onde é usado:

Nos mais variados ramos da mecânica e eletrônica, principalmente em indústrias, robôs e acionamentos controlados por computador. Em brinquedos também são muito usados, são modelos mais simples e menores, mas que possuem uma grande precisão e velocidade. 

Funcionamento:


Vou descrever o funcionamento do servo desde a leitura dos sinais elétricos até o posicionamento final. Vale lembrar que a cada 20ms (milissegundo) o servo faz a leitura do sinal no fio correspondente (signal).
Vamos imaginar um pequeno processador ligando e desligando uma saída de tensão de 5 volts durante um tempo de 1,5ms (ligado) e 18,5ms (desligado). 


Outra imagem que mostra todos pulsos:


Imagens do servo motor do DX:


Onde o fio vermelho é +5V, o fio marrom é GND e o fio amarelo é de dados.


O servo acompanha varias garras, que podem ser utilizadas de ferentes maneiras, vale lembrar que esse servo do dealextreme aguenta 25kfg


Vamos programar:

Esse código faz o seguinte, olha o valor do joystick, pega esse valor e mapeia entre 0 e 180, depois disso coloca esse valor em graus no microcontrolador, o programa esta bem comentado e fácil de entender:


#include <Servo.h>   // incluindo a biblioteca dos servos
Servo SRx; 
Servo SRy;

const int VRx = A0; 
const int VRy = A1; 

const int led  = 13;
const int botao = 2;

int sensorVRx = 0;       
int sensorVRy = 0; 
int outputVRx = 0;
int outputVRy = 0;

int estadoBotao = 0; 

long tempo_anterior      = 0;
long intervalo           = 100; //milisegundos
unsigned long tempo_atual;

void setup() 
{
  Serial.begin(9600); 
  SRx.attach(9);
  SRy.attach(10);
  pinMode(led,  OUTPUT);
  pinMode(botao, INPUT);
}

void loop() 
{
  tempo_atual = millis();// o tempo atual é igual ao tempo de funcionamento do uC   
  sensorVRx   = analogRead(VRx);   
  sensorVRy   = analogRead(VRy);   
  outputVRx   = map(sensorVRx, 0, 1023, 0, 180); 
  outputVRy   = map(sensorVRy, 0, 1023, 0, 180);   
  
  estadoBotao = digitalRead(botao);
  if(estadoBotao==HIGH)
    {
      digitalWrite(led,HIGH);
    }
    else 
      {
        digitalWrite(led,LOW);
      }
      
  if(tempo_atual - tempo_anterior > intervalo)// se o tempo atual menos o tempo anterior for maior que o intervalo com que eu quero fazer minha acao
    { 
      tempo_anterior = tempo_atual;//tempo anterior recebe o tempo atual 
      Serial.print(outputVRx);  
      Serial.print(",");
      Serial.print(outputVRy); 
      Serial.print(",");
      Serial.println("");
    }
  
  SRx.write(outputVRx);
  SRy.write(outputVRy);
  delay(2);                     
}

Rodando o código:








Nenhum comentário:

Postar um comentário