É uma pergunta recorrente aqui no fórum, principalmente entre os que estão fazendo teste com carrinhos, ou robôs que precisem de orientação sobre o uso das teclas direcionais do PC.
Neste tutorial, estarei mostrando como identificar que essas teclas foram pressionadas. Mostrarei dois exemplos, o primeiro mais rápido e fácil de criar, e o outro mais geral.
Primeiro exemplo: Formulário “limpo”, sem outros componentes gráficos.
Nesse exemplo o único componente extra será o SerialPort usado pra a comunicação com o arduino. Ajustem nas propriedades o nome da porta e o baudRate.No meu caso alterei também o nome de serialPort1 para Porta.
Na lista de eventos do formulário existe um evento chamado KeyDown que é chamado quando uma tecla é pressionada quando o formulário tem foco.
Clicando nele, será aberto o código para a edição desse evento, modifique de forma que fique semelhante a isso:
private void Form1_KeyDown(object sender, KeyEventArgs e)
{
try
{
Porta.Open();
if (e.KeyCode == Keys.Up)
{
Porta.Write("U");
Text = "Up";
}
if (e.KeyCode == Keys.Down)
{
Porta.Write("D");
Text = "Down";
}
if (e.KeyCode == Keys.Right)
{
Porta.Write("R");
Text = "Right";
}
if (e.KeyCode == Keys.Left)
{
Porta.Write("L");
Text = "Left";
}
Porta.Close();
}
catch
{
Text = "Erro na comunicação";
}
}
Pegarei para a explicação o seguinte trecho:
if (e.KeyCode == Keys.Right)
{
Porta.Write("R");
Text = "Right";
}
Trata-se de uma condição simples, o objeto e guarda entre outras coisas, a informação de qual tecla disparou esse evento. O que foi feito foi comparar essa informação com “Keys.Right” que representa o código da tecla direcional, nesse caso direita.Como resultado afirmativo podemos enviar o dado que nos for conveniente para o arduino, nesse caso enviei a um caráter ‘R’ e escrevi no titulo do formulário “Right”.
Porta.Open(),Porta.Close() e try ... catch já expliquei no tutorial passado.
Todo o programa se resume a isso.
Segundo exemplo: Formulário que contenha outros componentes gráficos.
Para casos onde temos que usar outros elementos gráficos como botões, listas, caixas de texto no formulário, o método passado não funciona porque ele não receberá mais foco, e sim algum outro elemento já listado.
Nesses casos devemos escolher quais dos elementos vão gerar o evento de KeyDown para usarmos o método passado. Nesse segundo exemplo adicionei 4 botões.
Pra quem já escreveu o Form1_KeyDown primeiro exemplo, podemos usa-lo como KeyDown de todos os quatro botões, aqui renomeei para teclado.
Selecionando todos e relacionando aos eventos de KeyDown a mesma rotina teclado.
Até aqui alguem poderia pensar que não há diferença entre o primeiro exemplo e o segundo.
De fato se fossemos usar outras teclas, por exemplo, as de caracteres, isso resolveria nosso caso.
Porém queremos usar as direcionais que por padrão são usadas para navegar(mudar o foco) entre os controles, nesse caso botões. Sendo assim a priori não geram um evento de KeyDown.
Isso pode ser revertido usando um evento que ocorre antes do KeyDown, o PreviewKeyDown.
Acesse esse evento de qualquer controle edite o código da seguinte forma:
private void detectar_tecla(object sender, PreviewKeyDownEventArgs e)
{
if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right)
{
e.IsInputKey = true;
}
}
Aqui troquei o nome da função para detectar_tecla mas não é obrigatório.O mais importante é entender como ela funciona.
Foi feita uma comparação para saber se a tecla que gerou o evento foi uma direcional, se sim, atribua a e.IsInputKey o valor true. O que significa que será gerado também um evento KeyDown logo em seguida.
Repito, para teclas, como as alfabéticas, não se precisa usar o evento PreviewKeyDown que por padrão iram gerar e.IsInputKey = true para essas teclas, desencadeando assim o KeyDown automaticamente .
Depois atribua detectar_tecla aos PreviewKeyDown de todos os botões.
No evento do Click de cada botão coloquem o comando correspondente a sua tecla direcional, por exemplo:
private void button3_Click(object sender, EventArgs e)
{
try
{
Porta.Open();
Porta.Write("R");
Text = "Right";
Porta.Close();
}
catch
{
Text = "Erro na comunicação";
}
}
Assim o evento do Click faz a mesma coisa do teclado, com uma pequena diferença. Caso o usuário mantenha o teclado pressionado o programa enviará informações de forma continua da mesma forma de quando se mantém pressionada uma tecla alfanumérica num editor de texto.
Assim conseguimos enviar informações para o arduino, através de comando por teclado, adaptem a suas necessidades. Até a próxima.
Código completo:
Tags:
Valeu Yure vou aguardar o próximo tutorial.
Abs!
Qual o programa que você usa para fazer esta aplicação?
Visual Studio
Yure muito bom , eu estou iniciando no visual Studio , mas estou com um pequeno probleminha , estou iniciando pelo básico e gostaria de fazer uma aplicação onde ao pressionar um botão será impresso uma msg num Label , coisa bem simples mesmo , gostaria de saber qual a linha de comando para fazer isso o programa ficou assim :
private void button1_Click(object sender, EventArgs e)
{
label1.Text = "ola";
}
So que da erro , como leigo não sei o que pode ser , poderia me ajudar? , é so um exemplo bem simples mesmo. No que eu estaria errando?
Qual a descrição do erro?
yure , foi um bug estranhíssimo , quando fui pegar para mexer agora funcionou , achei estranho , fechei e abri o visual studio novamente e funcionou normalmente , mas posso lhe incomodar mais vezes se preciso , muito obrigado e continue com este belo trabalho que tem feito , estou esperando por mais tutoriais.
Cara, muito bom isso. Valeu mesmo.
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por