Faça seu próprio Joystick com Arduino UNO

Já pensou em montar seu próprio controle para jogos utilizando um Arduino UNO?

Neste projeto, vamos mostrar como fazer um joystick com Arduino UNO utilizando o Shield Joystick Funduino. Além de controlar os movimentos nos eixos X e Y, o shield possui botões que podem ser configurados para executar diferentes comandos.

Para transformar os movimentos e cliques do joystick em comandos do teclado, vamos utilizar o Arduino IDE para realizar a leitura dos controles e o Thonny com Python para interpretar os dados enviados pela porta serial.


Esse projeto pode ser utilizado para controlar jogos, mas também serve como base para aplicações de robótica, automação e outros projetos interativos.

Conhecendo o Shield Joystick Funduino

Os shields para Arduino vêm se popularizando graças à praticidade que oferecem. Eles permitem adicionar novas funções à placa sem precisar montar todo o circuito utilizando diversos componentes separados.

Neste projeto, utilizaremos o Shield Joystick Funduino, que possui um joystick analógico para movimentação nos eixos X e Y, além de botões que podem ser utilizados para diferentes comandos.


O joystick analógico fornece valores diferentes conforme movimentamos a alavanca. O Arduino interpreta essas variações e consegue identificar se estamos movimentando o controle para a direita, esquerda, cima ou baixo.

Os botões funcionam como entradas digitais e podem ser associados às teclas que desejarmos.

Como encaixar o Shield no Arduino UNO

Antes de começar, tenha atenção à orientação do shield.

O Shield Joystick Funduino possui uma posição correta de encaixe. Os pinos precisam estar perfeitamente alinhados com os conectores do Arduino UNO.

Não force o encaixe. Confira a posição dos pinos antes de pressionar o shield contra a placa.

Quando estiver corretamente encaixado, todos os pinos deverão estar totalmente acoplados.

Programando o Joystick

Para este projeto, vamos utilizar dois programas:

  • Arduino IDE: responsável por fazer a leitura dos movimentos e botões do joystick;
  • Thonny com Python: responsável por receber os dados pela porta serial e transformá-los em comandos do teclado.

Dessa forma, o Arduino funciona como o responsável por capturar os comandos do joystick, enquanto o Python interpreta essas informações e envia as teclas correspondentes para o computador.

Programando o Arduino UNO

Conecte o Arduino UNO ao computador e abra a Arduino IDE.

Configure a placa e selecione a porta COM correspondente ao Arduino.

Depois, cole o código abaixo:

#define JOY_X A0
#define JOY_Y A1
#define JOY_SW 2
#define K1 3
#define K2 4
#define K3 5
#define K4 6

int lastX = -1, lastY = -1;
int lastSW = -1, lastK1 = -1, lastK2 = -1, lastK3 = -1, lastK4 = -1;

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

  while (!Serial) { ; }

  pinMode(JOY_SW, INPUT_PULLUP);
  pinMode(K1, INPUT_PULLUP);
  pinMode(K2, INPUT_PULLUP);
  pinMode(K3, INPUT_PULLUP);
  pinMode(K4, INPUT_PULLUP);
}

void loop() {
  int x = analogRead(JOY_X);
  int y = analogRead(JOY_Y);

  int sw = !digitalRead(JOY_SW);
  int k1 = !digitalRead(K1);
  int k2 = !digitalRead(K2);
  int k3 = !digitalRead(K3);
  int k4 = !digitalRead(K4);

  if (x != lastX || y != lastY ||
      sw != lastSW || k1 != lastK1 ||
      k2 != lastK2 || k3 != lastK3 ||
      k4 != lastK4) {

    Serial.print(x);
    Serial.print(",");
    Serial.print(y);
    Serial.print(",");
    Serial.print(sw);
    Serial.print(",");
    Serial.print(k1);
    Serial.print(",");
    Serial.print(k2);
    Serial.print(",");
    Serial.print(k3);
    Serial.print(",");
    Serial.println(k4);

    lastX = x;
    lastY = y;
    lastSW = sw;
    lastK1 = k1;
    lastK2 = k2;
    lastK3 = k3;
    lastK4 = k4;
  }

  delay(10);
}

Como funciona o código do Arduino?

O programa começa definindo os pinos utilizados pelo joystick e pelos botões.

Os eixos X e Y são conectados às entradas analógicas:

#define JOY_X A0
#define JOY_Y A1

Já os botões utilizam entradas digitais:

#define JOY_SW 2
#define K1 3
#define K2 4
#define K3 5
#define K4 6

O Arduino realiza continuamente a leitura dessas entradas e envia os valores pela comunicação serial.

Os dados são enviados neste formato:

X,Y,SW,K1,K2,K3,K4

Por exemplo:

512,512,0,0,0,0,0

Dessa forma, o Python consegue identificar cada movimento e cada botão separadamente.

Configurando o Thonny e o Python

Agora vamos utilizar o Thonny para interpretar os dados recebidos pelo Arduino.

Caso alguma biblioteca não esteja instalada, você pode acessá-la pelo próprio Thonny em:

Ferramentas → Gerenciar pacotes

Pesquise pelo nome da biblioteca e clique em Instalar.

Para este projeto, utilizaremos:

  • Pyserial
  • Pynput

Depois de instalar as bibliotecas necessárias, crie um novo arquivo no Thonny e cole o código abaixo:

import serial
import time
from pynput.keyboard import Key, Controller

PORT = "COM11"
BAUD = 9600

teclado = Controller()
arduino = serial.Serial(PORT, BAUD, timeout=1)

time.sleep(2)
arduino.reset_input_buffer()

print("Conectado. Aguardando eventos do joystick...\n")

THRESHOLD = 400
DEADZONE = 30

estado_anterior = {
    'sw': 0, 'k1': 0, 'k2': 0, 'k3': 0, 'k4': 0,
    'esquerda': 0, 'direita': 0, 'cima': 0, 'baixo': 0
}

ultimo_x = 512
ultimo_y = 512

def pressionar(tecla):
    teclado.press(tecla)

def soltar(tecla):
    teclado.release(tecla)

def tratar_botao(valor, tecla, nome):
    if valor and not estado_anterior[nome]:
        pressionar(tecla)
        print(f"[PRESSIONOU] {nome}")

    elif not valor and estado_anterior[nome]:
        soltar(tecla)
        print(f"[SOLTOU] {nome}")

    estado_anterior[nome] = valor

def tratar_eixo(x, y):
    global ultimo_x, ultimo_y

    if abs(x - ultimo_x) < DEADZONE and abs(y - ultimo_y) < DEADZONE:
        return

    ultimo_x = x
    ultimo_y = y

    centro = 512

    esq = x < (centro - THRESHOLD)
    dir = x > (centro + THRESHOLD)
    cim = y < (centro - THRESHOLD)
    bai = y > (centro + THRESHOLD)

    tratar_botao(esq, Key.left, 'esquerda')
    tratar_botao(dir, Key.right, 'direita')
    tratar_botao(bai, Key.up, 'cima')
    tratar_botao(cim, Key.down, 'baixo')

try:

    while True:

        linha = arduino.readline().decode(
            'utf-8',
            errors='ignore'
        ).strip()

        if not linha:
            continue

        linha = ''.join(
            c for c in linha
            if c.isdigit() or c == ','
        )

        partes = linha.split(',')

        if len(partes) != 7:
            continue

        if any(p == '' for p in partes):
            continue

        x = int(partes[0])
        y = int(partes[1])
        sw = int(partes[2])
        k1 = int(partes[3])
        k2 = int(partes[4])
        k3 = int(partes[5])
        k4 = int(partes[6])

        tratar_botao(sw, Key.space, 'sw')
        tratar_botao(k1, 'z', 'k1')
        tratar_botao(k2, 'x', 'k2')
        tratar_botao(k3, 's', 'k3')
        tratar_botao(k4, 'f', 'k4')

        tratar_eixo(x, y)

except KeyboardInterrupt:
    print("\nEncerrado.")

finally:
    arduino.close()

Configurando a porta COM

