Início›Módulos›Joystick
⬤ Intermédio · Grupo 5 — Toque, Inclinação e Pressão

🕹️ Joystick + Cobertura

⏱️ 35 min 🧩 Módulo joystick · 2× Analógico + Digital 📦 Módulo #30 + 31

Nesta página

🔬 Sobre o Módulo Joystick

O módulo joystick (#30) combina dois potenciómetros (eixo X e eixo Y) e um botão digital (pressionar o joystick). A cobertura ergonómica (#31) encaixa no topo. Em repouso os eixos lêem ~512 (centro). O botão usa pull-up interno — LOW quando premido.

Eixo X
Analógico
A0 · 0=esquerda, 1023=direita
Eixo Y
Analógico
A1 · 0=baixo, 1023=cima
Botão SW
Digital
D2 · LOW quando premido
Centro
~512
Valor em repouso
Tensão
5V
VCC do Arduino
Tipo
Dual potenc.
Dois divisores resistivos

🔌 Pinagem — Módulo Joystick

VCCAlimentação → 5V do Arduino
GNDMassa → GND do Arduino
VRxEixo X (analógico) → A0
VRyEixo Y (analógico) → A1
SWBotão push (digital) → D2 (INPUT_PULLUP)

💻 Leitura Básica de X, Y e Botão

ex_joystick_basico.ino
#define JOY_X  A0
#define JOY_Y  A1
#define JOY_SW 2

void setup() {{
  pinMode(JOY_SW, INPUT_PULLUP);  // Pull-up: LOW = premido
  Serial.begin(9600);
}}

void loop() {{
  int x  = analogRead(JOY_X);    // 0–1023
  int y  = analogRead(JOY_Y);    // 0–1023
  bool sw = (digitalRead(JOY_SW) == LOW);

  Serial.print("X:"); Serial.print(x);
  Serial.print("  Y:"); Serial.print(y);
  Serial.print("  SW:"); Serial.println(sw ? "PREMIDO" : "solto");
  delay(100);
}}

⚙️ Zona Morta e Direção

ex_joystick_direcao.ino
#define JOY_X    A0
#define JOY_Y    A1
#define CENTRO   512
#define DEADZONE 80   // Ignorar variações menores que ±80

String direcao(int x, int y) {{
  int dx = x - CENTRO, dy = y - CENTRO;
  if (abs(dx) < DEADZONE && abs(dy) < DEADZONE) return "CENTRO";
  if (abs(dx) > abs(dy)) return dx > 0 ? "DIREITA" : "ESQUERDA";
  else                  return dy > 0 ? "CIMA"    : "BAIXO";
}}

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

void loop() {{
  int x = analogRead(JOY_X), y = analogRead(JOY_Y);
  String dir = direcao(x, y);
  Serial.println(dir);
  delay(150);
}}

🤖 Controlar Dois Servos com o Joystick

ex_joystick_servo.ino
#include <Servo.h>
#define JOY_X  A0
#define JOY_Y  A1

Servo servoX, servoY;

void setup() {{
  servoX.attach(9);   // Servo X no pino 9
  servoY.attach(10);  // Servo Y no pino 10
}}

void loop() {{
  int x = analogRead(JOY_X);
  int y = analogRead(JOY_Y);
  // Mapear 0–1023 para 0–180 graus
  servoX.write(map(x, 0, 1023, 0, 180));
  servoY.write(map(y, 0, 1023, 0, 180));
  delay(15);
}}

🎮 Mini-Jogo no Serial Monitor

ex_joystick_jogo.ino
// Cursor X/Y no Serial Monitor — move um 'o' numa grelha 10×5
#define JOY_X  A0
#define JOY_Y  A1
#define JOY_SW 2
#define COLS   10
#define ROWS   5
#define DZ     150

int cx = 5, cy = 2;  // Posição do cursor

void setup() {{
  pinMode(JOY_SW, INPUT_PULLUP);
  Serial.begin(9600);
}}

void loop() {{
  int x = analogRead(JOY_X) - 512;
  int y = analogRead(JOY_Y) - 512;
  if (x >  DZ) cx = min(cx+1, COLS-1);
  if (x < -DZ) cx = max(cx-1, 0);
  if (y >  DZ) cy = min(cy+1, ROWS-1);
  if (y < -DZ) cy = max(cy-1, 0);

  // Desenha grelha
  Serial.println("---");
  for (int r = 0; r < ROWS; r++) {{
    for (int c = 0; c < COLS; c++)
      Serial.print((c==cx && r==cy) ? "O" : ".");
    Serial.println();
  }}
  delay(200);
}}

🏆 Para ir mais longe

Kit B 37 · PR.FT6_15 · Arduino UNO · Raspberry Pi · Início · led.dge.medu.pt