17 de maio de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Joystick digital com Arduino

Joystick digital

Quero apresentar dois itens nesse artigo: o joystick digital “e” o Arduino. O joystick digital é da CurtoCircuito, e o Arduino é da Saravati. Vou utilizar esse joystick para fazer o movimento do robô por WiFi, do artigo “Robô controlado por WiFi“. Falta colocar a câmera no robô, como citei no artigo ou no vídeo (não me lembro) e ele será pilotado sem tirar os olhos do monitor.

Arduino Mega 2560 Micro ou Mini

Fiz um artigo introdutório sobre essa placa que nada mais é do que um Mega 2560 de tamanho reduzido. Além da placa ser bonita, ocupa menos espaço e pode ser mais adequada para projetos que utilizem Arduino e precisem de muitos GPIO. A vantagem de não ocupar espaço se aplica ao case. Para programá-lo é tão simples quanto o Mega grandão. Se quiser saber um pouco mais sobre essa placa, leia esse artigo. Nele também tem link de compra, mas para facilitar, deixo mais uma vez o link desse Arduino Mega 2560 Micro (ou Mini).

Joystick digital

Como citei, o joystick digital é da CurtoCircuito. Ele é bem menor do que eu imaginava pela foto, mas na imagem de destaque desse artigo dá pra ter uma ideia mais precisa de seu tamanho, disposto sobre o teclado do meu laptop. Já vou deixando o link do produto, mas vou dar dicas e citar coisas que considero importantes no código. A implementação é uma baba, por isso recomendo apenas dar atenção às ideias que utilizei no código.

Pinout

A disposição dos pinos é essa da imagem abaixo. O primeiro pino (COM) vai ao GND. No código, coloquei os pinos em INPUT_PULLUP.

Joystick digital

No Arduino, utilizei os pinos de 4 à 10. A ordem não importa, depois é só mapear como desejar.

Código

O código de exemplo está em um formato para que a saída seja compreensível em relação ao artigo, mas como é uma interface máquina-máquina, não precisaria mais do que 1 Byte identificador, além do início e fim de mensagem. Vou discorrer mais sobre o código, mas primeiro vou apresentá-lo:

#include <Arduino.h>

struct {
    uint8_t up    = 0;
    uint8_t down  = 0;
    uint8_t left  = 0;
    uint8_t right = 0;
    uint8_t mid   = 0;
    uint8_t sett  = 0;
    uint8_t rst   = 0;
} action;

const char *button_names[] = {"^SET$","^RST$","^MID$","^RIGHT$","^LEFT$","^DOWN$","^UP$"};

void setup() {
    Serial.begin(9600);
    for (uint8_t i=4;i<11;i++){
        pinMode(i,INPUT_PULLUP);
    }
}

void loop() {
    for (uint8_t i=4;i<11;i++){
        uint8_t clicked = digitalRead(i);
        if (clicked == 0){
            Serial.println(button_names[i-4]);
            delay(600);
        }
    }
  delay(300);
}

Simples ou não?

Criei uma struct chamada action para acumular a sequência de comandos a enviar. Isso será implementado no próximo artigo relacionado ao robô supracitado. As mensagens nesse momento de teste foram armazenadas em um array de array de char. Se tem acompanhado os artigos relacionados a ponteiros (começando desse), fica fácil o entendimento da declaração de *button_names[].

Na função loop() simplesmente está sendo feita uma varredura nos pinos para avaliar o estado. Esse tipo de varredura é chamado polling. A outra maneira de fazê-lo é por interrupção. Fazendo polling, temos que contar com a disponibilidade da função loop() para ler sem atraso. Se alguma outra coisa estiver no fluxo do loop e consumir tempo, podemos perder o evento do joystick. Com interrupção, a qualquer momento o fluxo pode ser interrompido e a interrupção tratada. Já escrevi sobre interrupções em todas as plataformas, não vou nem procurar porque são muitas, mas vou deixar ao menos um link para interrupções e timer com Arduino.

Fiz um singelo vídeo para apresentar o joystick e o Arduino. Se puder fazer a gentileza de emprestar uns dois minutos do seu tempo para vê-lo e dar um like, o link é esse. Se não é inscrito ainda no canal DobitaobyteBrasil no Youtube, inscreva-se e prestigie-nos!

 

Revisão: Ricardo Amaral de Andrade