Delphi – Comunicação serial com Arduino

ArduinoRS232Delphi7

Faz alguns anos que não desenvolvia nada em Delphi (Object Pascal), mas como no começo deste blog eu publiquei alguns programas escritos em Delphi recebo com frequência solicitações de enviar o fonte ou algum material, como eu prefiro ensinar a pescar do que dar o peixe, resolvi trabalhar em cima disso, como já escrevi sobre comunicar serial com Arduino usando Python e pretendo fazer com outras linguagens desta vez foi a tão esperada vez com o Delphi.

Como recebi um e-mail do Prof. Airton José Sachetim Garcim e que ajudaria a ensinar os alunos achei que deveria dar uma atenção e uma força já que era para intuito didático e educacional, espero que ajude Professor :).

Não tenho as versões mais recentes e acabei de usar uma já ultrapassada o Delphi 7, porém como recompensa eu fiz 3 videos além deste post e o fonte disponibilizado, onde abordei desde o download do componente(biblioteca para comunicar serial), instalação, configuração e comunicação com a mesma, então vamos lá:

Foi utilizado:

IDE Borland Delphi 7.0 (Build 4.453)

Componente ComPort Library Version 4.11 by Dejan Crnila

Por que usei ComPort Library ou CPortLib? Poderia usar outros porém precisava de um que primeiro eu já tenha usado e segundo que não seja pago ou de funcionamento limitado, tem um excelente que usei a um bom tempo atras o nrComm, esse é muito fera, tem varias melhorias e implementações que faltam no ComPort Lib além de toda implementação para GSM, USB HID e Bluetooth e suporte a varias versões do Delphi, mas para implementações simples e até intermediaria o ComPort é perfeito, conforme vai aumentando falta recursos implementados e que você deve fazer na mão o tratamento já o nrComm praticamente entrega a informação em uma variável ou buffer pra você.

O componente pode ser baixado aqui ou em www.sourceforge.net/projects/comport/, não abordarei aqui a instalação do componente e configuração da IDE então segue o link do vídeo que gravei:

Instalando ComPort Library no Delphi 7 para comunicar com Arduino

Após a instalação e configuração da IDE uma nova paleta é para surgir na IDE como na imagem abaixo:

PaletaComponenteComPort

Para programar é bem lá estilo Delphi, clica arrasta e solta o componente e isso pode ser feito com o primeiro componente da aba CPortLib o ComPort (CPort), cliquei em cima dele e depois clique novamente em cima do form, em seguida inserida um button ou bitbtn que daremos o nome Painel como abaixo:

BasicoPainel

No quadrado vermelho esta nosso componente se der dois cliques abrirá o painel de configuração da conexão serial, em verde nosso bitbtn e em azul estamos realizando a chamada do ShowSetupDialog quando for clicado no botão Painel, que é o mesmo painel de configuração de quando se clica duas vezes no componente.

Agora chegou a parte divertida do post de ver a comunicação funcionando, primeiro você precisa de um Arduino UNO com este firmware que escrevi no post Arduino – Sensor de temperatura Parte2, porém explicarei algo importante que muitos devem saber mas já recebi duvidas sobre.

Neste caso utilizarei o Delphi (Object Pascal) como IDE e linguagem e o ComPort Lib como componente para comunicação, mas poderia ser Python, C, Perl, PHP, C# enfim, vamos ver a imagem abaixo:

Delphi7CPortlibRS232Guest

 

O que eu quero dizer com esta imagem é que o Delphi com o CPortLib comunicará (Enviar/Receber) dados por comunicação serial, neste exemplo deste post estou usando o Arduino UNO, ok! Porém o Delphi e o CPortLib não sabe o que é Arduino, ou seja, eles não sabem o que irá ter do outro lado do cabo pois o mesmo código eu posso usar para comunicar com um Arduino, PC (Windows ou Linux), Texas LaunchPad MSP430, Raspberry PI, BeagleBone Black, microcontrolador, ARM Cortex-Mx, onde eu quero chegar é que não importa o que se tem do outro lado implementando corretamente o tratamento da comunicação serial e a correta implementação do “protocolo” maravilha comunicará, eu poderia muito bem neste post escrever e tratar o caracter ‘t’ que será enviado usando um MSP430 da LaunchPad e funcionaria perfeitamente com nossa aplicação, espero ter passado a ideia.

Vamos agora a um exemplo bem básico de uso do CPortLib ou ComPort Library o que preferir :).

Comunicação serial básica de Delphi com Arduino usando ComPort

O que foi utilizado acima é muito simples, vamos ver do que precisei:

1) Componente ComPort (CPort) e o name alterado para comport
2) Componente ComTerminal (CPortCtl) e nas propriedades sem ComPort escolher comport
3) Usar as seguintes funções do componente:

comport.Connected \ Retorna true se a conexão esta estabelecida
comport.Open \ Abre a conexão serial
comport.WriteStr('t') \ Escreve o caracter 't' na comunicação serial
comport.Close \ Fecha a conexão serial

