Logo Pisciotta

PISCIOTTA

Soluções Inteligentes

PROFESSOR

Listar
Artigos, curiosidades e muitas dicas.

Aproveite, curta, compartilhe.

Joystick Analógico



ARDUINO

830 Views - 11 Curtidas




Joysticks analógicos são interfaces de entrada de dados muito boas quando se tratam de valores proporcionais a um movimento ou intensidade. Podem ser utilizados, por exemplo, para controlar servomotores em aplicações diversas, como direção de veículos ou braços robóticos.

O Conceito

Um Joystick analógico é um mecanismo composto por dois potenciômetros e um botão. Os dois potenciômetros são dispostos em 90 graus um do outro, representando os eixos X e Y. Esses potenciômetros possuem uma mola que os mantém na posição central, assim quando empurramos o joystick em uma das posições, o valor da resistência é alterado, proporcionalmente ao deslocamento efetuado, e ao soltar a manopla, a mola leva o potenciômetro à posição central.

Joystic ElecFreaks

O modelo que trato nesse post é da empresa ElecFreaks versão 1.4 (embora o verso da placa esteja escrito versão 1.2 na serigrafia - vou considerar a versão maior presente no lado TOP da placa). Essa versão possui três conectores com três terminais cada, sendo sempre dois terminais de alimentação e um de sinal. O terminal V é a alimentação positiva de 5V, G é o negativo GND, X e Y são os sinais dos potenciômetros e K é o sinal do botão de pressão. Existe furação para soldar um único conector no canto superior direito, mas resolvi utilizar os pinos dos conectores já presentes.

Joystic ElecFreaks

Se você movimentar o joystick na posição horizontal, somente o valor da resistência X será alterado, aumentando se você empurrar o curso para um lado e diminuindo se você empurrar para o lado contrário. O mesmo ocorre para o eixo Y quando você movimenta o cursor para cima e para baixo. Essa alteração de resistência gera uma tensão proporcional ao movimento efetuado, que pode ser lido por uma entrada analógica do microcontrolador (o Arduino por exemplo) e então executar uma ação de acordo com o programa elaborado.

Podemos utilizar os Joysticks analógicos para fazer um navegador de menu em um LCD, por exemplo, o que tornaria o uso do seu dispositivo muito fácil e intuitivo. Vejamos adiante alguns exemplos.

Exemplos

Exemplo 1

Este exemplo de código mostra como os dados podem ser lidos utilizando o joystick.


//Programa para Ler os dados do Joystick e exibir na Serial
// X -> A0
// Y -> A1
//Botão -> D2
void setup() {
Serial.begin(9600); //Inicializa a serial
//Entradas analógicas não precisam ser iniciadas, mas as digitais sim
pinMode(2, INPUT);
//Escreve cabeçalho na Serial
Serial.println("Verificando o comportamento de um Joystick");
Serial.println();
Serial.print("X");
Serial.print("\t"); //Tabulação
Serial.print("Y");
Serial.print("\t");
Serial.println("Click");
}

void loop() {
// Imprime os elementos individuais
Serial.print(analogRead(0));
Serial.print("\t");
Serial.print(analogRead(1));
Serial.print("\t");
Serial.println(digitalRead(2));
// Aplica espera de 500 milisegundos
delay( 500);
}

Esquema de ligação do Joystick analógico

Observa-se que ao descarregar o programa no Arduino e abrir o Serial Monitor, é impressa a informação numérica dos valores de X, de Y e o status do botão (0 ou 1) a cada meio segundo. Com isso você pode compreender que deixar o joystick na sua posição normal não representa um valor igual a zero, mas sim um valor mediano (próximo à metade do valor máximo).

Mas.... o que é esse valor apresentado? Esse valor não é a resistência do potenciômetro, nem a tensão disponível na entrada analógica, nem tampouco a corrente elétrica. O valor apresentado é a leitura do conversor Analógico/Digital do microcontrolador com resolução de 10 bits. Quando se fala em 10 bits, significa que os valores de tensão analógica na entrada do Arduino são traduzidas em um número inteiro que vai de 0 a 1023 (pois 2 elevado a 10 é igual a 1024 combinações, ou seja, de 0 a 1023). Portanto, quando se aplica uma tensão de 0V (zero volts) na entrada analógica do microcontrolador, será realizada a leitura do valor 0, e 1023 será o valor correspondente ao máximo suportado pela entrada, que é 5V (cinco volts). Cada unidade desse valor representa 5V/1023 = 0,0049V.

Observa-se também que mesmo sem encostar no joystick os valores ficam se alterando constantemente ao redor de um valor médio. Isso acontece em qualquer leitura analógica devido principalmente às interferências eletromagnéticas percebidas na entrada analógica do microprocessador.


Exemplo 2

Este exemplo de código mostra como é possível controlar servomotores utilizando o joystick.


//Programa para Ler os dados do Joystick e controlar dois ServoMotores
// X -> A0
// Y -> A1
// Botão -> D2
// Servo 1 -> 10
// Servo 2 -> 11
// LED -> 13
void setup() {
Serial.begin(9600); //Inicializa a serial
//Entradas analógicas não precisam ser iniciadas, mas as digitais sim
pinMode(2, INPUT);
pinMode(13, OUTPUT);
pinMode(11, OUTPUT);
pinMode(10, OUTPUT);
}

void loop() {
digitalWrite(13, digitalRead(2)); //Aciona o LED 13 de acordo com o botão do Joystick
analogWrite(11, map(analogRead(0), 0, 1023, 10, 245));
//comando analogWrite escreve um valor PWM no pino. O valor deve ser entre 0 e 255.
//Como o valor lido pela entrada vai até 1023, usa-se o comando map para fazer uma regra de três
// com o valor lido e o valor desejado, tanto para o X quanto para o Y
//No caso coloquei os valores da saída entre 10 e 245 porque os servomotores da China nunca permitem o deslocamento de 180 graus (como deveriam)
//então limito o movimento para não forçar os motores nos extremos.
analogWrite(10, map(analogRead(1), 0, 1023, 10, 245));
// Aplica espera de 50 milisegundos
delay(50);
}

Esquema de ligação do Joystick analógico com servomotores

Utilizamos as saídas PWM dos pinos 10 e 11 para controlar dois servomotores de 9g utilizados em aeromodelismo. Vale ressaltar que os servomotores se movimentam em teoria 180°, mas na prática quase nenhum servomotor permite o controle suave em todo esse percurso: geralmente os extremos causam uma o trabalho forçado dos servomotores por tentarem chegar a uma posição que o sistema mecânico não consegue chegar. Isso ocorre por mal ajuste do sistema eletrônico em relação ao sistema eletrônico dentro do servomotor. Para evitar esse esforço prejudicial aos servomotores, evita-se colocar os valores 0 e 255 na saída PWM. No meu exemplo eu limitei o valor mínimo em 10 e o valor máximo em 245.

Com essa experiência se pode compreender como utilizar o Arduino para trabalhar com valores analógicos na entrada e com sinais PWM na saída (simulando um sinal analógico), o que é útil em um grande número de aplicações práticas.

Até a próxima.