FLProg + RemoteXY = Teclado sem fio para o computador no seu telefone

Eu tive uma situação interessante em casa. A TV no quarto está conectada a um computador localizado em outra sala e, para que minha esposa assista o próximo episódio da série (embora eu tenha um decodificador android, que fica ao lado da TV, ela prefere assistir de um computador), preciso fazer um grande esforço. Devido à presença de crianças, mouses e teclados sem fio não criam raízes aqui. Há muito tempo, observo com interesse a capacidade do Arduino Leonardo de fingir ser um mouse e um teclado. Quando essa placa chegou, implementei esse recurso na versão 2.2 do programa FLProg. Juntamente com os recursos do projeto RevoteXY, aconteceu uma coisa muito interessante. Para iniciar o vídeo do dispositivo resultante.



Primeiro de tudo, um projeto é criado no site RemoteXY. A peculiaridade deste projeto é que a interface que você criou não precisa ser carregada no telefone. Basta ter o programa RemoteXY no telefone e todas as interfaces criadas são armazenadas no firmware do Arduino. Quando conectado a ele, a descrição da interface é transmitida ao telefone e é aberta no programa.

Agora, no site RemoteXY, há uma oportunidade de compartilhar seus projetos, e aqui está um link para o meu projeto para o dispositivo discutido nesta lição. O projeto consiste em quatro telas.

A primeira tela é o controle do mouse.



Use o joystick para controlar o movimento do mouse. O controle com ele é muito semelhante ao controle com a ajuda do que ficou no meio do teclado no famoso ThinkPad T41.



Eu tenho isso há muito tempo, então eu tenho experiência. Os desenvolvedores do projeto RemoteXY prometeram criar um novo elemento - o "Touch Panel", com o qual será possível simular completamente o touchpad do laptop. Quando isso acontecer neste projeto, substituirei o joystick por ele. O controle deslizante no lado direito da tela simula uma roda de rolagem. Quanto mais forte for o deslocamento do centro, mais rápido a roda do mouse virtual girará.

Três colunas de botões no lado esquerdo da tela simulam cliques diferentes nos botões virtuais do mouse. Cada coluna é responsável por seu botão - esquerda, meio e direita, respectivamente. A linha superior dos botões (com o símbolo "P") simula uma pressão normal. Ou seja, quando você clica nesse botão, o botão correspondente do mouse virtual é pressionado; quando liberado, é liberado. A segunda linha (com o símbolo "PF") - simula um clique com uma trava. Na primeira vez que você pressionar esse botão, o botão virtual do mouse será pressionado e o segundo será liberado. Isso é útil ao arrastar janelas, por exemplo. Aponta o mouse para o título da janela, clica no botão “PF” (fixa a janela ao mouse), arrasta a janela, clica em “PF” novamente (solta a janela). Bem, a terceira linha (com o símbolo "C") é um clique no botão correspondente do mouse virtual.

A segunda tela é o teclado inglês.



Não há nada especialmente para explicar. O botão "Caps" ativa caracteres maiúsculos, o botão "Shft" inclui caracteres maiúsculos por caractere. Depois de inserir um caractere, ele é redefinido.

A terceira tela é o teclado russo,



tudo está claro aqui. As teclas "Caps" e "Shift" funcionam da mesma forma que na tela anterior.

Bem, a última tela - números e caracteres especiais.Há



uma ligeira sutileza. Houve um pequeno bug no editor online do RemoteXY. Se o símbolo "\" for usado na legenda do botão, o projeto não será salvo e não será processado. Portanto, para o botão deste símbolo, usei a inscrição “not /”. Bem, eu não criei nada melhor.

Após criar o projeto no site RemoteXY, você precisa obter o código para fazer o download no bloco “RemoteXY” no projeto FLProg. Para fazer isso, nas propriedades do projeto RemoteXY, selecione o ambiente de programação - FLProg.