No meu ponto de vista é o exemplo mais básico, simples e funcional para comunicar serial com Delphi, porém eu acho incomodo usar o ComTerminal salvo caso de apenas monitorar a serial, mas acho legal usar um Memo e inserir nele o que chegar pela serial além de outras informações durante a comunicação como erros, alertas desse componente, vamos ao terceiro vídeo e mais completo agora.

Comunicação serial completa de Delphi com Arduino usando ComPort

Agora vamos explorar o que foi utilizado e como utilizado no vídeo acima:

1) Componente ComPort (CPort): Name: comport
2) Componente TMemo com: Name: MemoLog; Lines: Log da comunicação serial…; ScrollBars: ssVertical
3) Quatro TButton:

3.1) Name: btnPainelConfig; Caption: Painel; Cursor: crHandPoint; ShowHint: True; Hint: Mensagem;

3.2) Name: btnOpenPort; Caption: Abrir Conexão; Cursor: crHandPoint; ShowHint: True; Hint: Mensagem;

3.3) Name: btnComunicar; Caption: Comunicar; Cursor: crHandPoint; ShowHint: True; Hint: Mensagem;

3.4) Name: btnClosePort; Caption: Fechar Conexão; Cursor: crHandPoint; ShowHint: True; Hint: Mensagem;
4) Form: Name: FmPrincipal; Caption: Comunicação Delphi 4 Arduino; Position: poDesktopCenter

Nesta etapa a sacada esta na imagem abaixo:

CPortLibParametersEventsDelphiArduino

Na primeira coluna temos as propriedades do nosso comport (TComPort) na segunda coluna os Eventos e a grande sacada é no evento OnRxChar “vincular” o nosso MemoLog que é visto na terceira coluna todo o bloco de código utilizado neste evento.

Não vou discutir todas as etapas do código pois no vídeo fiz devagar cada etapa e acho que ficou claro, disponibilizarei o código usado no vídeo e agora comentarei as principais funções do TComPort.

procedure TForm1.btnHelpComClick(Sender: TObject);
begin
// Funções importantes e suas funcionalidades
comport.ShowSetupDialog; // Painel para configurar os parametros
comport.Open; // Abre a conexão serial
comport.Close; // Fecha a conexão serial
comport.Connected; // Retorna True se a conexão estiver aberta
comport.InputCount; // Conta o que chegou no Rx
comport.OutputCount; // Conta o que esta sando no Tx
comport.Write(BUFFER,TAMANHO) // Escrever Buffer na serial com seu tamanho
comport.WriteStr(STRING) // Escrever uma string ou caracter na serial
comport.Read(BUFFER,TAMANHO) // Recebe um buffer da serial com seu tamanho
// aqui devo usar InputCount para tamanho
comport.ReadStr(STRING,TAMANHO) // Recebe uma string da serial e devo usar
// INputCount para saber o tamanho

// Parametros necessarios para a comunicação serial
{ Use: ShowSetupDialog para abstrair esta etapa, caso não queira
se arriscar
}
comport.Port // Deve ser passada a porta. Ex: COM3
comport.BaudRate // Baudrate: Ex: br9600
comport.StopBits // StopBit: Ex: sbOneStopBit
comport.DataBits // DataBit: Ex: dbEight
comport.Parity // Parity: Ex: prNone
end;

No terceiro vídeo Comunicação serial completa de Delphi com Arduino usando ComPort eu realizo alguns tratamentos importantes como:
1) O botão Abrir Conexão só é habilitado quando a porta é selecionada em Painel
2) Os botões Comunicar e Fechar Conexão só são habilitados após abrir a conexão com sucesso
3) Após abrir a conexão o botão Abrir Conexão é desabilitado e a qualquer momento você pode Comunicar ou Fechar a conexão
4) Caso o operador esqueça de ir em Fechar Conexão no evento OnClose do Form ou seja quando o Form for encerrado o evento comport.Close é chamado
5) É realizado um Try/Except quando realiza a abertura da conexão como verificar se já não esta aberta ou alguma outra exceção e o resultado é reportado no MemoLog

Tentei passar o necessário para realizar a comunicação serial com Delphi e utilizando um componente que você não terá problemas com licenças :), segue o download do código-fonte e este post inteiro em .pdf caos queira guardar, desculpe se cometi algum erro no Delphi mas a ideia foi desenvolver a aplicação e que fosse funcional a partir de então você tem o código em mãos e pode implementar ou deixar o código melhor que neste caso ;)

Até a próxima!

Código-fonte:

http://cleitonbueno.com/downloads/blog/Delphi4Arduino/ProjetoComunicacaoArduino4Delphi.zip

Artigo em pdf:

http://cleitonbueno.com/downloads/blog/Delphi4Arduino/DelphiCPortLibDelphi4ArduinoComFonte.pdf

 

Até a próxima!

Share Button

CC BY-NC-SA 4.0 Delphi – Comunicação serial com Arduino by Cleiton Bueno is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.