É um anseio entre os iniciantes na área de programação em C, a criação de programas que tenham uma interface amigável, com botões, menus entre outros componentes do windows. Aqueles que ja usam o arduino ou outros microcontroladores já deve ter sentido falta de um aplicativo com essas características e que se comunicasse com o PC via serial.
Nesse tutorial, como é o primeiro e em um nível bem básico, será mostrado passo a passo como criar uma GUI que será capaz de enviar dados para o arduino, afim de comandar um LED(ligar e desligar), e um servomotor.
O aplicativo será feito no ambiente do Visual Studio, na linguagem C#.É recomendável o Visual C# no minimo 2010, pois contem um componente novo, que é um tanto interessante para quem deseja plotar de gráficos, o Chart.
Nesse e nos próximos tutoriais,não será exigido grande conhecimento da linguagem C#, basta que se tenha um pouco de conhecimento em C++, e caso, seja necessário o uso de alguma estrutura exclusiva do C#, será feita uma breve explicação.
1º PASSO: Criar um novo projeto em linguagem C#
Após criar um novo projeto,deverão aparecer 3 elementos muito importantes da IDE:
A aba Design onde podemos editar a aparência do programa (formulário).
A caixa de ferramentas (ou Toolbox) que contem os elementos que farão parte do nosso programa.Ex:Botões, caixas de rolagem, menus, etc.
A aba de propriedades (ou properties) onde podemos predefinir alguns comportamentos que os elementos (controles) terão.Ex:O texto que o formulário exibe, se um botão apresenta alguma imagem, etc.
2º PASSO: Design.
Iremos usar osa seguintes componentes:
Após achar cada um na caixa de ferramentas, arrastem-os e soltem no formulário. Redimensionem-os de modo que fique parecido com a figura abaixo.
Naturalmente, para cada controle adicionado é atribuido a ele um nome que corresponde a classe a que pertencem e a um numero.Ex: button1, button2,hScrollBar1,etc.
Neste tutorial, mudei somente o nome do objeto SerialPort1 para Porta, na aba de propriedades.
Mudem também outras propriedades selecionando cada controle no formulário :
Porta:
button1:
hScrollBar1:
Maximum - 189 (180 +LargeChange-1)
Form1(formulário):
FormBorderStyle - FixedSingle (não permite redimencionamento do formulario)
MaximizeBox - false (desabilita botão de maximizar)
Alguns objetos tem propriedades em comum, por exemplo experimente trocar a forma que o cursor é mostrado quando esta sobre o button1 e o hScrollBar1, selecione os dois ao mesmo tempo e mude a propriedade Cursor para hand.
Após isso apertem F5 para rodar o programa.Ele deve estar com essa cara.
3º PASSO: Programação.
A programação para GUI geralmente é orientada a eventos o que significa que o controle de fluxo é guiado por indicações externas.Ex:Clique do mouse, tecla digitada, um novo dado no buffer serial,etc.
O evento principal de cada controle, é acessado quando se da um duplo clique no elemento.Porém existem vários outros eventos que podem ser vinculados a cada controle, por exemplo nesse projeto usaremos dois eventos do formulário que são: load() e o FormClosing().
Nesse projeto serão usadas três funções do objeto Porta:
O Porta.Open() foi colocado dentro do evento de load() do formulário, o que significa que será estabelecida conexão serial a partir do momento que o programa for carregado.
O Porta.Close() foi colocado dentro do evento FormClosing(), para que seja encerrada a conexão com a porta serial assim que o programa for fechado.
O Porta.Write() será usado no botão e na barra de rolagem, para enviar pro microcontrolador a informação que queremos.
Ao dar um duplo clique no formulário deverá aparecer uma nova aba contendo alguns códigos, e o evento de Load.
No Load deve ficar assim:
private void Form1_Load(object sender, EventArgs e)
{
try
{
Porta.Open();
}
catch
{
MessageBox.Show("Cabo desconectado","Erro");
Close();
}
}
O try e catch são usados para tratar exceções(erros), que irão aparecer se o programa for executado sem que a porta exista, no caso do arduino a porta só existirá se o cabo estiver conectado.
Funciona da seguinte forma,"tente executar o que estiver dentro do try, caso ocorra a exceção faça o que estiver no catch" Nesse programa, "caso não consiga abrir comunicação com a serial, exiba uma mensagem ( MessageBox.Show("Cabo desconectado","Erro") ) e feche o programa usando o método Close().(Não confundir com Porta.Close()).
Indo no evento de FormClosing() devemos encerrar a comunicação:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
try
{
if (Porta.IsOpen)
{
Porta.Close();
}
}
catch
{ }
}
A estrutura try e catch se faz presente novamente,sempre que houver risco de desconexão do cabo de comunicação ela deve ser usada, sob pena de ver seu programa travar.
Nesse evento uma condição simples, caso a porta esteja "aberta", feche-a.
Dando um duplo clique no botão abrirá o evento de click
private void button1_Click(object sender, EventArgs e)
{
try
{
if (button1.Text == "Off")
{
Porta.Write(comando, 1, 1);
button1.Text = "On";
}
else
{
Porta.Write(comando, 2, 1);
button1.Text = "Off";
}
}
catch
{
MessageBox.Show("Cabo desconectado", "Erro");
Close();
}
}
Antes de falar deste código, um array do tipo byte deve ser declarado pois a função Porta.Write() exige um array de bytes ou chars, então façam a declaração da seguinte forma:
byte[] comando = { 0, 200, 201 }; antes de public Form1()
O primeiro elemento iremos usar para comandar o angulo do servo, de 0 a 180.
Como o byte chega até 255, temos um intervalo entre 181 e 255 livre para arbitrarmos um byte para acender e outro para apagar o led. No caso arbitrei 200 para acender e 2001 para apagar;
Neste evento iremos acender ou apagar o led," Se o botão estiver como titulo Off mande pela serial o 200" pois é o elemento 1 do array comando. o terceiro parâmetro da Porta.Write(comando, 1, 1) se refere a quantos bytes serão enviados, no caso só um o 200.Com isso o led deverá acender.
Depois de enviar reescreva o Texto do botão para "On";
Quando o usuário clicar de novo será enviado um byte equivalente a 201 desligando o led e reescrevendo o texto do botão para "Off".
No evento Scroll da barra de rolagem ocorre o seguinte:
private void hScrollBar1_Scroll(object sender, ScrollEventArgs e)
{
try
{
comando[0] = (byte)hScrollBar1.Value;
Porta.Write(comando, 0, 1);
Text = Convert.ToString(hScrollBar1.Value);
}
catch
{
MessageBox.Show("Cabo desconectado", "Erro");
Close();
}
}
A linha comando[0] = (byte)hScrollBar1.Value atribui ao primeiro elemento do array o valor atual da barra de rolagem.Logo em seguida o valor é transmitido para o microcontrolador que controla o servomotor.
Depois esse valor é convertido para string e passado para o titulo do formulário para poder ser visualizado pelo usuário.
O programa do arduino é este:
E o do aplicativo deve ficar assim:
Com isso concluímos o nosso aplicativo, adaptem a suas necessidades.Até a próxima.
Comentar
valeu Yure. mas podes agora me dizer como fazer o mesmo processo sem usar o arduino?
Vocês tem uma dica do hardware desse esquema. Como conectar no PIC, etc...
Sensacional Yure!Consegui fazer através de seu tutorial um importante passo em meu projeto!
Muito obrigado.
ASSIM COMO OUTROS PROGRAMAS ,QUANDO FEITO O PROGRAMA EM VS É POSSÍVEL USAR O EXECUTÁVEL SEM A NECESSIDADE DO CÓDIGO FONTE. ?
PARA RODAR OS PROGRAMAS EM VS É NECESSÁRIO ESTAR INSTALADO O VS NA MAQUINA?
Beleza em como fazer ao contrario , receber dados do arduino(onde o aplicativo é o "escravo")
Excelente exemplo para iniciar os estudos.
yure como eu faço o processo contrário? Quero ler infromações que chegam da serial , uma entrada analógica por exemplo , ler e jogar em uma variavel dentro do visual C# .
Yure Parabens pelo Tutorial
to com uma duvida: como fazer um leitura da porta já tentei vários tutoriais e não consegue
Valeu
Poderia dar uma dica
E possível desenvolver uma aplicação no c # express para se comunicar com um clp
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por
Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!
Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)