Eu realmente amo tutoriais em vídeo. Por alguma razão, eu pessoalmente percebo as informações do texto muito, muito mal. Mas há coisas em que não há muita informação no papel. Pegue, por exemplo, as lições de tocar balalaica: no YouTube, há discussões maravilhosas sobre como tocar essa ou aquela melodia (quem estiver interessado, estamos procurando por "Sergey Vorontsov"), mas é difícil repetir e memorizar a sequência do vídeo em streaming. É necessário escrever no papel (a julgar pelos comentários das lições, alguns o fazem) ou comprar materiais adicionais (mas não sou ganancioso, mas caseiro).

Em geral, no meu caso de balalaica, e com muitos outros, tenho que ir assim: olhei para o fragmento, parei, repeti várias vezes atrás do autor e continuei assistindo. Se algo não está claro - rebobinado, olhou mais de perto. Mas como encerrar tudo se suas mãos estão ocupadas? Além disso, no meu caso, eles estão ocupados, se não com um enorme acordeão de botão, mas ainda assim alguns, mas com uma balalaica. Então, você precisa trabalhar com as pernas.
Muitos anos atrás, quando toda a humanidade progressista usava teclados PS / 2, eles nos trouxeram dezenas de teclados USB para o projeto. Obviamente, nós os conectamos a uma máquina, pressionamos Ctrl em uma delas, Alt na segunda e Del na terceira. O efeito foi alcançado. Desde então, sei que os teclados USB funcionam completamente em paralelo, para que você possa conectar outro para ajudar o principal, que enviará alguns códigos.
Então nasceu a idéia de fazer um pedal que finge ser um teclado e envia códigos de controle para o jogador. Como jogador, inicialmente escolhi o VLC Player, pois ele possui botões de controle bem documentados, mas depois os códigos que eu selecionei tinham exatamente o mesmo objetivo ao assistir vídeos no YouTube no modo de tela cheia. Isso é bom porque, com várias visualizações on-line, para as impressões do anúncio, algo parece cair na mente do autor. Assistir ao download não seria tão ético.
Então, começamos a projetar o dispositivo.
Lógica de trabalho
No começo, eu queria fazer vários pedais, cada um para sua própria função. Inicialmente, contei 3-4 dessas funções: ligado, desligado, vento lá, vento de volta. Mas então eu descobri quanto plástico seria necessário, mais - como eu entenderia os pedais por toque e fiquei triste. Portanto, decidiu-se revisar radicalmente toda a lógica. Quais recursos são necessários? Start-stop, mas geralmente fica na mesma tecla, geralmente em um espaço. E rebobinando. O VLC Player tem "Shift + Left". YouTube, como se viu, também. E, se você pensa assim, não há mais funções.
Ótimo! Vamos fazer com que o pedal use brevemente a função "Start-Stop" e, longamente, pela função "Rewind".
No futuro, você pode expandir a funcionalidade. Você pode treinar o pedal para reconhecer o código morse. Minha esposa, tendo aprendido sobre a idéia, sugeriu os impulsos de controle de codificação usando elementos das danças irlandesas ... Em geral, você pode expandir a funcionalidade como quiser. Mas uma coisa é clara: um pedal é suficiente. Bem, agora faremos o reconhecimento de prensas longas e curtas.
A mecânica
Para quem anda em casa de chinelos, existe uma solução muito simples (eu achei no site do Thingiverse). Pegamos um botão com um diâmetro superior a um centímetro, aparafusamos em qualquer objeto em forma de caixa, pegamos um pedal. O problema é que eu não gosto de chinelos, então essa opção não me agrada pessoalmente. Preciso de uma superfície maior para que o pé não doa.
Pedais em grandes quantidades são vendidos no Ali Express. Você deve procurar a palavra Foot Switch. Os preços lá começam em 30 rublos, mas a esse preço, o custo de entrega pode ser de cerca de quatrocentos rublos. Após a pesquisa, descobri que é perfeitamente possível encontrar um pedal para o qual a soma "preço mais entrega" será de 150 rublos. Mas você terá que esperar uma média de alguns meses (estive esperando aqui recentemente por um cartão SD por todos os três meses).
Então eu segui o caminho mais rápido: fiz um pedal em uma impressora 3D. A experiência pessoal (e todas as opções com o Thingiverse) mostra que o eixo deve ser metálico; caso contrário, tudo quebrará rapidamente. Peguei o parafuso da mobília M6x60 que tinha com a porca presa a ele, bem como o botão (PSW-13), que ficava nas peças de rádio vizinhas, e os circulei o mais plástico possível. É assim que os materiais de origem se parecem:

Aqui estão eles, inseridos na metade inferior. Como você pode ver, a principal característica do projeto são as paredes, com pelo menos quatro milímetros de espessura. Com esses parâmetros, até mesmo um prototypper gentil se torna bastante durável. O botão é instalado sem uma porca, pois qualquer vazio embaixo dele levará à quebra do plástico e ele se mantém muito bem.

Aqui está uma versão quase compilada:

E aqui está o conjunto do pedal:

Em princípio, anexarei os arquivos STL, mas a solução não foi perfeita. No entanto, qualquer um pode repeti-lo (se encontrar o parafuso M6x60 com a porca correspondente e o botão PSW-13). Chega pela primeira vez, e então - você pode carimbar mecânica e encomendar com a ALI.
Dispositivo USB
Embora eu esteja promovendo ativamente o PSoC ultimamente, usá-lo nos pedais é um desperdício inédito. Considero a melhor solução uma placa de ensaio baseada no STM32F103C8T6, que agora pode ser encomendada no ALI Express por cerca de 120 rublos (incluindo entrega).

Obviamente, podemos especular que existem placas mais baratas baseadas no AVR, mas a diferença de preço não é significativa lá, e o STM32 tem um tempo de desenvolvimento significativamente menor devido à depuração via JTAG. Uma hora (mesmo em casa) - também custa algo. Portanto, de acordo com o critério total “preço do dispositivo + custos de mão-de-obra”, o STM32F103 é a melhor opção para esta tarefa. Além disso, tenho uma meia dúzia de modelos guardados para esse caso, portanto o tempo de espera da entrega agora é igual a zero para mim.
Naveguei na net para teclados USB prontos com base nesse chip. Eu encontrei um artigo sobre Habr como fazer um mouse USB. Mas eu preciso de um teclado. No tópico teclados, encontrei muitas dicas inteligentes nos fóruns (mas queria algo pronto) e alguns projetos complexos, porém prontos, no GitHub (mas queria algo claro). Mas quem procura sempre encontrará. Aqui está um
artigo maravilhoso, no qual há tudo o que é necessário (embora exista um no código, não tenho medo dessa palavra que não seja russa, um potencial DeadLock, mas escreverei meu próprio código). O principal é que todas as etapas estão claramente descritas, como obter um teclado USB a partir de um “peixe” pronto feito no Cube MX. A única coisa que o autor não fez não foi publicar os códigos de chave. Adicione-os aqui:

O ponto principal é que, na versão moderna do Cube MX, os nomes de arquivos, funções e até constantes são um pouco diferentes dos especificados nesse artigo, mas, por analogia, tudo é encontrado rapidamente. Eu poderia escrever uma nova versão do texto, mas onde está a garantia de que os desenvolvedores não mudarão tudo novamente? Eles gostam de fazer isso. Em geral, você pode ver os análogos no meu exemplo.
Então Criei um projeto básico no Cube MX, fiz todas as alterações recomendadas pelo artigo mencionado acima. O que vem a seguir? Em seguida, adicione uma descrição da porta do botão. Eu escolhi o PB12 (apenas porque o contato correspondente está localizado no canto da tábua de pão). Como eu sempre trabalho com ferro na biblioteca mcucpp de Konstantin Chizhov, removemos a definição de macro “-C99” nas propriedades do projeto, renomeamos
main.c para
main.cpp e adicionamos a declaração:
typedef Mcucpp::IO::Pb12 pedal1;
Adicionamos a inicialização da porta à função
main () (ativando o relógio da porta, definindo a direção da perna, ativando o suspender):
pedal1::ConfigPort::Enable(); pedal1::SetDirRead(); pedal1::SetPullUp (pedal1::Port::PullUp);
Na verdade, tudo é inicializado. Decidi construir o corpo principal à imagem do processo Verilog. Não sei por que, só queria. O processo é geralmente chamado de pulsos de clock. Eu decidi que os ticks do sistema são perfeitamente considerados como ticks. Portanto, a função regular do manipulador de
ticks do sistema no arquivo
stm32f1xx_it.c foi adicionada da seguinte maneira:

Mesmo texto: void SysTick_Handler(void) { /* USER CODE BEGIN SysTick_IRQn 0 */ /* USER CODE END SysTick_IRQn 0 */ HAL_IncTick(); HAL_SYSTICK_IRQHandler(); /* USER CODE BEGIN SysTick_IRQn 1 */ TickProcess(); /* USER CODE END SysTick_IRQn 1 */ }
Coloquei a
própria função
TickProcess () em
principal. cpp . Primeiro, considere-o na íntegra, depois em partes.
Aqui está a função completa: uint8_t report [8] = {0,0,0,0,0,0,0,0}; uint32_t* pReport = (uint32_t*)report; extern "C" void TickProcess() { // 20!!! static const int shortTime = 700; // static const int longTime = 2000; // static int localTick = 0; static int tickDuringButton = 0; static bool bButtonStatePrev; bool bButtonState = pedal1::IsSet(); // if ((!bButtonState) && bButtonStatePrev) { tickDuringButton = 0; } // if (bButtonState && (!bButtonStatePrev)) { // // , 50 () if ((tickDuringButton >100)&&(tickDuringButton < shortTime)) { // report [2] = 0x2C; } } // if ((!bButtonState) && (!bButtonStatePrev)) { if ((tickDuringButton == shortTime)||(tickDuringButton > longTime)) { // Shift+ report [0] = 2; // Shift report [2] = 0x50; // } } // bButtonStatePrev = bButtonState; tickDuringButton += 1; if (localTick++ % 20 == 0) { USBD_HID_SendReport (&hUsbDeviceFS,report,sizeof(report)); pReport [0] = 0; pReport [1] = 0; } }
A primeira tarefa implementada nesse manipulador é simples. A cada 20 milissegundos, enviamos um relatório contendo informações sobre os botões pressionados (se não houver botões, enviamos de qualquer maneira, apenas com zeros). Como a função é chamada a cada milissegundo, o relatório deve ser enviado para uma de suas vinte chamadas. Para fazer isso, há uma variável no início da função:
static int localTick = 0;
e o código no final (enviamos os dados, após o que apagamos o buffer para começar a enviar zeros a partir da próxima sessão):
if (localTick++ % 20 == 0) { USBD_HID_SendReport (&hUsbDeviceFS,report,sizeof(report)); pReport [0] = 0; pReport [1] = 0; }
A segunda tarefa é mais complicada. Ele rastreia a natureza de pressionar o pedal e preenche o relatório para envio posterior. Por que eu disse que a ideologia é como Verilog? Porque eu sempre pego diferenças nesse idioma: eu tenho uma variável na qual o estado atual do botão é colocado:
bool bButtonState = pedal1::IsSet();
e existe uma variável na qual seu estado anterior é armazenado (como lembramos, o estado anterior é o estado do botão durante o processamento de interrupção anterior do temporizador de 1 ms):
static bool bButtonStatePrev;
O botão pressionado fornece o valor
falso , o botão pressionado -
verdadeiro . Assim, sempre podemos concluir sobre o estado dinâmico do botão:
Nós introduzimos duas constantes. Um define o tempo curto de impressão. Se a impressora durar menos de 700 ms, será de curta duração. O segundo define o horário em que a repetição automática está ativada. Se logo após setecentos milissegundos você começar a enviar o código da chave, o player começará a enrolar muito abruptamente. Isso é identificado empiricamente. Portanto, a lógica do trabalho é a seguinte: após 700 ms, um único código “Shift + Esquerda” é enviado, após o qual o usuário tem a oportunidade de soltar o pedal. Se o pedal continuar pressionado, a partir do segundo segundo o envio constante desse código já começa até que o pedal seja liberado.
const int shortTime = 700; // const int longTime = 2000; //
O tempo durante o qual o botão é pressionado é armazenado em uma variável:
static int tickDuringButton = 0;
Se o botão acabou de ser pressionado, zeramos essa variável, começando a medir um novo período de tempo:
// if ((!bButtonState) && bButtonStatePrev) { tickDuringButton = 0; }
Se o botão acabou de ser liberado, verificamos a hora em que ele foi pressionado. Se apenas um pouco (agora diz "menos de 100 ms") - isso é uma conversa. Isso não conta. Ignore esse clique. Se não fizermos nada além da duração da pressão curta, a pressão longa será processada abaixo. Se, em pouco tempo, criarmos um relatório no buffer com um espaço (que será enviado quando chegar a hora):
// if (bButtonState && (!bButtonStatePrev)) { // // , 100 () if ((tickDuringButton >100)&&(tickDuringButton < shortTime)) { // report [2] = 0x2C; } }
Se o botão for pressionado por um longo tempo, enviamos "Shift + Left" em dois casos:
- o botão é mantido exatamente 700 ms (pacote único);
- o botão é mantido por mais de 2 segundos (enviando cada relatório subsequente até que o botão seja liberado).
// if ((!bButtonState) && (!bButtonStatePrev)) { if ((tickDuringButton == shortTime)||(tickDuringButton > longTime)) { // Shift+ report [0] = 2; // Shift report [2] = 0x50; // } }
Isso, de fato, é tudo. Esse código não é mais diferente do “peixe” que o Cube MX criou para nós. Montamos, flash ... Não, é impossível sem erros (aqui estão todos pegos, mas não pude ficar sem eles inicialmente), identificamos em 10 minutos via depuração JTAG (olá para AVR), costuramos, estamos felizes ...
Projeto alternativo
Em geral, essas coisas são úteis sem uma balalaica (ou outra visualização de tutoriais em vídeo). Em particular, gosto de ler as notícias, deitada na cama, com um laptop no estômago. Para rolar o texto, você deve manter a mão direita dobrada o tempo todo, o que causa dor no cotovelo. Por isso, há muito que sonhei com um grande botão vermelho que poderia rolar as páginas sem dobrar meu braço. Na verdade, ele pode ser fabricado com os mesmos componentes do pedal, substituindo o parafuso da mobília por uma pequena quantidade de cola quente. Total: botão PSW13, placa de ensaio STM32F103C8T6, plástico para impressora 3D, adesivo termofusível. Bem, no "firmware", substituí os códigos por "PgDn" por uma breve pressão e "Up" por uma longa.


Conclusão
Você pode usar as pernas para controlar a exibição de tutoriais em vídeo quando as mãos estão ocupadas. Para fazer isso, apenas um pedal que simula a operação do teclado USB. Um pedal pode enviar vários códigos de teclas, selecionando-os com base em diferentes tipos de teclas. O artigo considera um pedal que analisa dois tipos (pressão curta e longa).
A mecânica pode ser encontrada no Ali Express sob a palavra Foot Switch ou pode ser impressa em uma impressora 3D. Como eletrônica, a placa de ensaio STM32F103C8T6 pode ser usada. O "firmware" é feito em menos de uma hora, com base no "peixe" criado pelo Cube MX do fabricante dos controladores STM32. O código adicional ocupa várias telas de texto (para uma resolução de 2K - uma tela).
Em geral, todo o dispositivo (mecânica + “firmware”) foi completamente projetado em uma noite, além de levar cerca de quatro horas para imprimir mecânica em uma impressora 3D.
Os arquivos STL prontos para impressão em pedal podem ser
baixados aqui (é desejável abaixar o elemento Top em 0,4 mm para evitar um grande número de suportes: a superfície acabou ligeiramente arredondada, abaixando o modelo, tornaremos a peça impressa plana).
Os arquivos STL do "grande botão vermelho" podem ser
baixados aqui .
Os arquivos de origem prontos para o projeto e o arquivo HEX para o firmware podem ser
baixados aqui .
A data de publicação deste artigo não foi escolhida por acaso. O conselho decidiu que é melhor publicar um artigo sobre essas coisas em um site sério naquele dia. Mas, de fato, se você olhar para os vídeos encontrados nas frases "Alexey Arkhipovsky", "Dmitry Kalinin", "Cranberry Show", "Alexey Kodenko", fica claro que a balalaica acadêmica é como uma montadora. Lá e ali, combinam simplicidade absoluta e poder expressivo frenético. E pela frase "Sergey Vorontsov", você pode entender como aprender a usar essa ferramenta.
Adição
Após 8 meses de operação, o botão PSW-13 começou a funcionar uma vez em muitos, e apenas com uma pressão muito forte. Ao tentar substituir, ficou um detalhe muito interessante. O novo botão, comprado ao mesmo tempo que o anterior, possui uma reserva de energia completamente diferente e funciona em uma posição completamente diferente. Como resultado, ela estava sempre pressionada no meu pedal. Eu tive que moer com um dremel. Quem repetirá minha mecânica - tenha em mente. Pode ser necessário modificar o botão com um arquivo ou vice-versa - esculpir uma fita isolante para aumentá-lo. A repetibilidade da parte plástica deste botão não foi muito grande. Mas, em geral - após essa revisão, tudo funciona novamente.