Crie seu próprio programa de comunicação serial em C# - Tutorial 1

 

É 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:

  • button
  • hScrollBar
  • SerialPort

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:

  • PortName - "COMX"(X = Nº da porta em que o microcontrolador estará conectado)
  • BaudRate - baud rate que está configurado no seu microcontrolador

 

button1:

  • Text - Off

 

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:

  • Open();
  • Write();
  • Close();


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.

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.

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();
     }
}

 trycatch 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:

http://adf.ly/1UB3we

E o do aplicativo deve ficar assim:

http://adf.ly/1UB3kI

Com isso concluímos o nosso aplicativo, adaptem a suas necessidades.Até a próxima.

Exibições: 38584

Comentar

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)

Comentário de alessandro de oliveira em 13 novembro 2013 às 9:07

yure gostaria de aplicar em uma calculadora e o reultado seria números de volta do mortor de passo

Comentário de Yure Vieira em 5 setembro 2013 às 15:48

O serial monitor envia o código ascii do caractere.

Comentário de Thiago da Silva em 5 setembro 2013 às 15:13

Não consegui testar usando o serial monitor...só funcionou até o numero 9...só funciona com 1 casa decimal

Comentário de Yure Vieira em 17 agosto 2013 às 20:44
Pode fazer em C++, mas é bem mais complicado.
Comentário de RENAN KLEIM em 15 agosto 2013 às 12:56

Serviu como uma luva este tutorial, é exatamente isto q eu procurava para meu projeto,valew!

Comentário de Sinésio Neto em 15 agosto 2013 às 0:41

É possível fazer o mesmo utilizando linguagem C?

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço