Comunicação Serial Java + Arduino

Sobre a comunicação Serial Java + Arduino

 

Neste artigo demonstrarei como ligar e desligar um led, através de comandos enviados pela porta serial (USB) utilizando Java e uma placa Arduino.  

 

Para ler outro artigo que aborda a comunicação serial clique aqui para ler o artigo de Fábio Souza, e caso queira saber mais sobre programação no arduino clique aqui.

 

Mas por que utilizar Universal Serial Bus (USB)?

 

A comunicação USB é uma tecnologia que tornou mais simples e rápida a conexão de diversos tipos de aparelhos (Pendrives,MP3-players, impressoras, celulares, HDs externos, etc). Além de facilitar a conexão de diversos dispositivos, o padrão USB oferece:

 

  • Plug-and-play: a maioria dos dispositivos são reconhecidos automaticamente;
  • Alimentação: os dispositivos não precisam ser ligados a uma fonte de energia externa, já que a própria USB fornece energia. (Lembrado a USB fornece no máximo 5 Volts e 500 mA de corrente);
  • Múltipla conexão: vários dispositivos podem ser conectados através de uma única porta, mas para isso deve-se utilizar um Hub;
  • Compatibilidade: são compatíveis com a maioria dos sistemas operacionais disponíveis no mercado.

 

 

A comunicação entre os sistemas embarcados e os computadores muitas vezes são realizadas via porta paralela (DB25) e porta serial (DB-9).  A utilização desses meios de comunicação pode facilitar uma alteração futura mas, por outro lado, dependendo do dispositivo, a implementação do software no computador pode ser complexa e trabalhosa. Além do mais, podemos danificar permanentemente a placa mãe do computador quando estamos utilizando a porta paralela e ocorre uma descarga elétrica ou invertermos a polaridade de um componente.

 

Esse artigo foi elaborado utilizado o Arduino Mega 2560, NetBeans 7.4, Windows 7 Professional x64 e Ubuntu 12.04 LTS (x64), estou considerando que as IDE's Arduino 1.0.5 ou superior e NetBeans 7.4 ou superior já estejam instaladas e funcionando corretamente.

Obs.: Pode-se utilizar também o Arduino Uno, ADK, Pro. 

 

Layout projeto

 

 

Passo 01: Download dos arquivos

 

Acesse o site http://jlog.org/rxtx.html e faça download dos arquivos rxtxSerial.dll, librxtxSerial.so e RXTXcomm.jar.

 

Obs.: Lembrando de que devemos fazer download dos arquivos de acordo a arquitetura do sistema operacional 32-bits (x86) ou 64-bits (x64).

 

 

Passo 02: Instalação dos arquivos

 

Windows

 

      Copie o arquivo rxtxSerial.dll para:

  • C:\Program Files\Java\jdkx.x.x\bin, onde x.x.x é a versão do JDK, por exemplo C:\Program Files\Java\jdk1.6.40\bin;
  • C:\Program Files\Java\jrex\bin,  onde x é a versão do JRE, por exemplo C:\Program Files\Java\jre7\bin;
  • C:\Windows\System32;
  • C:\Windows\SysWOW64 (caso sistema operacional 64-bits (x64)).

     Copie o arquivo RXTXcomm.jar para:

  • C:\Program Files\Java\jre\jrex\lib\ext, onde x é a versão do JRE, por exemplo C:\Program Files\Java\jre7\lib\ext.

 

Linux

 

      Copie o arquivo librxtxSerial.so para:   

  • /usr/lib/, exemplo: cp /home/Usuario/librxtxSerial.so /usr/lib/.

      Copie o arquivo RXTXcomm.jar para:

  • /usr/share/java/, exemplo.: cp /home/Usuario/RXTXcomm.jar /usr/share/java/.

 

 

Passo 03: Programa Arduino

 

Conecte o cabo USB no Arduino e abra a IDE do Arduino, defina a porta COM (Tools > Serial Port > COM3 ou /dev/ttyUSB0), digite o código abaixo e depois clique no upload. Pronto, o programa já foi carregado no arduino. 

 

Obs.: Geralmente utiliza-se a porta COM3 (Windows) e /dev/ttyUSB0 (Linux), caso apareça outra porta não tem problema, desde que a porta correta seja informada no programa em Java.

 

 

 

Passo 04: Programa Java

 

Abra o programa NetBeans 7.4 criei um projeto Aplicação Java (Arquivo > Novo Projeto > Java > Aplicação Java) e vamos chamá-lo de ComunicacaoSerial.

