Delphi: Comunicao serial com Arduino
Autor: Cleiton Bueno
Ano: 2014
Blog: [Link]
Faz alguns anos que no desenvolvia nada em Delphi (Object Pascal), mas como no comeo deste blog eu
publiquei alguns programas escritos em Delphi recebo com frequncia solicitaes 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 to esperada vez com o Delphi.
No tenho as verses mais recentes e acabei de usar uma j ultrapassada o Delphi 7, porm como
recompensa eu fiz 3 videos alm deste post e o fonte disponibilizado, onde abordei desde o download do
componente(biblioteca para comunicar serial), instalao, configurao e comunicao com a mesma,
ento 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 porm precisava de um que primeiro eu j
tenha usado e segundo que no seja pago ou de funcionamento limitado, tem um excelente que usei a um
bom tempo atras o nrComm, esse muito fera, tem vrias melhorias e implementaes que faltam no
ComPort Lib alm de toda implementao para GSM, USB HID e Bluetooth e suporte a vrias verses do
Delphi, mas para implementaes simples e at intermediaria o ComPort perfeito, conforme vai
aumentando falta recursos implementados e que voc deve fazer na mo o tratamento j o nrComm
praticamente entrega a informao em uma varivel ou buffer pra voc.
O componente pode ser baixado aqui ou em [Link]/projects/comport/, no abordarei aqui
a instalao do componente e configurao da IDE ento segue o link do vdeo que gravei:
Instalando ComPort Library no Delphi 7 para comunicar com Arduino
[Link]
Aps a instalao e configurao da IDE uma nova paleta para surgir na IDE como Figura01.
Figura01 Novo componente instalado
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 na Figura02.
Figura02 Componente no Form e a chamada do Painel Setup Dialog do ComPortLib
No quadrado vermelho esta nosso componente se der dois cliques abrir o painel de configurao da
conexo serial, em verde nosso bitbtn e em azul estamos realizando a chamada do ShowSetupDialog
quando for clicado no boto Painel, que o mesmo painel de configurao de quando se clica duas vezes
no componente.
Agora chegou a parte divertida do post de ver a comunicao funcionando, primeiro voc precisa de um
Arduino UNO com este firmware que escrevi no post Arduino Sensor de temperatura Parte2, porm
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 comunicao, mas poderia ser Python, C, Perl, PHP, C# enfim, vamos ver na Figura03.
Figura03 Comunicao Delphi 7 usando CPortLib e os dispositivos embarcados
O que eu quero dizer com a Figura03 que o Delphi com o CPortLib comunicar (Enviar/Receber) dados
por comunicao serial, neste exemplo deste artigo estou usando o Arduino UNO, ok! Porm o Delphi e o
CPortLib no sabe o que Arduino, ou seja, eles no sabem o que ir ter do outro lado do cabo pois o
mesmo cdigo 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
no importa o que se tem do outro lado implementando corretamente o tratamento da comunicao
serial e a correta implementao do protocolo maravilha comunicar, eu poderia muito bem neste artigo
escrever e tratar o caracter t que ser enviado usando um MSP430 da LaunchPad e funcionaria
perfeitamente com nossa aplicao, espero ter passado a ideia e com clareza.
Vamos agora a um exemplo bem bsico de uso do CPortLib ou ComPort Library o que preferir :)
Comunicao serial bsica de Delphi com Arduino usando ComPort
[Link]
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 funes do componente:
[Link]
[Link]
[Link]('t')
[Link]
\\ Retorna true se a conexo esta estabelecida
\\ Abre a conexo serial
\\ Escreve o caracter 't' na comunicao serial
\\ Fecha a conexo serial
No meu ponto de vista o exemplo mais bsico, simples e funcional para comunicar serial com Delphi,
porm eu acho incomodo usar o ComTerminal salvo caso apenas para monitorar a serial, mas acho legal
usar um Memo e inserir nele o que chegar pela serial alm de outras informaes durante a comunicao
como erros, alertas e status alm de usar mais recursos desse componente, vamos ao terceiro vdeo e mais
completo agora.
Comunicao serial completa de Delphi com Arduino usando ComPort
[Link]
Agora vamos explorar o que foi utilizado e como utilizado no vdeo acima:
1) Componente ComPort (CPort): Name: comport
2) Componente TMemo com: Name: MemoLog; Lines: Log da comunicao serial; ScrollBars: ssVertical
3) Quatro TButton:
3.1) Name: btnPainelConfig; Caption: Painel; Cursor: crHandPoint; ShowHint: True; Hint:
Mensagem;
3.2) Name: btnOpenPort; Caption: Abrir Conexo; Cursor: crHandPoint; ShowHint: True; Hint:
Mensagem;
3.3) Name: btnComunicar; Caption: Comunicar; Cursor: crHandPoint; ShowHint: True; Hint:
Mensagem;
3.4) Name: btnClosePort; Caption: Fechar Conexo; Cursor: crHandPoint; ShowHint: True; Hint:
Mensagem;
4) Form: Name: FmPrincipal; Caption: Comunicao Delphi 4 Arduino; Position: poDesktopCenter
Nesta etapa a sacada est na Figura04.
Figura04 Tcomport Propriedades, Eventos e Procedure OnRxChar da recepo dos dados
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 cdigo utilizado neste evento.
No vou discutir todas as etapas do cdigo pois no video fiz devagar cada etapa e acho que ficou claro,
disponibilizarei o cdigo usado no video e agora comentarei as principais funes do TComPort.
procedure [Link](Sender: TObject);
begin
// Funes importantes e suas funcionalidades
[Link];
// Painel para configurar os parametros
[Link];
// Abre a conexo serial
[Link];
// Fecha a conexo serial
[Link];
// Retorna True se a conexo estiver aberta
[Link];
// Conta o que chegou no Rx
[Link];
// Conta o que esta sando no Tx
[Link](BUFFER,TAMANHO)
// Escrever Buffer na serial com seu tamanho
[Link](STRING)
// Escrever uma string ou caracter na serial
[Link](BUFFER,TAMANHO)
// Recebe um buffer da serial com seu tamanho
// aqui devo usar InputCount para tamanho
[Link](STRING,TAMANHO) // Recebe uma string da serial e devo usar
// InputCount para saber o tamanho
// Parametros necessarios para a comunicao serial
{ Use: ShowSetupDialog para abstrair esta etapa, caso no queira
se arriscar
}
[Link]
// Deve ser passada a porta. Ex: COM3
[Link]
// Baudrate:
Ex: br9600
[Link]
// StopBit:
Ex: sbOneStopBit
[Link]
// DataBit:
Ex: dbEight
[Link]
// Parity:
Ex: prNone
end;
No terceiro video Comunicao serial completa de Delphi com Arduino usando ComPort eu realizo alguns
tratamentos importantes como:
1) O boto Abrir Conexo s habilitado quando a porta selecionada em Painel
2) Os botes Comunicar e Fechar Conexo s so habilitados aps abrir a conexo com sucesso
3) Aps abrir a conexo o boto Abrir Conexo desabilitado e a qualquer momento voc pode Comunicar
ou Fechar a conexo
4) Caso o operador esquea de ir em Fechar Conexo no evento OnClose do Form ou seja quando o Form
for encerrado o evento [Link] chamado
5) realizado um Try/Except quando realiza a abertura da conexo como verificar se j no esta aberta ou
alguma outra exceo e o resultado reportado no MemoLog
Aplicao final Figura05.
Figura05 E todas as etapas do funcionamento e logs
Cdigo-fonte:
[Link]
ComPort Library
[Link]/projects/comport/
Vdeos:
Instalando ComPort Library no Delphi 7 para comunicar com Arduino
[Link]
Comunicao serial bsica de Delphi com Arduino usando ComPort
[Link]
Comunicao serial completa de Delphi com Arduino usando ComPort
[Link]
Este trabalho de Cleiton Bueno, foi licenciado sob uma Licena Creative Commons Atribuio-NoComercialCompartilhaIgual 3.0 Brasil.
Baseado no trabalho em [Link]
Cdigo-fonte firmware Arduino
/* Temperatura em Celsius */
int PinAnalogLM35 = 0; //Setando Pino A0
float valAnalog = 0; // Iniciando variavel valAnalog como 0
float temp = 0;
//Iniciando variavel temp como 0
void setup(){
[Link](9600);
}
void loop(){
if ([Link]() > 0){
if ([Link]() == 116){ // letra t
// Lento o pino A0, aqui estamos obtendo o valor
valAnalog = analogRead(PinAnalogLM35);
temp = (valAnalog * 500) / 1023;
[Link](temp) ;
}
}
}
Cdigo-fonte Aplicao Delphi
unit UnPrincipal;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, CPort;
type
TFmPrincipal = class(TForm)
comport: TComPort;
MemoLog: TMemo;
BtnPainelConfig: TButton;
btnOpenPort: TButton;
btnComunicar: TButton;
btnClosePort: TButton;
Label1: TLabel;
lbNomeRodape: TLabel;
lbLinkRodape: TLabel;
procedure BtnPainelConfigClick(Sender: TObject);
procedure btnOpenPortClick(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure btnComunicarClick(Sender: TObject);
procedure comportRxChar(Sender: TObject; Count: Integer);
procedure btnClosePortClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
FmPrincipal: TFmPrincipal;
implementation
{$R *.dfm}
{
Titulo: Delphi: Comunicao serial com Arduino
Autor: Cleiton Bueno
Ano: 2014
Link: [Link]
Licena: BSD
Use, divulgue, modifique mas se possivel cite a fonte :)
Este trabalho de Cleiton Bueno, foi licenciado sob uma Licena Creative Commons Atribuio-NoComercialCompartilhaIgual 3.0 Brasil.
Baseado no trabalho em [Link]
}
procedure [Link](Sender: TObject);
begin
[Link];
[Link] := True;
// Aqui voce especifica sua porta serial, diretamente assim...
//[Link] := 'COM3'
// Ou por um Edit.. assim...
//[Link] := [Link];
// Na opo abaixo o BaudRate
// Tome cuidado com o BaudRate que no apenas para algo como:
// 9600
// Ele tem seu "padro"
//[Link]
// StopBits
//[Link]
// Paridade
//[Link]
// Data Bits
//[Link]
end;
procedure [Link](Sender: TObject);
begin
try
// Abrindo a conexo serial
[Link];
if [Link] then
begin
[Link] := [Link] + 'Conexo serial estabelecida com sucesso ('+[Link]+')';
[Link](''); //Gambi para ir para proxima linha, nao lembro como usar #13
[Link] := False;
[Link] := True;
[Link] := True;
end
else
[Link] := [Link] + 'FALHA ao abrir conexo serial com ('+[Link]+')'
Except on E : Exception do
begin
[Link] := [Link] + 'ERRO ao abrir conexo: Detalhes> '+[Link];
end
end
end;
procedure [Link](Sender: TObject;
var Action: TCloseAction);
begin
// Caso o usuario feche o programa sem fechar a conexo
[Link];
end;
procedure [Link](Sender: TObject);
begin
// Sem misterio... inserindo a mensagem Comunicando, aguarde...
// no memo e enviando o caracter 't' para a serial...
[Link] := [Link] + 'Comunicando, aguarde...';
[Link]('t');
end;
procedure [Link](Sender: TObject; Count: Integer);
var
RxCount: Integer;
RxComport: String;
begin
// Primeiro, neste componente devemos saber
// a quantidade de bytes recebidos
RxCount := [Link];
//Agora iremos chamar a funo que ira receber o conteudo
// e informar onde sera armazenado e a quantidade com a variavel
// acima
[Link](RxComport,RxCount);
//Enviando para o MemoLog
[Link] := [Link] + RxComport;
end;
procedure [Link](Sender: TObject);
begin
// Fechando a conexo quando o operador clicar no botao
[Link];
// Vamos trabalhar em cima desta ao
if not [Link] then
begin
[Link] := [Link] + 'Conexo serial finalizada com sucesso ('+[Link]+')';
[Link] := False;
[Link] := False;
[Link] := False;
end
else
[Link] := [Link] + 'Falha ao finalizar conexo serial.'
end;
end.