Existem inúmeras formas de controlar diretamente algum projeto que usa Arduino, por exemplo, usando botões, potenciômetro, criando uma interface no celular e entre outros… Porém, as formas mais interessantes costumam ser um problema, já que são difíceis de implementar e possuem um custo relativamente alto, quando comparado com as outras formas.
Mesmo assim, existe um jeito muito interessante e que apenas reutiliza um joystick que você não usa mais. E é o que nós vamos ver hoje. Claro que, para quem não tem um, isso representa um custo.
Caso você queira aprender sobre como funciona um controle por dentro, eu recomendo esse post.
Técnica Utilizada
Existe uma forma de controlar um controle de playstation que não exige que ele seja aberto. Essa forma usa os próprios pinos que saem do cabo. E existe uma biblioteca pronta que faz todo o trabalho chato pra você. O material para fazer desse jeito pode ser encontrado aqui.
Entretanto, meu intuito é fazer um projeto que seja possível entender 100% do processo e que também seja simples de executar. Sendo assim, eu vou usar um joystick de computador (imagem abaixo) e pretendo usar os componentes internos diretamente. Dessa forma, independente do controle que você utilize, será possível entender e reproduzir com o seu controle.
Ao contrário do que aparece normalmente, esse joystick que eu vou usar possui os componentes ligados diretamente aos fios que saem do cabo. Exceto os botões, que passam por um CI que processa os dados (igual o restante dos controles). Porém, eu resolvi soldá-los diretamente aos fios que saem do controle. Então, de certa forma, não é necessário abrir meu controle. Só para intuito de esclarecimento, vou mostrar alguns pinos do conector (imagem abaixo).
A ordem é de cima para baixo e da esquerda para direita:
Pino 1 – 5V que liga em uma ponta de todos os potenciômetros e em uma ponta dos botões
Pino 2 – Terminal 1 do botão 1
Pino 3 – Potenciômetro Eixo Lateral
Pino 4 – Terminal 2 do botão 1 e botão 2
Pino 6 – Potenciômetro Eixo Frontal
Pino 10 – Terminal 1 do botão 2
Pino 11 – Potenciômetro Slider Lateral
Pino 13 – Potenciômetro Slider Topo
Materiais
Os materiais são os mais simples possíveis:
- Um controle de videogame ou computador que não é usado mais
- Alguns fios para conexão
- Um Arduino
- 3 LEDs (de preferência de cores diferentes)
- 3 resistores de 220Ω
- Ou apenas 3 resistores para limitar a corrente dos LEDs
- (Opcional) Um resistor de 470Ω
- Veja se você precisa dele na montagem
Montagem
Informações prévias
O objetivo da montagem é fazer com que dois botões do meu controle acionem 2 LEDs (cada um aciona um) e um potenciômetro – que é responsável pelo movimento da haste central – controlará o brilho do último LED. Possivelmente, você está usando um controle que possui um analógico, e caso você não saiba, o analógico é um potenciômetro, então utilize ele para controlar o brilho do LED. Sendo assim, eu vou usar os pinos 1, 2, 3, 4 e 10 (veja o tópico da “Tecnica Utilizada” para entender o que eu vou fazer).
Como saber se você precisa do resistor de 470Ω? É simples: você não precisa se você tiver acesso a todos os terminais do seu potenciômetro, mas, caso apenas 2 terminais estejam disponíveis (que é meu caso), você vai precisar. Isso, porque com dois terminais o potenciômetro funciona como uma resistência variável simples e fica inviável fazer medições, então precisamos transformá-lo em um divisor de tensão, que é o caso dos 3 terminais. O valor de 470Ω é aleatório e pode ser substituído por outro. Por causa dessa diferença, farei dois circuitos, um para cada caso. No circuito, eu vou simbolizar os botões como se fossem um pushbutton comum, mas a ligação é a mesma, e o mesmo vale para o potenciômetro.
Circuito
Circuito 1 – Usando resistor de 470Ω
Circuito 2 – Sem usar o resistor de 470Ω
Como eu disse anteriormente, o potenciômetro está atuando como divisor de tensão, sendo a tensão de entrada 5v e a tensão de saída está sendo lida no pino A0. Enquanto isso os botões estão ligados, de um lado no GND e do outro nos pinos 2 e 3. Ou seja, quando os botões forem pressionados, os pinos 2 e 3 vão ler sinal de nível baixo (0v). Por último, os LEDs basicamente vão ser controlados pelos pinos 4,5 e 6 e a outra ponta deles está ligada ao GND. Uma observação importante é que o LED que nós controlaremos o brilho deve ser ligado a um pino com PWM (um pino que possua um ~ na frente).
Programação
Antes de fazer o nosso programa final, nós precisamos saber qual é a faixa de valores que o pino analógico 0 irá ler. Para isso, é preciso fazer um programa que imprima esses valores no monitor serial. Aprenda como fazer leituras analógicas neste post.
1 2 3 4 5 6 7 8 | void setup() { Serial.begin(9600); pinMode(A0, INPUT); } void loop() { Serial.println(analogRead(A0)); delay(100); } |
Basta rodar o código acima, abrir o monitor serial, movimentar o analógico (potenciômetro) e anotar os valores que aparecerão no monitor serial. No meu caso foi cerca de: movimentando a haste para um lado deu 780 e para o outro aproximou de 0. Feito isso, agora vamos para o código final.
Explicação detalhada
Primeiro temos que definir os pinos:
1 2 3 4 5 | int bot1 = 2; int bot2 = 3; int led1 = 4; int led2 = 5; int led3 = 6; |
Agora, na nossa inicialização, vamos definir os pinos dos LEDs como saídas, o pino analógico A0 como entrada e os pinos dos botões como entradas também, porém ativando o pull-up interno para garantir que a entrada dos botões não fique flutuando quando o botão não for pressionado, isto é, não ficar lendo valores aleatórios que não deveria. Entenda sobre resistência pull-up neste post.
1 2 3 4 5 6 7 8 | void setup() { pinMode(bot1, INPUT_PULLUP); pinMode(bot2, INPUT_PULLUP); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(A0, INPUT); } |
Na nossa função loop, será preciso fazer a leitura de A0. Portanto, basta criar uma variável (o recomendável é uma int) recebendo a leitura do pino A0.
1 | int pot = analogRead(A0); |
Antes de entrar na lógica do brilho do LED, vamos programar os botões. A ideia é simples: se o botão 1 for pressionado então o led1 deve ser acionado e, caso contrário, deve ser apagado. O mesmo vale para o botão 2 que controla o led2.
1 2 3 4 5 6 7 8 9 10 | if(digitalRead(bot1) == 0){ digitalWrite(led1, HIGH); }else{ digitalWrite(led1, LOW); } if(digitalRead(bot2) == 0){ digitalWrite(led2, HIGH); }else{ digitalWrite(led2, LOW); } |
Para controlar o brilho do LED, nós usaremos um PWM e o comando para isso funciona numa escala de 0 a 255. Já que os valores do nosso potenciômetro – os valores anotados anteriormente – ultrapassam essa faixa, é preciso remapear a nossa escala para a escala de 0 a 255. Portanto, vou utilizar o comando map para isso, que, de certa forma, faz uma regra de 3.
1 | int brilho = map(pot, 0,780,0,255); |
Depois disso, basta pegar esse valor remapeado e acionar o LED com ele (Entenda melhor lendo o post sobre isso).
1 | analogWrite(led3, brilho); |
Código completo
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | int bot1 = 2; int bot2 = 3; int led1 = 4; int led2 = 5; int led3 = 6; void setup() { pinMode(bot1, INPUT_PULLUP); pinMode(bot2, INPUT_PULLUP); pinMode(led1, OUTPUT); pinMode(led2, OUTPUT); pinMode(led3, OUTPUT); pinMode(A0, INPUT); } void loop() { int pot = analogRead(A0); if(digitalRead(bot1) == 0){ digitalWrite(led1, HIGH); }else{ digitalWrite(led1, LOW); } if(digitalRead(bot2) == 0){ digitalWrite(led2, HIGH); }else{ digitalWrite(led2, LOW); } int brilho = map(pot, 0,780,0,255); analogWrite(led3, brilho); } |
Assista o resultado do projeto no vídeo no início do post. Enfim, agora você já pode controlar seus robôs usando um joystick antigo.
BOA NOITE.
TENHO VARIAS DUVIDAS SOBRE ESSA LIGAÇÃO DOS POTENCIÔMETRO QUE VC FEZ.
VC TERIA UM ESQUEMA MAS DETALHADO, ESTOU QUERENDO USAR O EIXO X E Y DESSE JOYSTICK.
TERIA ALGUMA IDEIA
Boa noite,
Fiz um esquema explicitando um pouco melhor as informações que descrevi no post, veja ele aqui. Os dois potenciômetros da imagem são responsáveis pela movimentação do manche do joystick (x e y da haste). Mesmo assim, acredito que você possa ter mais algumas dúvidas, então sugiro ver o post que mostro dentro desse joystick. Se o seu joystick for igual ao meu, basta utilizar os pinos mostrados no esquema, pois eles devem ter a mesma função para você.
Agora, se não for o caso, será necessário abri-lo, para então encontrar os potenciômetros que você deseja. E assim, fazer um teste de continuidade com um multímetro para determinar qual pino pertence a cada potenciômetro. Aliado a isso, você terá que ver como é feita a ligação com o potenciômetro. Como expliquei no post, e de acordo com a imagem, no meu caso eles estão ligados como varistor. Isso implica em ter que utilizar um resistor adicional para fazer a leitura dele.
Espero que tenha te ajudado. Qualquer outra dúvida remanescente, fique à vontade para perguntar.