Renomeie o pacote "comunicacaoserial" para "br.com.embarcados.comunicaoserial" e depois apague a classe ComunicacaoSerial.java que foi gerada. 

Feito isso, adicione um JFrame no pacote br.com.embarcados.comunicaoserial (botão direito em cima do pacote > Novo > Form Frame), e chame-o de JFInterface.

 Novo JFrame

 

 

Na Paleta de controle de Swing (lado direito da tela), clique em cima do botão e arraste para dentro do JFInterface. Após esse passo altere o nome da variável jButtom1 para jBLenOn e altere o texto do botão para Ligar. Basta clicar com o botão direito em cima do botão e escolher as opções Editar Texto e Alterar nome da variável. 

 

Copie mais 02 botões para o JFInterface e repita o mesmo processo renomeando-os para ID: jBLenOff, jBClose e Text: Desligar e Sair.

 Interface Renomeada

 

Acrescente duas classes no projeto "Arduino.java e ControlePorta.java" (botão direito em cima do pacote > Novo > Classe Java.

 

No arquivo Arduino.java realizaremos o envio das informações para o Arduino e no arquivo ControlePorta.java faremos toda a programação para enviar os dados através da porta serial.

 

Adicione o código abaixo no arquivo ControlePorta.java.

 

 

Após adicionar o código acima acontecerá vários erros conforme a mensagem abaixo.

 

 

Esses erros aconteceram porque não adicionamos o arquivo RXTXcomm.jar no nosso projeto. Para adicioná-lo clique com o botão direito em cima da pasta Biblioteca e escolha Adicionar JAR/Pasta... e informe o diretório onde o arquivo RXTXcomm.jar (C:\Program Files\Java\jre7\lib\ext\RXTXcomm.jar, caso esteja utilizando Windows) ou (/usr/share/java/ RXTXcomm.jar, caso esteja utilizando Linux).

 

Limpe e construa o projeto (botão direito em cima do projeto ComunicacaoSerial > Limpar e Construir) e os problemas serão corrigidos conforme pode-se ver na imagem abaixo.

  

Erro import gnu.io (corrigido)

 

Agora adicione o código abaixo no arquivo Arduino.java.

 

 

Feito isso, falta implementar a ação a ser executada quando um determinado botão for pressionado.

Abra o arquivo JFInterface.java, clique com o botão direito em cima do botão “Ligar” e acione o método MousedClicked. Será criado automaticamente um método dentro da classe JFInterface.java conforme a imagem abaixo.

 

Código gerado para o LedOnClicked

 

Declare uma variável do tipo Arduino antes do construtor da classe JFInterface, conforme a figura abaixo.

 

Declaração da variável

 

 

Dentro do método jBLedOnMouseClicked criado anteriormente adicione o código conn.comunicacaoArduino(jBLedOn).

 

LedOnClicked com ação

 

Esse comando irá acionar o método comunicacaoArduino(), passando o botão clicado, que por sua vez irá enviar o dado pela porta serial.

 

Adicione o mesmo evento para o botão “Desligar” e coloque o código abaixo:

  

LedOffClicked

 

Adicione o mesmo evento para o botão “Sair” e coloque o código abaixo:

  

CloseClicked

 

 

Passo 05: Executando o programa

 

Agora basta apenas conectar o seu Arduino à porta USB do seu computador e clicar em Executar o projeto Java. Ao aparecer a Tela, basta apenas clicar no botão "Ligar" para ligar, "Desligar" para desligar o Led e “Sair” para encerrar aplicação.

 

Os códigos fontes utilizados na elaboração desse artigo estão disponíveis em: https://github.com/klauder/ComunicacaoSerial

 

Espero que tenham gostado e até breve. 

 

Referências

 

http://jlog.org/rxtx.html

http://arduino.cc/en/Main/ArduinoBoardMega2560

http://arduino.cc/en/reference/serial

  

Deixe um comentário

74 Comentários em "Comunicação Serial Java + Arduino"

Notificar
avatar
 
Ordenar por:   recentes | antigos | mais votados
Aislan Silva Costa
Visitante
Aislan Silva Costa

Seguindo o artigo, consegui realizar a conexão, porem tenho loops de leituras de sensores dentro do meu Arduino, e no APP java ele recebe esses valores. Porem na comunicação serial não consigo fazer loops, pois a porta da conexão tem que ser aberta e sempre fechada para envio e recebimento de dados entre os dispotivos(java e arduino). Ha algum modo de contornar esse problema? Pensei em sempre que iniciar o aplicativo deixar um loop realizando as leituras, e sempre que fosse escrever algo, interromper esse loop para escrever na serial. Sera que daria certo? Aguardo contato!

chinnonsantos07
Membro
chinnonsantos07

Essa DLL (rxtxSerial.dll) e classe (RXTXcomm.jar) serve para qualquer projeto utilizando comunicação serial no Arduino (Inteiro, String, Booleano, Array, Object...) ou é especifica para esse projeto de comunicação com dados inteiros (arduino.enviaDados(1) e arduino.enviaDados(2))?

Henrique Ferreira Júnior
Visitante
Henrique Ferreira Júnior

Eu tô usando esse programa para fazer a comunicação com o Arduíno via bluetooth, td parece funcionar bem só que na hora que eu tento fechar a conexão ele diz que fechou mas na vdd n fechou e daí ngm mais consegue se conectar ao bluetooth do Arduino só resetando ele.
Queria saber como faço pra encerrar de vez essa conexão.

Thiago Silva
Visitante
Thiago Silva

Ótimo! Tenho a necessidade de uma aplicação semelhante: preciso fazer a comunicação do programa em java com uma impressora zebra que tem duas opções de comunicação: serial e usb

Diego Siqueira Menezes
Visitante
Diego Siqueira Menezes

Olá amigão, primeiramente gostaria de Agradecer Pela SUA Iniciativa em transmitir o Conhecimento.

Bom Vamos Lá, DEPOIS de ler ESSE Passo a Passo Varias vezes eu consegui executar o Projeto Dentro do netbeans ...

Agora when tento abrir o Arquivo .jar Que se Encontra Dentro da dist massas, Funciona nada ...

Andei pesquisando e me parece Ser algo com a principal classe ...

Bom Não Sei Como Change ...

Se Alguém Além do Klauder Puder me Ajudar agradeço !!!

Diego Siqueira Menezes
Visitante
Diego Siqueira Menezes

Olá amigão, primeiramente gostaria de agradecer pela sua iniciativa em transmitir o conhecimento.
Bom vamos lá, depois de ler esse passo a passo várias vezes eu consegui executar o projeto dentro do netbeans...

Agora quando tento abrir o arquivo .jar que se encontra dentro da pasta dist, nada funciona...

Andei pesquisando e me parece ser algo com a classe principal...

Bom não sei como alterar...

Se alguém além do Klauder puder me ajudar agradeço!!!

Artur Dos Reis D'Angelo
Visitante
Artur Dos Reis D'Angelo

Amigo, como faço para enviar uma String para o arduino a partir do seu código?

gabriel josman
Visitante
gabriel josman

Ola Klauder, poderia fazer um projeto em que você receba dados da porta serial e imprima em um arquivo.txt ou se melhor logo para o Excel, poderia variar utilizando um microcontrolador(já que esse está em falta na internet).
Obrigado desde já! Aguardo respostas.

Wesley Faria
Visitante
Wesley Faria

Parabéns!! Ótimo Tututorial!

Henrique Cunha
Visitante
Henrique Cunha

Estou com o seguinte problema:

java.lang.UnsatisfiedLinkError: C:Program FilesJavajdk1.8.0_31binrxtxSerial.dll: %1 não é um aplicativo Win32 válido thrown while loading gnu.io.RXTXCommDriver

Exception in thread "Sistema Code Control" java.lang.UnsatisfiedLinkError: C:Program FilesJavajdk1.8.0_31binrxtxSerial.dll: %1 não é um aplicativo Win32 válido

at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1937)
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1855)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1119)
at gnu.io.CommPortIdentifier.(CommPortIdentifier.java:123)
at code.control.observer.arduino.ControlePorta.initialize(ControlePorta.java:35)
at code.control.observer.arduino.ControlePorta.(ControlePorta.java:23)
at code.control.observer.arduino.Desbloqueio.executa(Desbloqueio.java:9)
at code.control.observer.Autenticador.lambda$0(Autenticador.java:36)
at code.control.observer.Autenticador$$Lambda$157/1592347142.accept(Unknown Source)
at java.util.Vector$VectorSpliterator.forEachRemaining(Vector.java:1414)
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
at code.control.observer.Autenticador.atualizar(Autenticador.java:31)
at code.control.observer.Sistema.notificarObservadores(Sistema.java:53)
at code.control.qr.aciona.LeitorQR.run(LeitorQR.java:105)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)

Alguém pode me dar uma luz?

wpDiscuz