Conhecimento
Como utilizar o Módulo Joystick KY-023 com ESP32
Como utilizar o Módulo Joystick KY-023 com ESP32
Se você já pensou em controlar um robô, navegar por um menu ou criar seu próprio console de videogame, o Módulo Joystick KY-023 é o componente que você precisa conhecer. Versátil e de baixo custo, ele oferece controle analógico em dois eixos (X e Y) e um botão de pressão (eixo Z), abrindo um leque de possibilidades para seus projetos.
Neste guia completo, vamos explorar como o KY-023 funciona, suas especificações e como integrá-lo facilmente com um microcontrolador ESP32, incluindo um código de exemplo prático.
Como o Módulo Joystick Funciona?
Ele é composto por dois potenciômetros montados em um mecanismo de gimbal e um pequeno botão de pressão.
- Eixos X e Y: Cada eixo é ligado a um potenciômetro. Ao mover o joystick, você altera a resistência de cada potenciômetro, o que gera uma tensão de saída analógica que varia proporcionalmente à posição.
- Botão (Eixo Z): O próprio bastão do joystick funciona como um botão. Ao pressioná-lo para baixo, ele aciona um interruptor que gera um sinal digital.
Quando o joystick está em repouso (centralizado), a tensão nos pinos de saída X e Y é aproximadamente metade da tensão de alimentação (por exemplo, 2,5V se alimentado com 5V). Em um microcontrolador com conversor analógico-digital (ADC) de 10 bits, como o do Arduino ou ESP32, esse valor central corresponde a uma leitura de cerca de 512.
Ao mover o joystick para os extremos, a tensão varia de 0V a 5V, resultando em leituras de 0 a 1023. Isso permite não apenas saber a direção do movimento, mas também a sua intensidade.
Especificações Técnicas
- Tensão de Operação: 3.3V a 5V
- Saída: 2 saídas analógicas (eixos X e Y) e 1 saída digital (botão)
- Faixa de Tensão de Saída: 0V a VCC (tensão de alimentação)
- Dimensões: 40 x 27 x 34 mm
Configuração de Pinos
GND:
Conecta-se ao terra.+5V:
Conecta-se à fonte de alimentação.VRx:
Saída de tensão analógica correspondente à posição do eixo X.VRy:
Saída de tensão analógica correspondente à posição do eixo Y.SW:
Saída digital para o botão; indica LOW (0) quando pressionado.
Exemplo prático
Vamos montar um circuito simples para ler os dados do joystick
⚠️ ATENÇÃO: O ESP32 opera com 3.3V. Embora o módulo KY-023 suporte 5V, os pinos de entrada do ESP32 não são tolerantes a 5V. Para evitar danos ao seu microcontrolador, sempre alimente o módulo com 3.3V ao usá-lo com um ESP32.
Fonte: https://www.espboards.dev/sensors/ky-023/
Fiação:
GND
do módulo →GND
do ESP32.+5V
do módulo →3.3V
do ESP32.VRx
do módulo →GPIO18
(ou outro pino ADC) do ESP32.VRy
do módulo →GPIO5
(ou outro pino ADC) do ESP32.SW
do módulo →GPIO17
(ou outro pino digital) do ESP32.
O pino SW
do botão precisa de um resistor de pull-up para garantir um estado lógico definido quando não está pressionado. Felizmente, podemos usar o resistor de pull-up interno do ESP32 via software, simplificando o circuito.
Código
// Definição dos pinos conectados ao ESP32
const int pinoVRx = 36; // Eixo X conectado ao GPIO36 (ADC1_CH0)
const int pinoVRy = 39; // Eixo Y conectado ao GPIO39 (ADC1_CH3)
const int pinoSW = 34; // Botão conectado ao GPIO34
// Variáveis para armazenar os valores lidos
int valorX = 0;
int valorY = 0;
int valorBotao = 0;
void setup() {
// Inicializa a comunicação serial a 9600 bps
Serial.begin(9600);
// Configura o pino do botão como entrada com resistor de pull-up interno.
// O pino lerá HIGH quando solto e LOW quando pressionado.
pinMode(pinoSW, INPUT_PULLUP);
}
void loop() {
// Lê os valores analógicos dos eixos X e Y
valorX = analogRead(pinoVRx);
valorY = analogRead(pinoVRy);
// Lê o valor digital do botão
valorBotao = digitalRead(pinoSW);
// Exibe os valores brutos no Monitor Serial
Serial.print("Eixo X: ");
Serial.print(valorX);
Serial.print(" | Eixo Y: ");
Serial.print(valorY);
Serial.print(" | Botão: ");
Serial.println(valorBotao == LOW ? "Pressionado" : "Solto");
// Analisa e imprime a direção do movimento
// Usamos uma "zona morta" para evitar leituras flutuantes no centro
if (valorY < 100) {
Serial.println("Direção: Cima");
} else if (valorY > 4000) {
Serial.println("Direção: Baixo");
}
if (valorX < 100) {
Serial.println("Direção: Esquerda");
} else if (valorX > 4000) {
Serial.println("Direção: Direita");
}
Serial.println("---------------------------------");
// Aguarda 200 milissegundos antes da próxima leitura
delay(200);
}
Entendendo o código
setup()
: Inicializamos a comunicação serial e, crucialmente, configuramos o pino do botão (pinoSW
) comoINPUT_PULLUP
. Isso ativa um resistor interno que mantém o pino em nível lógico ALTO (HIGH). Quando o botão é pressionado, ele conecta o pino ao GND, fazendo a leitura ir para o nível BAIXO (LOW).loop()
:analogRead(pinoVRx)
eanalogRead(pinoVRy)
leem os valores de tensão dos potenciômetros. No ESP32, o ADC padrão tem 12 bits, então os valores variam de 0 a 4095.digitalRead(pinoSW)
lê o estado do botão (HIGH ou LOW).- A lógica
if/else if
verifica se os valores de X e Y estão nos extremos para determinar a direção. Usamos valores como< 100
e> 4000
em vez de== 0
ou== 4095
para criar uma margem de tolerância e tornar a detecção mais confiável.
Ideias de Projetos
Com o Módulo Joystick KY-023 funcionando, as possibilidades são enormes:
- Controle de Servos: Crie um sistema de câmera Pan/Tilt controlado pelo joystick.
- Controle de Robô: Use o joystick para controlar a direção e a velocidade de um robô com rodas.
- Ponteiro de Mouse: Emule um mouse de computador com o ESP32.
- Mini Game: Desenvolva um jogo simples em um display OLED ou LCD.
- Navegação de Menus: Crie interfaces de usuário intuitivas para seus projetos.
Conclusão
O Módulo Joystick KY-023 é um componente fantástico, acessível e fácil de usar. Ele oferece uma forma de controle muito mais rica e intuitiva do que simples botões, sendo perfeito tanto para iniciantes que querem entender a leitura de sensores analógicos quanto para makers experientes que buscam aprimorar a interatividade de seus projetos.