O código obtido no site RemoteXY para esta lição
REMOTEXY_MODE__SOFTSERIAL
REMOTEXY_SERIAL_RX 8
REMOTEXY_SERIAL_TX 9
REMOTEXY_SERIAL_SPEED 9600
[128,5,144,5,6,8,4,5,32,41
,11,47,47,7,1,4,48,92,11,7
,50,7,1,1,1,1,18,12,12,7
,1,80,0,1,1,14,18,12,12,7
,1,80,0,1,1,27,18,12,12,7
,1,80,0,1,1,1,32,12,12,7
,1,80,70,0,1,1,14,32,12,12
,7,1,80,70,0,1,1,27,32,12
,12,7,1,80,70,0,1,1,1,47
,12,12,7,1,67,0,1,1,14,47
,12,12,7,1,67,0,1,1,27,47
,12,12,7,1,67,0,1,1,1,22
,8,8,6,2,81,0,1,1,10,22
,8,8,6,2,87,0,1,1,19,22
,8,8,6,2,69,0,1,1,28,22
,8,8,6,2,82,0,1,1,37,22
,8,8,6,2,84,0,1,1,46,22
,8,8,6,2,89,0,1,1,55,22
,8,8,6,2,85,0,1,1,64,22
,8,8,6,2,73,0,1,1,73,22
,8,8,6,2,79,0,1,1,82,22
,8,8,6,2,80,0,1,1,1,31
,8,8,6,2,65,0,1,1,10,31
,8,8,6,2,83,0,1,1,19,31
,8,8,6,2,68,0,1,1,28,31
,8,8,6,2,70,0,1,1,37,31
,8,8,6,2,71,0,1,1,46,31
,8,8,6,2,72,0,1,1,55,31
,8,8,6,2,74,0,1,1,64,31
,8,8,6,2,75,0,1,1,1,40
,8,8,6,2,90,0,1,1,10,40
,8,8,6,2,88,0,1,1,19,40
,8,8,6,2,67,0,1,1,28,40
,8,8,6,2,86,0,1,1,37,40
,8,8,6,2,66,0,1,1,46,40
,8,8,6,2,78,0,1,1,55,40
,8,8,6,2,77,0,1,1,1,49
,98,13,6,2,0,1,1,73,31,8
,8,6,2,76,0,1,1,91,22,8
,8,6,2,60,0,1,1,82,31,17
,17,6,2,69,110,116,101,114,0,1
,1,64,40,8,8,6,2,44,0,1
,1,73,40,8,8,6,2,46,0,1
,1,1,16,17,5,6,2,83,104,105
,102,116,0,1,1,7,10,11,5,6
,2,67,97,112,115,0,1,1,1,25
,7,7,0,3,208,153,0,1,1,8
,25,7,7,0,3,208,166,0,1,1
,15,25,7,7,0,3,208,163,0,1
,1,22,25,7,7,0,3,208,154,0
,1,1,29,25,7,7,0,3,208,149
,0,1,1,43,25,7,7,0,3,208
,147,0,1,1,57,25,7,7,0,3
,208,169,0,1,1,78,25,7,7,0
,3,208,170,0,1,1,36,25,7,7
,0,3,208,157,0,1,1,64,25,7
,7,0,3,208,151,0,1,1,71,25
,7,7,0,3,208,165,0,1,1,50
,25,7,7,0,3,208,168,0,1,1
,86,25,13,7,0,3,60,0,1,1
,1,49,98,13,0,3,0,1,1,1
,41,7,7,0,3,208,175,0,1,1
,9,41,7,7,0,3,208,167,0,1
,1,17,41,7,7,0,3,208,161,0
,1,1,25,41,7,7,0,3,208,156
,0,1,1,33,41,7,7,0,3,208
,152,0,1,1,41,41,7,7,0,3
,208,162,0,1,1,49,41,7,7,0
,3,208,172,0,1,1,57,41,7,7
,0,3,208,145,0,1,1,65,41,7
,7,0,3,208,174,0,1,1,1,33
,7,7,0,3,208,164,0,1,1,9
,33,7,7,0,3,208,171,0,1,1
,17,33,7,7,0,3,208,146,0,1
,1,25,33,7,7,0,3,208,144,0
,1,1,33,33,7,7,0,3,208,159
,0,1,1,41,33,7,7,0,3,208
,160,0,1,1,49,33,7,7,0,3
,208,158,0,1,1,57,33,7,7,0
,3,208,155,0,1,1,65,33,7,7
,0,3,208,148,0,1,1,73,33,7
,7,0,3,208,150,0,1,1,81,33
,7,7,0,3,208,173,0,1,1,73
,41,7,7,0,3,44,0,1,1,81
,41,7,7,0,3,46,0,1,1,89
,33,10,15,0,3,69,110,116,101,114
,0,1,1,7,13,11,5,0,3,67
,97,112,115,0,1,1,1,19,17,5
,0,3,83,104,105,102,116,0,1,1
,1,13,9,8,5,4,49,0,1,1
,11,13,9,8,5,4,50,0,1,1
,21,13,9,8,5,4,51,0,1,1
,41,13,9,8,5,4,53,0,1,1
,51,13,9,8,5,4,54,0,1,1
,61,13,9,8,5,4,55,0,1,1
,91,13,9,8,5,4,48,0,1,1
,81,13,9,8,5,4,57,0,1,1
,71,13,9,8,5,4,56,0,1,1
,31,13,9,8,5,4,52,0,1,1
,32,49,68,13,5,4,0,1,1,51
,40,9,8,5,4,60,0,1,1,61
,40,9,8,5,4,39,0,1,1,71
,40,9,8,5,4,34,0,1,1,1
,31,9,8,5,4,95,0,1,1,91
,22,9,8,5,4,60,60,0,1,1
,41,40,9,8,5,4,62,0,1,1
,31,40,9,8,5,4,125,0,1,1
,21,40,9,8,5,4,123,0,1,1
,11,40,9,8,5,4,93,0,1,1
,1,40,9,8,5,4,91,0,1,1
,51,22,9,8,5,4,38,0,1,1
,61,31,9,8,5,4,124,0,1,1
,51,31,9,8,5,4,110,111,116,47
,0,1,1,41,31,9,8,5,4,47
,0,1,1,31,31,9,8,5,4,61
,0,1,1,21,31,9,8,5,4,45
,0,1,1,11,31,9,8,5,4,43
,0,1,1,71,31,9,8,5,4,63
,0,1,1,1,22,9,8,5,4,33
,0,1,1,11,22,9,8,5,4,64
,0,1,1,21,22,9,8,5,4,35
,0,1,1,31,22,9,8,5,4,36
,0,1,1,41,22,9,8,5,4,94
,0,1,1,61,22,9,8,5,4,42
,0,1,1,71,22,9,8,5,4,40
,0,1,1,81,22,9,8,5,4,41
,0,1,1,81,40,9,8,5,4,44
,0,1,1,91,40,9,8,5,4,46
,0,1,1,91,31,9,8,5,4,69
,110,116,101,114,0,1,1,81,31,9
,8,5,4,37,0,1,1,1,49,9
,8,5,4,58,0,1,1,11,49,9
,8,5,4,59,0,1,1,21,49,9
,8,5,4,126,0,65,10,1,10,5
,5,2,2,65,10,1,13,5,5,2
,3,65,9,1,1,5,5,2,2,65
,9,1,1,5,5,2,3,65,9,1
,1,5,5,2,4,131,1,82,1,17
,6,7,1,77,111,117,115,101,0,131
,0,64,1,17,6,6,2,69,110,0
,131,0,46,1,17,6,0,3,208,160
,209,131,209,129,0,131,0,28,1,17
,6,5,4,49,46,46,57,0];
input signed char joystick_1_x; /* =-100..100 x */
input signed char joystick_1_y; /* =-100..100 y */
input signed char slider_1; /* =-100..100 */
input unsigned char pressL; /* =1 , =0 */
input unsigned char PressM; /* =1 , =0 */
input unsigned char PressR; /* =1 , =0 */
input unsigned char pressLF; /* =1 , =0 */
input unsigned char pressMF; /* =1 , =0 */
input unsigned char pressRF; /* =1 , =0 */
input unsigned char ClickL; /* =1 , =0 */
input unsigned char ClickM; /* =1 , =0 */
input unsigned char ClickR; /* =1 , =0 */
input unsigned char bQ; /* =1 , =0 */
input unsigned char bW; /* =1 , =0 */
input unsigned char bE; /* =1 , =0 */
input unsigned char bR; /* =1 , =0 */
input unsigned char bT; /* =1 , =0 */
input unsigned char bY; /* =1 , =0 */
input unsigned char bU; /* =1 , =0 */
input unsigned char bI; /* =1 , =0 */
input unsigned char bO; /* =1 , =0 */
input unsigned char bP; /* =1 , =0 */
input unsigned char bA; /* =1 , =0 */
input unsigned char bS; /* =1 , =0 */
input unsigned char bD; /* =1 , =0 */
input unsigned char bF; /* =1 , =0 */
input unsigned char bG; /* =1 , =0 */
input unsigned char bH; /* =1 , =0 */
input unsigned char bJ; /* =1 , =0 */
input unsigned char bK; /* =1 , =0 */
input unsigned char bZ; /* =1 , =0 */
input unsigned char bX; /* =1 , =0 */
input unsigned char bC; /* =1 , =0 */
input unsigned char bV; /* =1 , =0 */
input unsigned char bB; /* =1 , =0 */
input unsigned char bN; /* =1 , =0 */
input unsigned char bM; /* =1 , =0 */
input unsigned char bSpace; /* =1 , =0 */
input unsigned char bL; /* =1 , =0 */
input unsigned char bBacspace; /* =1 , =0 */
input unsigned char bEnter; /* =1 , =0 */
input unsigned char bZap; /* =1 , =0 */
input unsigned char bTochka; /* =1 , =0 */
input unsigned char ShiftEn; /* =1 , =0 */
input unsigned char CapsEn; /* =1 , =0 */
input unsigned char bQR; /* =1 , =0 */
input unsigned char bWR; /* =1 , =0 */
input unsigned char bER; /* =1 , =0 */
input unsigned char bRR; /* =1 , =0 */
input unsigned char bTR; /* =1 , =0 */
input unsigned char bUR; /* =1 , =0 */
input unsigned char bOR; /* =1 , =0 */
input unsigned char bTverdR; /* =1 , =0 */
input unsigned char bYR; /* =1 , =0 */
input unsigned char bPR; /* =1 , =0 */
input unsigned char bXXR; /* =1 , =0 */
input unsigned char bIR; /* =1 , =0 */
input unsigned char bBacspaceR; /* =1 , =0 */
input unsigned char bSpaceR; /* =1 , =0 */
input unsigned char bZR; /* =1 , =0 */
input unsigned char bXR; /* =1 , =0 */
input unsigned char bCR; /* =1 , =0 */
input unsigned char bVR; /* =1 , =0 */
input unsigned char bBR; /* =1 , =0 */
input unsigned char bNR; /* =1 , =0 */
input unsigned char bMR; /* =1 , =0 */
input unsigned char bRusBR; /* =1 , =0 */
input unsigned char bRusUR; /* =1 , =0 */
input unsigned char bAR; /* =1 , =0 */
input unsigned char bSR; /* =1 , =0 */
input unsigned char bDR; /* =1 , =0 */
input unsigned char bFR; /* =1 , =0 */
input unsigned char bGR; /* =1 , =0 */
input unsigned char bHR; /* =1 , =0 */
input unsigned char bJR; /* =1 , =0 */
input unsigned char bKR; /* =1 , =0 */
input unsigned char bLR; /* =1 , =0 */
input unsigned char bRusGR; /* =1 , =0 */
input unsigned char bRusER; /* =1 , =0 */
input unsigned char bZapR; /* =1 , =0 */
input unsigned char bTochkaR; /* =1 , =0 */
input unsigned char bEnterR; /* =1 , =0 */
input unsigned char CapsRus; /* =1 , =0 */
input unsigned char ShiftRus; /* =1 , =0 */
input unsigned char bNum1; /* =1 , =0 */
input unsigned char bNum2; /* =1 , =0 */
input unsigned char bNum3; /* =1 , =0 */
input unsigned char bNum5; /* =1 , =0 */
input unsigned char bNum6; /* =1 , =0 */
input unsigned char bNum7; /* =1 , =0 */
input unsigned char bNum0; /* =1 , =0 */
input unsigned char bNum9; /* =1 , =0 */
input unsigned char bNum8; /* =1 , =0 */
input unsigned char bNum4; /* =1 , =0 */
input unsigned char bSpaceSim; /* =1 , =0 */
input unsigned char bSim24; /* =1 , =0 */
input unsigned char bSim25; /* =1 , =0 */
input unsigned char bSim26; /* =1 , =0 */
input unsigned char bSim10; /* =1 , =0 */
input unsigned char bBacspaceSim; /* =1 , =0 */
input unsigned char bSim23; /* =1 , =0 */
input unsigned char bSim22; /* =1 , =0 */
input unsigned char bSim21; /* =1 , =0 */
input unsigned char bSim20; /* =1 , =0 */
input unsigned char bSim19; /* =1 , =0 */
input unsigned char bSim6; /* =1 , =0 */
input unsigned char bSim16; /* =1 , =0 */
input unsigned char bSim15; /* =1 , =0 */
input unsigned char bSim14; /* =1 , =0 */
input unsigned char bSim13; /* =1 , =0 */
input unsigned char bSim12; /* =1 , =0 */
input unsigned char bSim11; /* =1 , =0 */
input unsigned char bSim17; /* =1 , =0 */
input unsigned char bSim1; /* =1 , =0 */
input unsigned char bSim2; /* =1 , =0 */
input unsigned char bSim3; /* =1 , =0 */
input unsigned char bSim4; /* =1 , =0 */
input unsigned char bSim5; /* =1 , =0 */
input unsigned char bSim7; /* =1 , =0 */
input unsigned char bSim8; /* =1 , =0 */
input unsigned char bSim9; /* =1 , =0 */
input unsigned char bSim27; /* =1 , =0 */
input unsigned char bSim28; /* =1 , =0 */
input unsigned char bEnterSim; /* =1 , =0 */
input unsigned char bSim18; /* =1 , =0 */
input unsigned char bSim29; /* =1 , =0 */
input unsigned char bSim30; /* =1 , =0 */
input unsigned char bSim31; /* =1 , =0 */
output unsigned char IsShiftEn_g; /* =0..255 */
output unsigned char IsShiftRus_g; /* =0..255 */
output unsigned char hasEngSim_b; /* =0..255 */
output unsigned char hasRusSim_b; /* =0..255 */
output unsigned char hasSpecSim_b; /* =0..255 */

