Divulgação: Alguns dos links desta seção são links de afiliado da Amazon. Podemos receber uma comissão pelas compras feitas por meio desses links, sem custo adicional para você. Agradecemos o seu apoio.
Sobre o Sensor Joystick
Você provavelmente já viu um Joystick em algum lugar, como em um controle de videogame, um controle de brinquedo ou até em uma grande máquina real, como o controle de uma escavadeira.
O joystick é composto por dois potenciômetros posicionados em ângulo reto entre si e um botão de pressão. Por isso, ele fornece as seguintes saídas:
Um valor analógico (de 0 a 1023) correspondente à posição horizontal (chamada de coordenada X)
Um valor analógico (de 0 a 1023) correspondente à posição vertical (chamada de coordenada Y)
Um valor digital de um botão de pressão (HIGH ou LOW)
A combinação dos dois valores analógicos pode criar coordenadas 2D, cujo centro são os valores quando o joystick está na posição de repouso. A direção real das coordenadas pode ser identificada facilmente quando você executar um código de teste (na próxima parte).
Algumas aplicações podem usar as três saídas, outras podem usar apenas algumas delas.
Pinagem
Um Joystick tem 5 pinos:
Pino GND: precisa ser conectado ao GND (0V)
Pino VCC: precisa ser conectado ao VCC (5V)
Pino VRX: fornece um valor analógico correspondente à posição horizontal (chamada de coordenada X).
Pino VRY: fornece um valor analógico correspondente à posição vertical (chamada de coordenada Y).
Pino SW: é a saída do botão de pressão dentro do joystick. Ele é normalmente aberto. Se usarmos um resistor de pull-up neste pino, o pino SW ficará em HIGH quando não estiver pressionado e em LOW quando estiver pressionado.
Como Funciona
Quando você empurra a alavanca do joystick para a esquerda/direita, a tensão no pino VRX muda. A faixa de tensão vai de 0 a 5V (0 à esquerda e 5v à direita). O valor da tensão é proporcional à posição da alavanca ⇒ O valor lido no pino analógico do Arduino vai de 0 a 1023
Quando você empurra a alavanca do joystick para cima/baixo, a tensão no pino VRY muda. A faixa de tensão vai de 0 a 5V (0 em cima e 5v embaixo). O valor da tensão é proporcional à posição da alavanca ⇒ O valor lido no pino analógico do Arduino vai de 0 a 1023
Quando você empurra a alavanca do joystick em qualquer direção, a tensão nos pinos VRX e VRY muda proporcionalmente à projeção da posição em cada eixo
Quando você pressiona a alavanca do joystick de cima para baixo, o botão de pressão dentro do joystick é fechado. Se usarmos um resistor de pull-up no pino SW, a saída do pino SW mudará de 5V para 0V ⇒ O valor lido no pino digital do Arduino muda de HIGH para LOW
Diagrama de Ligação
This image is created using Fritzing. Click to enlarge image
Como Programar o Joystick
O joystick tem duas partes: analógica (eixos X, Y) e digital (botão de pressão)
Para as partes analógicas (eixos X, Y), basta ler o valor do pino de entrada analógica usando a função analogRead().
int xValue = analogRead(A1);int yValue = analogRead(A0);
Para a parte digital (botão de pressão): ela é um botão. A forma mais simples e prática é usar a biblioteca ezButton. Esta biblioteca oferece debounce para botões e também ativa um resistor de pull-up interno. Você pode ver mais sobre botões no tutorial Arduino - Botão. O código será apresentado na próxima seção deste tutorial.
Depois de ler os valores dos pinos analógicos, talvez seja necessário convertê-los em alguns valores controláveis. A próxima parte vai fornecer os códigos de exemplo para isso.
Código Arduino
Esta seção vai fornecer os seguintes códigos de exemplo para Arduino:
Código de exemplo: lê os valores analógicos do joystick
Código de exemplo: lê os valores analógicos e o estado do botão do joystick
Código de exemplo: converte o valor analógico em comandos MOVE_LEFT, MOVE_RIGHT, MOVE_UP, MOVE_DOWN
Código de exemplo: converte os valores analógicos em ângulos para controlar dois servo motores (por exemplo, em uma câmera pan-tilt)
Lê os valores analógicos do joystick
/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-joystick*/#define VRX_PIN A1 // Arduino pin connected to VRX pin#define VRY_PIN A0 // Arduino pin connected to VRY pinint xValue = 0; // To store value of the X axisint yValue = 0; // To store value of the Y axisvoidsetup() {Serial.begin(9600) ;}voidloop() {// read analog X and Y analog values xValue = analogRead(VRX_PIN); yValue = analogRead(VRY_PIN);// print data to Serial Monitor on Arduino IDESerial.print("x = ");Serial.print(xValue);Serial.print(", y = ");Serial.println(yValue);delay(200);}
Passos Rápidos
Copie o código acima e abra-o na Arduino IDE
Clique no botão Upload na Arduino IDE para carregar o código no Arduino
Empurre a alavanca do joystick ao máximo até o limite e depois gire-a em círculo (no sentido horário ou anti-horário)
Veja o resultado no Serial Monitor.
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Ln 11, Col 1
Arduino Uno on COM15
2
Enquanto gira a alavanca do joystick, continue observando o Serial Monitor
Se o valor X for 0, marque ou memorize a posição atual como esquerda ⇒ a direção oposta é a direita
Se o valor Y for 0, marque ou memorize a posição atual como cima ⇒ a direção oposta é baixo
Lê os valores analógicos e o estado do botão de um joystick
/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-joystick*/#include <ezButton.h>#define VRX_PIN A1 // Arduino pin connected to VRX pin#define VRY_PIN A0 // Arduino pin connected to VRY pin#define SW_PIN 2 // Arduino pin connected to SW pinezButtonbutton(SW_PIN);int xValue = 0; // To store value of the X axisint yValue = 0; // To store value of the Y axisint bValue = 0; // To store value of the buttonvoidsetup() {Serial.begin(9600) ;button.setDebounceTime(50); // set debounce time to 50 milliseconds}voidloop() {button.loop(); // MUST call the loop() function first// read analog X and Y analog values xValue = analogRead(VRX_PIN); yValue = analogRead(VRY_PIN);// Read the button value bValue = button.getState();if (button.isPressed()) {Serial.println("The button is pressed");// TODO do something here }if (button.isReleased()) {Serial.println("The button is released");// TODO do something here }// print data to Serial Monitor on Arduino IDESerial.print("x = ");Serial.print(xValue);Serial.print(", y = ");Serial.print(yValue);Serial.print(" : button = ");Serial.println(bValue);}
Passos Rápidos
Vá até o ícone Libraries na barra lateral esquerda da Arduino IDE.
Pesquise “ezButton” e encontre a biblioteca de botão da ArduinoGetStarted.com
Clique no botão Install para instalar a biblioteca ezButton.
Copie o código acima e abra-o na Arduino IDE
Clique no botão Upload na Arduino IDE para carregar o código no Arduino
Empurre a alavanca do joystick para a esquerda/direita/cima/baixo
Pressione a alavanca do joystick de cima para baixo
Veja o resultado no Serial Monitor.
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Ln 11, Col 1
Arduino Uno on COM15
2
Converte o valor analógico em comandos MOVE LEFT/RIGHT/UP/DOWN
/* * Este código de Arduino foi desenvolvido por pt.newbiely.com * Este código de Arduino é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino/arduino-joystick*/#define VRX_PIN A1 // Arduino pin connected to VRX pin#define VRY_PIN A0 // Arduino pin connected to VRY pin#define LEFT_THRESHOLD 400#define RIGHT_THRESHOLD 800#define UP_THRESHOLD 400#define DOWN_THRESHOLD 800#define COMMAND_NO 0x00#define COMMAND_LEFT 0x01#define COMMAND_RIGHT 0x02#define COMMAND_UP 0x04#define COMMAND_DOWN 0x08int xValue = 0 ; // To store value of the X axisint yValue = 0 ; // To store value of the Y axisintcommand = COMMAND_NO;voidsetup() {Serial.begin(9600) ;}voidloop() {// read analog X and Y analog values xValue = analogRead(VRX_PIN); yValue = analogRead(VRY_PIN);// converts the analog value to commands// reset commandscommand = COMMAND_NO;// check left/right commandsif (xValue < LEFT_THRESHOLD)command = command | COMMAND_LEFT;elseif (xValue > RIGHT_THRESHOLD)command = command | COMMAND_RIGHT;// check up/down commandsif (yValue < UP_THRESHOLD)command = command | COMMAND_UP;elseif (yValue > DOWN_THRESHOLD)command = command | COMMAND_DOWN;// NOTE: AT A TIME, THERE MAY BE NO COMMAND, ONE COMMAND OR TWO COMMANDS// print command to serial and process commandif (command & COMMAND_LEFT) {Serial.println("COMMAND LEFT");// TODO: add your task here }if (command & COMMAND_RIGHT) {Serial.println("COMMAND RIGHT");// TODO: add your task here }if (command & COMMAND_UP) {Serial.println("COMMAND UP");// TODO: add your task here }if (command & COMMAND_DOWN) {Serial.println("COMMAND DOWN");// TODO: add your task here }}
Passos Rápidos
Copie o código acima e abra-o na Arduino IDE
Clique no botão Upload na Arduino IDE para carregar o código no Arduino
Empurre a alavanca do joystick para a esquerda/direita/cima/baixo ou em qualquer direção
Veja o resultado no Serial Monitor.
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
Ln 11, Col 1
Arduino Uno on COM15
2
※ Nota:
Em um dado momento, pode não haver nenhum comando, haver um comando ou dois comandos (por exemplo, UP e LEFT ao mesmo tempo)
Converte os valores analógicos em ângulos para controlar dois servo motores
Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!