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:

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.

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.

  • Abilio Júnior

    Ja conheço esse comport faz tempo… eh bom esse component, tenho um sistema que usa 18 deles e roda tranquilamente, com o arduino ainda não tive necessidade.

    Show o post camarada

  • Allan

    Cleiton , parabéns pelo trabalho publicado !! Excelente !!1

  • Magno Alves

    Boa noite Cleiton, vi que vc tem uma boa experiência em comunicação serial e queria saber se vc pode me ajudar. Estou desenvolvendo um sistema de controle em que recebo dados de sensores conectados a um arduino e envia pela serial 1 para outro arduino, sem fio entre os dois arduinos (Mestre-Escravo) e do mestre envio pela serial para o computador e exibe na tela de um progrminha que fiz no delphi. Para exemplificar o problema, um dos sensores informa se o objeto aproximou ou não e as vezes o objeto não aproxima e mesmo assim mostra na tela que ele se aproximou. Para garantir que o objeto realmente não se aproximou, coloquei uma câmera gravando 24h e realmente constatei que o objeto não se aproxima e o relatório fica exibindo por inumeras vezes que o objeto se aproximou.

    Acho que tem algum problema em relação ao tratamento de dados na recepção por parte do codigo no delphi

    Pode me ajudar??
    podemos conversar por email, te envio os códigos para analise

    • Opa, beleza Magno. Na verdade gosto de tudo (comunicação e programação) para embarcados ;)
      Não entendi sua duvida em relação a comunicação serial e os demais Arduinos, me mande um e-mail que alinhamos as informações e no que puder ajudar to ae.

      Abraço

  • Daniel

    Caro Cleiton, muito bom seu site, parabéns.
    Existe a possibilidade de enviar um comando via delphi para o arduino?
    Como exemplo, ao pressionar um botão no programa em delphi , um led se acende.
    Att
    Daniel

    • Claro Daniel, pode até usar a mesma logica que mostrei. No caso estou enviando o caractere ‘t’ o Arduino processa isso e pela logica me devolve o valor do sensor.
      Você pode implementar que enviando ‘a’ ele acende um led, e enviando ‘b’ apague.
      Dá até pra ir mais longe e ficar legal, e enviar l1on (Led 1 On) ae você envia como String.

      Boa sorte!

  • Esquilo Tranquilo

    Bom dia amigo.
    Muito bom seu tópico. Gostaria de aproveitar a oportunidade e saber se tem como implementar uma Trava Elétrica e mandar abrir e fechar via Delphi. Pois estou sem luz alguma para esse projeto. Gostaria de que se possível vc pudesse me ajudar. Obrigado Att,

    • Sim é possível, poderá usar um Arduino UNO mesmo e um relê com um transistor ou com opto-acoplador para acionar cargar AC, do mais a programação é simples via serial.

      Abraço.

      • Esquilo Tranquilo

        Bom dia Cleiton!
        Muito obrigado pela resposta. Ótimo tutorial, material de muita qualidade.

        Gostaria de saber, as funcionalidades das propriedades PARITY e FLOW CONTROL.
        Para que elas servem? Quais as possibilidades? Desde já, muito obrigado!

        Abraços.

        • Pesquise sobre as configuração de comunicação serial que você irá ver e compreender os conceito de uso de paridade e controle de fluxo(hardware e software), além de baudrate e outras características.

  • adolfo moro

    Gostaria de saber se tem como colocar o comando quando vc apertar o botao comport.WriteStr(‘t’)
    Ai em vez de aparecer no terminal jogar esse valor em um Edit? Com esse comando em especifico!

  • Wellington Telles Cunha

    Muito bom. Parabéns pela dedicação.

  • Paulo Rogerio

    Parabéns Cleiton, muito didático. Gostaria de saber se você pode me ajudar? Estou precisando de fazer essa mesma programação que você passou mas com o sensor de infravermelho, preciso receber dados de um equipamento que envia via infravermelho.
    Poderia me ajudar?
    Atte.

  • Jamisson Jader

    Tem como eu fazer uma comunicação dos sensores arduino para o delphi 10 sem fio ? com um módulo Bluetooth por exemplo?

    • Olá Jamisson, faz varios anos que não desenvolvo usando Delphi, mas acredito que se você implementar todas as rotinas para ler os sensores e transportar via Bluetooth no Arduino, não é dificil fazer no lado do Delphi visto que a maioria dos modulso bluetooth para o SO será uma interface serial.

      Um abraço.