Terminamos com o site RemoteXY. Passamos para o projeto no FLProg.

Os controladores Arduino Leonardo (marcado), Arduino DUE (o suporte para este controlador apareceu na versão 2.3 - marcada) e o Arduino Micro (teoricamente, não chegaram, estou esperando para verificar) podem fingir ser um mouse e teclado padrão (ou seja, sem a necessidade de drivers especiais); .

O projeto FLProg para esta lição pode ser baixado aqui . O módulo bluetooth HC-05 é usado como um dispositivo de comunicação com o telefone. É conectado de acordo com a tabela.
Módulo HC-051Arduino leonardo
Vcc+ 5V
GNDGND
TXDD0 (RX1)
RXDD1 (TX1)

Considere o projeto:



Existe uma unidade “RemoteXY” muito grande que fornece comunicação com o telefone. Para configurá-lo, você precisa baixar o código recebido do site do projeto RemoteXY. O processo de carregamento é descrito em detalhes nas informações do bloco (propriedades do bloco -> guia "Informações"), portanto, não o duplicaremos aqui. Noto apenas para aqueles que trabalham na versão FLProg 2.3 e versões anteriores. Há um pequeno bug nessas versões. Se, ao criar um projeto no site RemoteXY, nas configurações, selecione uma porta ausente ou ocupada no projeto em que a descrição será carregada, o programa falhará ao carregar. Para evitar isso, você deve PRIMEIRO selecionar uma porta livre nas configurações do bloco e carregar a descrição. Nas versões posteriores do FLProg, esse erro é corrigido.

O CD de blocos (codificador) é usado para determinar o número do botão pressionado. Eles fornecem na saída o número de entrada no qual o lógico apareceu 1. Na ausência de um log. 1 em todas as entradas, na saída deste bloco 0.



Aqui, a partir dos dados recebidos do telefone, detectamos a direção do movimento do mouse e da roda. Escolhi 5 unidades de banda morta (com uma alteração máxima no sinal do joystick e do controle deslizante de 0 a 100 em cada direção). Em princípio, para melhorar o trabalho com o mouse, esse valor pode ser reproduzido. O tamanho da etapa também é determinado aqui (velocidade do movimento ou rolagem do mouse). Os parâmetros do bloco "Scale" também podem ser reproduzidos para um controle mais confortável do mouse.



Aqui enviamos diretamente comandos para mover o mouse virtual. Para fazer isso, use o novo bloco "Mouse move". Cada um dos blocos envia um comando para mover o mouse em uma determinada direção a cada 10 ms (definido nas configurações do bloco), em uma etapa calculada na placa anterior, se houver um nível alto na entrada "Enviar".



O novo bloco "Mouse wheel" também é usado aqui. Esse bloco envia um comando para girar a roda de rolagem do mouse virtual. Aqui, para obter um efeito suave, é usado um princípio diferente (diferente de mover o mouse). Se houver um nível alto na entrada "Enviar", a unidade envia ao mouse virtual um comando para girar a roda de rolagem um passo, mas com uma frequência calculada na placa 2. Essa frequência depende da posição do controle deslizante no telefone e muda de 200 milissegundos para 5 milissegundos quando o valor muda recebido do controle deslizante de 5 (zona morta) a 100 (posição extrema).



O bloco "MousePressKey" é usado aqui. Em um nível alto na entrada "Enviar", ele mantém pressionado o botão do mouse virtual selecionado nas configurações, e em um nível baixo, ele o libera. Para perceber o efeito de pressionar com fixação, são utilizados gatilhos TT (contadores de contagem). Na primeira extremidade inicial em sua entrada, eles convertem sua saída em um estado de log. 1 e no segundo eles caem para 0. E assim em um círculo.



Aqui, usamos o bloco "MouseClickKey", que, na borda ascendente da entrada "Enviar", dá um clique curto no botão do mouse virtual selecionado nas configurações do bloco.



Aqui, são usados ​​os blocos “KeyboardStatus” e “MouseStatus” que, quando a entrada Status é alta, ativam o teclado virtual e o mouse, respectivamente, e os desativam quando o nível está baixo. Nesse esquema, para controlar a ativação e desativação, o sinal é a presença de uma conexão telefônica com um arduino. É formado na saída “CS” do bloco “RemoteXY” (placa 1). Além disso, se houver uma conexão, acenderemos o LED embutido na placa do arduino (pino 13).



Aqui, é determinado o fato de pressionar um botão em um dos teclados do aplicativo no telefone e em qual teclado específico o botão foi pressionado - russo ou inglês. Além disso, são gerados sinais para ignição do LED localizado no canto superior direito de cada teclado do aplicativo no telefone. Este LED indica que o sinal de pressionar o botão chegou ao controlador. Usei-o durante a instalação, mas decidi deixá-lo na versão final do aplicativo.



Isso determina se um caractere maiúsculo deve ser inserido. A vantagem de pressionar o botão "Shift" no aplicativo no telefone define o gatilho SR para o estado de log.1. Após o final da entrada do caractere (borda posterior do sinal da presença do caractere pressionado), o gatilho é redefinido para 0.
Cada pressão do botão "Caps" no aplicativo no telefone inverte a operação do botão "Shift". Ou seja, na posição inicial, o estado de entrada principal são caracteres minúsculos e, quando você pressiona o botão “Shift”, um caractere maiúsculo é inserido; depois de pressionar o botão “Caps” uma vez, o modo muda. Letras maiúsculas se tornam as principais e, quando você pressiona o botão "Shift", um caractere minúsculo é inserido. Quando o botão "Caps" é pressionado novamente, a entrada muda para o modo principal. Além disso, é gerado um sinal para acender o indicador "Shift" no aplicativo no telefone.



Aqui, a partir do número pressionado no teclado no aplicativo no telefone do botão, o código do símbolo desse botão é formado. Isso é feito usando o bloco "Tabela de códigos", que produz um código na saída "Q", cujo número na tabela carregada no bloco corresponde ao valor na entrada "I".

A tabela de códigos é carregada no bloco "Tabela de códigos" nesta placa.
113q
119w
101e
114r
116t
121y
117u
105i
111o
112p
97a
115s
100d
102f
103g
104h
106j
107k
108l
122z
120x
99c
118v
98b
110n
109m
91[
93]
59
39'
44,
46.


Observe que caracteres russos e ingleses usam a mesma tabela de códigos. O fato é que a biblioteca Keybord entende apenas códigos de byte único e, na verdade, pressiona um botão no teclado virtual no qual um símbolo é gravado com o código passado para ele. Para inserir caracteres russos, o método de entrada no computador muda forçosamente para russo quando são inseridos. Vamos considerar como isso é feito no próximo quadro.



Dois blocos “SequenceKeybord” são usados ​​aqui. Esses blocos na borda ascendente na entrada "Enviar" executam um script de ação do teclado que foi configurado quando o bloco foi configurado. É nesse bloco que podemos configurar a entrada de caracteres russos ou ingleses, além de alternar caracteres minúsculos ou maiúsculos. Mas isso também requer alguma configuração do computador ao qual nosso dispositivo está conectado. Você precisa configurar um atalho de teclado para ativar os layouts em russo e angdiano. Isso é feito no painel de controle do computador.







Para este dispositivo, configurei a inclusão do inglês usando as teclas CTRL + 1 e Russian CTRL + 0. São essas combinações que são usadas em blocos de script.
Considere um cenário de bloco superior.



O script é executado em etapas de cima para baixo na borda ascendente na entrada "Enviar" (quando o sinal da presença de um caractere pressionado no teclado do aplicativo no telefone aparece). Na primeira etapa, o botão CTRL é pressionado e mantido pressionado no teclado virtual. No segundo passo, é pressionado rapidamente o botão, o código é alimentado na entrada "Code Step 2". Se a tecla foi pressionada no teclado russo, serão 48 (código de caractere 1) e, em inglês - 49 (código de caractere 0). Na terceira etapa, o botão CTRL é liberado. Assim, mudamos o idioma de entrada para o que precisamos para inserir esse caractere.

O próximo passo depende do alto nível da entrada "Activity Step 4". Ocorre quando o modo de capitalização está ativo. Nesse caso, a etapa 4 é executada e o botão "Shift" no teclado virtual é pressionado e pressionado. Dessa forma, caracteres maiúsculos são inseridos.

Bem, na última etapa, o botão do teclado virtual é pressionado e mantido pressionado, o código que chega à entrada “Code Step 5” (o código do botão que pressionamos no teclado no aplicativo no telefone).

Se o sinal de que um botão é pressionado no teclado do aplicativo no telefone desaparecer devido à inversão na entrada do bloco inferior do script, o script configurado nele será executado.



Primeiro, liberamos o botão de símbolo pressionado anteriormente e depois o botão "Shift"



Aqui, da mesma forma que no quadro 10, geramos um sinal sobre a presença de um botão pressionado no teclado para caracteres e números especiais no aplicativo no telefone e o código para esse botão.

A tabela de códigos é carregada no bloco "Tabela de códigos" nesta placa.
44,
44,
46.
46.
178BACKSPACE
178BACKSPACE
178BACKSPACE
32«»
32«»
32«»
176RETURN
176RETURN
176RETURN
491
502
513
524
535
546
557
568
579
480
33!
64@
35#
36$
94^
38&
42*
40(
41)
95_
43+
45-
61=
47/
92\
124|
63?
37%
91[
93]
123{
125}
62>
60<
39'
34"
44,
46.
58:
59
126~




Quando aparece um sinal de que uma tecla especial é pressionada no teclado no aplicativo no telefone, o script configurado no bloco “SequenceKeyboard” é executado. Nele, primeiro traduzimos o método de entrada para o inglês (pressionando a tecla “CTRL” → pressionando a tecla “1” → liberando a tecla “CTRL”)) e, em seguida, pressione a tecla de caractere desejada. Se a presença do botão pressionado desaparecer, uma unidade de exposição única ao teclado “OneKeyboard” será executada, executando uma ação programada nas configurações. Nesse caso, libera a tecla de caractere especial pressionada anteriormente.

Após a compilação, este projeto ocupa um pouco mais da metade da memória do controlador Arduino Leonardo, o que permite várias modificações neste projeto.
Boa sorte com sua criatividade.

Source: https://habr.com/ru/post/pt400655/


All Articles