Existe um detalhe importante antes de executar o programa em Python.

No início do código, encontramos:

PORT = "COM11"

Você precisa substituir COM11 pela mesma porta COM utilizada pelo Arduino na Arduino IDE.

Por exemplo:

PORT = "COM5"

Outro ponto importante: feche o Monitor Serial da Arduino IDE antes de executar o programa no Thonny.

Isso acontece porque a comunicação serial só pode ser utilizada por um programa por vez. Se o Monitor Serial estiver aberto, o Python poderá não conseguir acessar os dados enviados pelo Arduino.

Configurando os botões

Uma das vantagens dessa montagem é poder escolher quais teclas do teclado serão acionadas pelos botões.

No exemplo deste projeto, configuramos:

  • Joystick → Direcional;
  • SW → Barra de espaço;
  • K1 → Z;
  • K2 → X;
  • K3 → S;
  • K4 → F.

Essa configuração aparece no código nestas linhas:

tratar_botao(sw, Key.space, 'sw')
tratar_botao(k1, 'z', 'k1')
tratar_botao(k2, 'x', 'k2')
tratar_botao(k3, 's', 'k3')
tratar_botao(k4, 'f', 'k4')

Para utilizar o joystick em outro jogo ou aplicação, você pode alterar as teclas entre aspas conforme os comandos necessários.

Por exemplo:

tratar_botao(k1, 'a', 'k1')

Nesse caso, o botão K1 passará a enviar a tecla A.

Como o Joystick Ccontrola o computador?

O funcionamento do projeto acontece em etapas.

Primeiro, o Shield Joystick Funduino detecta os movimentos e os cliques.

Depois, o Arduino UNO realiza a leitura desses sinais e envia os valores pela porta serial.

O Python, executado pelo Thonny, recebe essas informações, interpreta os valores e utiliza a biblioteca pynput para pressionar ou soltar as teclas correspondentes no computador.

O fluxo fica assim:

Joystick → Arduino UNO → Porta Serial → Python → Teclado do computador

Utilizando o Joystick em jogos

Depois de configurar as teclas de acordo com o jogo escolhido, execute o programa Python no Thonny.

Quando o Arduino for conectado corretamente, o programa deverá apresentar uma mensagem semelhante a:

Conectado. Aguardando eventos do joystick...

A partir desse momento, os movimentos e botões do joystick serão convertidos nos comandos configurados.

Lembre-se de configurar as teclas de acordo com os comandos utilizados pelo jogo. Cada jogo pode utilizar uma combinação diferente de teclas.

Outras aplicações

Embora este projeto tenha sido desenvolvido para utilizar o joystick como controle de jogos, a mesma ideia pode ser aplicada em diversas outras situações.

Você pode utilizar o joystick para:

  • Controlar robôs;
  • Movimentar carrinhos;
  • Criar interfaces de automação;
  • Controlar braços robóticos.

A leitura dos eixos X e Y também permite criar sistemas em que a intensidade do movimento do joystick influencia diretamente o comportamento de um motor ou outro dispositivo.

Conclusão

Agora você já sabe como fazer seu próprio joystick com Arduino UNO utilizando o Shield Joystick Funduino.

Neste projeto, aprendemos a capturar os movimentos e botões utilizando o Arduino, enviar essas informações pela comunicação serial e utilizar Python para transformar os comandos em teclas do computador.

A combinação entre Arduino UNO e Python amplia bastante as possibilidades do projeto. Além de criar um controle para jogos, você pode utilizar a mesma estrutura como base para projetos de robótica, automação e sistemas interativos.

Agora é só escolher a aplicação, configurar as teclas necessárias e começar a utilizar seu próprio joystick.

Projeto realizado por Emanuel Sousa – Graduando em Engenharia Mecatrônica

Post navigation

Deixe um comentário

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Como Utilizar o Sensor de Turbidez com Arduino UNO

Projeto de sistema de controle de acesso com Arduino

Detector de batimentos cardíacos com Arduino e Sensor ECG: Tutorial Completo

Descubra os materiais essenciais para iniciantes em tecnologia, engenharia e robótica