17 de abril de 2021

Do bit Ao Byte

Embarcados, Linux e programação

Painel de comandos para simulador de voo

simulador de voo

Nos últimos artigos escrevi um bocado sobre a utilização do multiplexador CD74HC4067, mas tinha um propósito: utilizá-lo como “gerenciador de botões”, para fazer um painel de avião para simulador de voo – no caso, estou usando X-Plane porque roda no Linux, mas esses controles funcionarão em outros simuladores.

Comecei pelos botões que tenho em meu Thrustmaster Top Gun Afterburner II, porque me faltaram alguns acessos importantes, como o speedbreak e o reverso. Usar atalhos no teclado desvia a atenção, fora ter que os decorar. Por fim, vou fazer o manche e o throttle em outro painel e assim terei um conjunto “de bolso” para carregar na mochila do notebook. Mas apesar do resultado ser prático, o caminho percorrido deu um pouco de trabalho. Vamos lá.

Atalhos do teclado

Às vezes dá vontade de remapear atalhos, mas acabamos colidindo com outro atalho que também seria adequado ao uso de determinada tecla ou combinação. Para livrar algumas teclas, pensei em fazer o mapeamento de atalhos que não estão no teclado, utilizando do F13 ao F22 para esse projeto. O problema é que o XFree utiliza praticamente todos.

Já escrevi a respeito em algum momento (como o “descorretor ortográfico“), mas hoje tenho dificuldade de achar as referências nos mais de 800 artigos publicados. Mas o que me inspirou a fazer esse projeto foi um vídeo do Circuito Maker. Tanto o vídeo como o projeto foram muito bem elaborados, recomendo o vídeo e o canal.

Apesar de não tê-los usado, vou descrever o mapeamento de teclas no Linux.

Como capturar código de tecla com xev

O xev é um programa nativo para capturar eventos dos dispositivos de caractere, como mouse e teclado.

xev

O projeto está sendo feito com o Arduino Pro Micro, que utiliza uma MCU Atmega32u4. A primeira coisa a fazer é criar o programa do painel, depois fazer o mapeamento dos códigos enviados. Para capturar o código, utilizamos o programa xev.

Suponhamos que não sabemos um código gerado ao pressionar um botão (keycode xxx). Nesse caso, rodamos o programa xev, pegamos o código e o mapeamos com o programa xmodmap:

xmodmap -e 'keycode 202 = F24'
xmodmap -pke | grep 'keycode 202'

No primeiro comando o inserimos e no segundo, consultamos o mapeamento. Simples assim, já temos uma definição de tecla para um código desconhecido. Mas como nada é perfeito, fiz a montagem e solda de cabeça, achando que era fácil demais. Bem, não que seja difícil, mas não dá pra adivinhar também. Fiz solda errada e planejei errado a disposição, mas ao invés de um retrabalho no hardware, preferi ajustar por software.

simulador de voo

Para saber quais dos atalhos pretendidos estão em uso, um loop em shell especificando os códigos trará todos os resultados de uma vez. Por exemplo:

for i in 191 192 193 194 195 199 197 200 201 202; do xmodmap -pke |egrep "keycode $i";done

Foi bastante irritante ver que o servidor gráfico tomou conta dos códigos que eu iria usar.

xmodmap

Já estava tudo mapeadinho, eu iria usar assim:

bitkeycodeFx
8191F13
12193F15
10195F17
14197F19
9202F24
0192F14
4194F16
2199F21
6200F22
1201F23

E a disposição física dos bits ficou assim:

81210149
04261

Daí fiz o mapeamento no sistema com o xmodmap:

verificar xmodmap - simulador de voo

Mas não foram assumidos, pela já citada razão.

Código da botoeira do simulador de voo

