Joystick

joystickandix
[tecnoloxia.org CC By-SA]

Descrición:

Un Joystick ou panca de mando é un dispositivo de control de dous ou tres eixos moi utilizado nos xogos de ordenador e de consola. Ademais dos pulsadores de acción, posúen un sistema para detectar a dirección do movemento:

  • Os analóxicos constan de dous potenciómetros, un para o eixe X e outro para o eixe Y, cuxo movemento marca as coordenadas de posición ou o movemento. Son, por exemplo, os que se usan no mando da Play Station.
  • Os dixitais len o estado de catro micro-interruptores situados na base para detectar a dirección do movemento.

O que imos utilizar aquí é un Joystick analóxico dos que venden para conectar co Arduíno, pero podes reciclar algún dos que tes por casa.

joystickarduino

Pode resultarnos útil para o control do movemento dos servos dun brazo robótico, dun vehículo, etc.

Montaxe:

  • GND e VCC: Son os pins de alimentación.
  • X e Y: Son os potenciómetros. Conectámolos a entradas analóxicas. No noso caso X a A0 e Y a A1.
  • pullup_pulldown
    [tecnoloxia.org CC By-SA]
    SW ou KEY: É o pulsador. Conectarémolo a unha entrada dixital, no noso caso ao pin2. Debes engadir unha resistencia de 10 kΩ para conectalo como vimos nas prácticas de pulsadores. Dependendo do modelo de joystick, podemos atopar que o pulsador conecta entre VCC e o pin SW, ou entre GND e o pin SW (Podes comprobalo cun polímetro). No primeiro caso a conexión sería Pull-Down (Temos un 0 por defecto  e un 1 ao premer) e no segundo caso sería Pull-Up (temos un 1 por defecto e un 0 cando prememos)

O Joystick do que dispoño ten o pulsador conectado a GND, polo que utilizarei a conexión pull-up.

[tecnoloxia.org CC By-SA]

Programas:

1. Lectura

O primeiro que cómpre facer é ver que datos nos dan os potenciómetros segundo a súa posición e a orientación do Joystick. Imos ver os valores na consola.

// Declaración de variables:

int eixeX = A0;
int eixeY = A1; 
int pulsador = 2;

int potx;     // Le o valor do potenciómetro do eixe x, entre 0 e 1023
int poty;     // Le o valor do potenciómetro do eixe y, entre 0 e 1023
int estado;   // Estado do pulsador (0 - 1 ou LOW - HIGH)

// Configuración:

void setup() {
  Serial.begin(9600);
  while(!Serial);
}

// Programa:

void loop() {

  potx = analogRead(eixeX);      // Asignamos a variable "pot1" ao valor lido en A0
  poty = analogRead(eixeY); 
  estado = digitalRead(pulsador);

  Serial.print("X: ");
  Serial.print(potx);
  Serial.print(" | Y: ");
  Serial.print(poty);
  Serial.print(" | Pulsador: ");
  Serial.println(estado);

  delay(100); 
  
}

2. Servo

Este programa fai que o servo1 se mova segundo o movemento do potenciómetro do eixe X. Antes podes mirar nesta páxina como se conecta un servo.

Como cada vez que soltamos o joystick volve a posición central de repouso, imos programar un aumento e unha diminución do xiro segundo movamos o cursor, e no rango próximo á posición de repouso non ordenamos facer nada.

#include <Servo.h>	// Importamos a librería servo

// Declaración de variables:

Servo servo1;	  
int eixeX = A0;
int eixeY = A1; 
int pulsador = 2;
int LED = 13;

int pot1;         // variable que le o valor do potenciómetro do eixe X, entre 0 e 1023
int xiro1=90;     // variable que enviamos ao servo1, entre 0 e 180

int variacion=3;  // O valor que sumamos ou restamos ao xiro cada vez que se move o potenciómetro.

// Configuración:

void setup() {
  servo1.attach(6);     // Servo1 conectado no pin 6
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

// Programa:

void loop() {

  // Control do servo1 co potenciómetro do eixe X
  // A valores do EixeX menores que 400 desconta graos e a maiores de 600 aumenta os graos de xiro.
  
  pot1 = analogRead(eixeX);      // Asignamos a variable "pot1" ao valor lido en A1
  
  if (pot1<400){
    xiro1=xiro1-variacion;
    if(xiro1<0){                 // Evitamos que o xiro que envíe sexa menor que cero.
      xiro1=0;
    }
  }
  else if(pot1>600){
    xiro1=xiro1+variacion;
    if (xiro1>180){              // Evitamos que o xiro que envíe sexa maior que 180
      xiro1=180;
    }
  }
  Serial.println("Xiro1="+String(xiro1));
  servo1.write(xiro1);
  delay(50);

  // Control do LED

  if (digitalRead(pulsador) == HIGH){
    digitalWrite(LED, HIGH); 
  }
  else{
     digitalWrite(LED, LOW);
  }            
  
}

Propostas:

  1. Segundo servo: Engade o necesario para que se mova un segundo servo co movemento do potenciómetro do eixe Y.
  2. Matriz de LEDs: Controla mediante un joystick a posición do LED que está aceso nunha matriz 8×8, desde a posición (0,0) ata a posición (7,7).

Deseño 3D:

Deseña un soporte para o joystick e imprímeo en 3D. Exemplo:

joystick_soporte
[By sgfx CC-BY from thingiverse]

Deixa un comentario