Site icon AranaCorp

Usar um joystick com o Arduino

0
(0)

O joystick é um sensor de posição que devolve dois valores analógicos representando a sua posição X,Y. Ele pode ser usado como interface para navegar por um menu ou para controlar a direção e a velocidade de um objeto. É comum encontrar joysticks em controles de video-game, em controles remotos de modelismo ou mesmo em painéis de controle de máquinas industriais.

Material

Princípio de funcionamento

O joystick é composto de dois potenciômetros mecanicamente acoplados posicionados de maneira a detectar os componentes horizontais e verticais do joystick. Os valores de resistência dos potenciômetros variam de forma independente em função da posição do joystick,. É comum haver um botão de pressão que é acionado ao apoiarmos sobre o joystick.

Esquema

O joystick devolve dois valores analógicos que se ligam às entradas analógicas do microcontrolador. Ele também devolve um valor digital que se liga ao pino 2 do microcontrolador.

Código

O joystick funciona como uma combinação de dois potenciômetros e um botão de pressão. Definimos portanto duas entradas analógicas para obter os valores de posição e uma entrada digital para o botão integrado Os valores analógicos brutos praticamente não serão utilizados de forma direta. Eles serão usados para controlar variáveis com os seus próprios campos de definição (valores extremos, precisão, tipo, etc.). Por isso, pode ser interessante definir uma função para converter o valor bruto em valor utilizável. No nosso exemplo, escolhemos uma gama de valores entre -100 e 100, que pode ser interpretada como a velocidade de um motor, com o valor 100 representando a velocidade máxima e os valores negativos representando uma rotação no sentido oposto.

//Constants
#define NUM_JOY 2
#define MIN_VAL 0
#define MAX_VAL 1023

//Parameters
const int joyPin [2] = {A0, A1};
const int joyBtn   = 2;
const int joyOffset   = 0;

//Variables
int joyVal [NUM_JOY] = {0, 0};


void setup() {
  //Init Serial USB
  Serial.begin(9600);
  Serial.println(F("Initialize System"));
  //Init Joystick
  for (int i = 0; i < NUM_JOY; i++) pinMode(joyPin[i], INPUT);
  pinMode(joyBtn,INPUT_PULLUP);
}

void loop() {
  readJoystick();
  delay(500);
}

void readJoystick( ) { /* function readJoystick */
  ////Test routine for Joystick
  for (int i = 0; i < NUM_JOY; i++) {
    joyVal[i] = analogRead(joyPin[i]);
    Serial.print(F("joy")); Serial.print(i); Serial.print(F(" : ")); Serial.println(joyVal[i]);
  }
  for (int i = 0; i < NUM_JOY; i++) {
    Serial.print(F("Conv")), Serial.print(i); Serial.print(F(" : ")); Serial.println(joyRawToPhys(joyVal[i]));
  }
  if (!digitalRead(joyBtn)) {
    Serial.println(F("Joy Button pressed"));
  }
}

float joyRawToPhys(int raw) { /* function joyRawToPhys */
  ////Joystick conversion rule
  float phys = map(raw, MIN_VAL, MAX_VAL, -100 + joyOffset, 100 + joyOffset) - joyOffset;
  return phys;
}

Resultado

Com o código carregado no microcontrolador, observamos os valores de X e Y evoluírem de acordo com a posição do joystick. Também podemos ver que, em posição de repouso, a conversão dos valores em bruto não é igual a zero. Esta diferença pode ser corrigida com o acréscimo de um offset no parâmetro de conversão.

Aplicações

Fontes

Retrouvez nos tutoriels et d’autres exemples dans notre générateur automatique de code
La Programmerie

How useful was this post?

Click on a star to rate it!

Average rating 0 / 5. Vote count: 0

No votes so far! Be the first to rate this post.

Exit mobile version