Ainda falta implementar a lógica para o LED, seu propósito não será apenas mostrar que está ligado. O código apenas varre os 16 bits, e quando o retorno da leitura for 0 (lógica invertida), então a chave é enviada e um delay de 800ms aguarda a liberação do botão antes de uma nova leitura, para evitar duplicidade. Vamos ver na prática se 800ms é tempo demais ou de menos. Como fiquei desmotivado por ter que usar códigos normais de teclado, não me empenhei para elaborar o resto do planejado. De qualquer modo, é didático. A única vantagem que restou é a irrelevância de qual tecla será usada, uma vez que o atalho não precisa ser intuitivo. Posso usar (e usei) ponto-e-vírgula como atalho. Na hora de mapear, basta apertar o respectivo botão no programa pretendido (O simulador de voo “X-Plane”, no meu caso).

#include "Keyboard.h"

uint16_t pb_values = 0;

#define PIN_LED_MODULE 9
#define PIN_SIG_READ   8

//247 248 249 250 252 253 230 219 217 202
uint8_t b8 = 202;
uint8_t b0 = 98;
uint8_t b12 = 13;
uint8_t b4 = 12;
uint8_t b10 = 250;
uint8_t b2 = 252;
uint8_t b14 = 253;
uint8_t b6 = 230;
uint8_t b9 = 219;
uint8_t b1 = 217;

//                     0     1      2    X    4    X    6    X    8     9    10    X   12    X  14
uint8_t keymap[15] = { ';',  'n',  '2',  0,  '3',  0,  'h',  0,  'z',  'l',  '1',  0,  'k',  0, 'd'};

uint8_t getValues(){
    for (uint8_t i=0;i<16;i++){
        PORTF |= (i<<4); //escolhe o pino
        
        delay(1); //talvez baixar esse valor, mas é indiferente
        pb_values = digitalRead(PIN_SIG_READ); //lê o valor do pino

        if (pb_values == 0){
            Keyboard.press(keymap[i]);
            delay(100);
            Keyboard.releaseAll();
            delay(800); //delay antes da próxima leitura para não duplicar.
        }
    
        PORTF &= ~(i<<4); //libera o pino
        delay(1);
    }
}

void setup(){
    DDRF   = 0xF<<4;
    PORTF &= ~(0xF<<4);

    pinMode(PIN_SIG_READ,INPUT_PULLUP);
    pinMode(PIN_LED_MODULE,OUTPUT);
    digitalWrite(PIN_LED_MODULE,HIGH); //por enquanto só mostra que está ligado
    
    Keyboard.begin();
}

void loop(){
    getValues();   
}

Onde comprar Arduino Pro Micro

Esse Arduino Pro Micro é da CurtoCircuito, que pode ser adquirido a partir desse link. No próximo módulo vou adicionar alguns recursos especiais e nesse caso vou utilizar um Pro Micro “parrudo”, da MASUGUX, com ESP12F. Aproveite pra visitar também a MASUGUX na Shopee, agora que eles estão saindo do Mercado Livre, que é um péssimo negócio atualmente.

Onde comprar acrílico 100% cast

O projeto foi feito em acrílico 100% da Sinteglas, que eu sempre recomendo nos artigos DIY. O site continua como antes, mas ligue na Sinteglas e fale com a Sandra, que é gente fina demais! Deem uma conferida no Instagram para apreciar os produtos da Sinteglas.

Onde comprar botões quadrados / onde comprar multiplexador

Os botões quadrados e o multiplexador (baratíssimo, por sinal) são da Eletrônica Mangili, cuja lista de produtos pode ser acessada através desse link.

Como cortar acrílico

Dá pra fazer com uma micro retífica, mas não vai ficar na mesma qualidade, sem dúvidas. O ideal é usar uma CNC laser e nesse caso, recomendo a CNC L-560 da ECNC, que é uma CNC laser intermediária e que vale cada centavo. Sou apaixonado por ela; comunicação serial, em rede, USB, display interativo, controle remoto, sistema de segurança e controle de temperatura, e mais um monte de coisas das quais já descrevi no artigo “Qual CNC laser comprar“. O site da ECNC é esse, para quem quiser conhecer os produtos.

Espero que gostem mesmo não sendo o que eu pretendia apresentar na ideia inicial desse projeto para simulador de voo.

Até a próxima!

Revisão: Ricardo Amaral de Andrade