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

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 McValdir Inocencio em 20 julho 2016 às 7:23

valeu Yure. mas podes agora me dizer como fazer o mesmo processo sem usar o arduino?

Comentário de Gilson Goes em 19 novembro 2015 às 22:03

Vocês tem uma dica do hardware desse esquema. Como conectar no PIC, etc...

Comentário de Sergio Caetano da Silva em 13 março 2015 às 13:14

Sensacional Yure!Consegui fazer através de seu tutorial um importante passo em meu projeto!

Muito obrigado.

Comentário de Edson Finotec em 23 novembro 2014 às 22:18

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?

Comentário de marcos vinicius nsc ferreira em 26 junho 2014 às 11:37

Beleza em como fazer ao contrario , receber dados do arduino(onde o aplicativo é o "escravo")

Comentário de Alysson Dos Santos Seth em 11 fevereiro 2014 às 7:50

Excelente exemplo para iniciar os estudos.

Comentário de Ilgner Aparecido Becheleni em 26 janeiro 2014 às 22:16

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# .

Comentário de Cabecavil em 10 janeiro 2014 às 20:25

Yure Parabens pelo Tutorial

to com uma duvida: como fazer um leitura da porta já tentei vários tutoriais e não consegue

Valeu

Comentário de Caio Paulo de Sousa em 17 novembro 2013 às 15:29

Poderia dar uma dica

Comentário de Caio Paulo de Sousa em 17 novembro 2013 às 15:28

E possível desenvolver uma aplicação no c # express para se comunicar com um clp

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço