Utilizando o módulo de joystick

Olá a todos,

nesse post demonstraremos como utilizar o módulo de joystick, que pode ser utilizado tanto para jogos como para controlar outros projetos como veículos, drones e braços de robôs. Esse módulo possui cinco pinos seguindo a seguinte distribuição:

  • Gnd: que deve ser ligado ao terra da placa;
  • +5V: que deve ser ligado ao 5V da placa;
  • VRx: pino onde faremos a leitura do valor do eixo X;
  • VRy: pino onde faremos a leitura do valor do eixo Y;
  • SW: pino onde faremos a leitura do estado do botão (pressionado ou não).

O funcionamento desse módulo é bem simples, pois ele é composto de dois potenciômetros, um para cada eixo do joystick e um botão. Portanto ao movimentarmos o joystick em alguma direção movemos os potenciômetros. Portanto a leitura desses potenciômetros deve ser realizada pelos pinos analógicos do Arduino ou outra placa que esteja utilizando.

Devido a simplicidade do módulo faremos nesse post um projeto um pouco mais elaborado: O joystick controlará dois servos, um para o eixo X e outro para o eixo Y e o botão acionará dois leds, um no circuito e outro na placa.

Caso tenha dúvidas sobre o uso dos servos consulte esse outro post dedicado a esse assunto.

O primeiro passo é montarmos o circuito. Conecte cabos do tipo macho-femea no joystick e em seguida conecte os pinos Gnd e 5V do módulo nas linhas da protoboard. O próximo passo é conectar os cabos dos pinos VRx e VRy aos pinos A0 e A1 do Arduino (ou os pinos equivalentes da sua placa). Em seguida conecte o cabo do pino SW na protoboard.

Agora passaremos para a montagem dos servos: Conecte os cabos de Vcc dos servos na mesma linha de furos da protoboard onde você conectou o pino 5V do joystick. Conexão semelhante deve ser feita com os cabos Gnd dos servos na linha de furos onde foi conectado o pino Gnd do joystick. Finalize essa etapa conectando os cabos de sinais dos servos nos pinos 9 e 10 do Arduino (ou outros pinos que tenham suporte a PWM).

Para finalizar o circuito, conecte o terminal negativo de um led ao cabo que está ligado ao pino SW do módulo e em seguida um resistor ao led e a linha do proboard que possui as conexões de 5V. Ligue finalmente um cabo do pino 5V do Arduino a essa última linha e outro cabo do pino Gnd do Arduino na linha onde foram conectados os Gnds tanto do módulo como dos servos.

Diagrama de montagem do circuito
Diagrama de montagem do circuito
Circuito montado
Circuito montado

Passaremos agora para o desenvolvimento do código. Primeiro declare o uso da biblioteca Servo e em seguida as variáveis para indicar os pinos de leitura do módulo de joystick, escrita dos valores para os servos e escrita do led embutido no Arduino (pino 13). Declare também uma variável que armazenará o valor do eixo X e dois objetos para do tipo Servo.

#include <Servo.h>

int joystickX = A0;

int joystickY = A1;

int botao = 7;

int led = 13;

int eixoX = 9;

int eixoY = 10;

int valorX;

Servo servoX;

Servo servoY;

 

Passaremos agora para a inicialização do projeto na função setup. Configure o pino do botão do joystick como INPUT e o pino do led da placa como OUTPUT. Em seguida utilize a função attach para indicar ao Arduino em quais pinos estão conectados os cabos de sinal dos servos. Finalize a função setup posicionando os servos em 90 graus e atribua esse valor na variável que armazena o valor do servo X.

void setup() {

pinMode(botao, INPUT);

pinMode(led, OUTPUT);

servoX.attach(eixoX);

servoY.attach(eixoY);

servoX.write(90);

servoY.write(90);

valorX = 90;

}

Passaremos agora para a função loop, que executará a lógica de controle do nosso projeto.

O primeiro trecho fará a leitura do botão e quando acionado ligará o led da placa. Devido a montagem do circuito a leitura está invertida, ou seja, quando o botão é acionado o estado do pino é LOW e quando o botão é solto ele volta para o estado HIGH. Por isso foi colocado o if para a inversão da lógica:

 

void loop() {

int valor = digitalRead(botao);

if (HIGH == valor)

digitalWrite(led, LOW);

else

digitalWrite(led, HIGH);

}

 

O próximo passo é o controle do eixo X. O servo desse eixo será movimentado somente quando o valor do joystick ultrapassar um determinado valor para evitar acionamentos indevidos, e continuará movimentando no sentido até que seja atingido o valor máximo ou que a alavanca do módulo volte para a posição inicial. Essa característica foi implementada com os dois conjunto de IFs. O primeiro verifica o valor do potenciômetro que controla o eixo e o segundo garante que o servo não movimentará mais do que o limite que desejamos:

 

valor = analogRead(joystickX);

if (800 < valor)

valorX += 1;

else if (200 > valor)

valorX -= 1;

 

if (valorX > 160)

valorX = 160;

else if (valorX < 10)

valorX = 10;

 

servoX.write(valorX);

 

Já para o eixo Y teremos outro comportamento: o servo movimentará proporcionalmente ao movimento da alavanca do joystick. Para realizar esse comportamento faremos a leitura do valor do eixo Y e em seguida utilizaremos a função map, que produz o efeito de uma “regra de 3” calculando o valor do grau do servo baseado no valor do eixo Y:

 

valor = analogRead(joystickY);

int valorY = map(valor, 0, 1023, 10, 160);

servoY.write(valorY);

 

Para finalizar o código vamos fazer o Arduino aguarda 50 microsegundos, abaixo temos o código completo da função loop:

 

 

void loop() {

int valor = digitalRead(botao);

if (HIGH == valor)

digitalWrite(led, LOW);

else

digitalWrite(led, HIGH);

 

valor = analogRead(joystickX);

if (800 < valor)

valorX += 1;

else if (200 > valor)

valorX -= 1;

 

if (valorX > 160)

valorX = 160;

else if (valorX < 10)

valorX = 10;

 

servoX.write(valorX);

valor = analogRead(joystickY);

int valorY = map(valor, 0, 1023, 10, 160);

servoY.write(valorY);

delay(50);

}

 

Onde encontrar:

Obrigado a todos e até o próximo post!

Medindo distâncias com o sensor de ultrasom

Olá a todos,

nesse post demonstraremos como utilizamos  sensor de ultrasom HC-SR04 para medir distâncias. Esse sensor calcula o tempo que as ondas de ultrasom que ele mesmo emite demoram para retornar. O retorno dessas ondas é chamado de eco. Como a velocidade da onda de ultrasom é conhecida, o sensor mutiplica o tempo que o eco levou para retornar por essa velocidade para calcular a distância.

O sensor deve ser alimentado com 5V, portanto podemos utilizar o pino de 5V do Arduino. A distância de operação do sensor vai de menos de um 1cm para aproximadamente 4 metros.

Iniciaremos montando o circuito. Primeiro ligue o pino Vcc do sensor no 5V do Arduino ou de outra placa que esteja utilizando. Em seguida conecte o pino Gnd ao terra da placa. Por fim conecte os pinos Echo e Trig a dois pinos digitais do Arduino. A imagem abaixo mostra o circuito montado:

Circuito com o sensro de ultrasom
Circuito com o sensro de ultrasom

O próximo passo é escrevermos o código. O primeiro passo é declararmos as variáveis que serão utilizadas no código: uma para o pino do Arduino onde conectamos o pino trig do sensor, outra para o pino da placa onde foi conectado o pino echo do sensor e outras três variáveis para a o tempo do eco, distância em cm e em polegadas:

int trigPin = 11;
int echoPin = 12;
long duration, cm, inches;

O próximo passo é configurarmos os pinos da placa como saída e a porta serial, onde escrevemos a distância medida pelo sensor:

void setup() {

Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}

O passo final é utilizarmos o sensor na função loop. O uso do sensor é bem simples: primeiro devemos mandar um pulso alto de 10 microsegundos no pino trig o sensor e em seguida esperar por outros 10 microsegundos. Após essa espera o sensor deve ter calculado a distância, que será medida no pino da placa que está conectada ao pino Echo do sensor. Obtenha esse valor com a função pulseIn.

digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

duration = pulseIn(echoPin, HIGH);

O passo final é calcular a distância em cm ou polegadas. Para obter a distância em cm divida o valor obtido por 2 e depois por 29.1. Já para obter o valor em polegadas divida o valor original por 2 e depois por 74.

duration = pulseIn(echoPin, HIGH);

cm = (duration/2) / 29.1;
inches = (duration/2) / 74;

Após esse cálculo o valor poderá ser utilizado, no caso desse post apenas enviamos para a porta serial, mas você poderá utilizar esse valor para evitar batidas com outros objetos, acionar ou desligar algum dispositov ou tomar alguma outra decisão decisão.

void loop() {

digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);

duration = pulseIn(echoPin, HIGH);

cm = (duration/2) / 29.1;
inches = (duration/2) / 74;

Serial.print(inches);
Serial.println(” in “);
Serial.print(cm);
Serial.println(” cm “);

delay(250);
}

Onde encontrar:

Obrigado a todos e até o próximo post!