Comunicação Serial (RXTX) com Java e Arduino no Mac OS X

Em alguns tutoriais aqui no blog, optei por utilizar o C# no Windows pra realizar a comunicação com o Arduino via serial, por ser bem simples e rápido de fazer. Na época, tentei fazer com Java, mas lembro que não tinha uma versão 64 bits da biblioteca para realizar essa comunicação. Uma solução seria recompilar a biblioteca, mas… acabei indo pra alternativa mais rápida.

Recentemente, comecei um projeto bem legal com o Arduino (muito em breve vou postar aqui) e agora não teve jeito, vai ser web (também) e a melhor alternativa seria utilizar Java.

Vamos lá então ?

O que foi utilizado no tutorial:

Até onde pesquisei, a melhor opção é utilizar a biblioteca RXTX pelo fato de ser open source e possuir uma wiki bem legal que fornece todo o suporte necessário para começar a utiliza-la. Além dela existe também a Java Communications API, mas esta, parece que foi descontinuada, além de varias outras, inclusive bibliotecas proprietárias.

1. Download e Configuração da Biblioteca RXTX

Antes de mais nada, é necessário realizar o download dos arquivos no site da biblioteca. No momento em que este tutorial está sendo feito a versão utilizada foi a “rxtx 2.1-7r2 (stable)”, acesse a página de download aqui, ou se preferir, clique aqui para realizar o download direto dos arquivos.

Após realizar o download é só extrair os arquivos em uma pasta. O único arquivo que vamos utilizar dai é o “RXTXcomm.jar”.

Ao invés de utilizar o arquivo “librxtxSerial.jnilib” que está dentro da pasta Mac_OS_X, vamos utilizar uma outra versão desse arquivo que foi compilado pelo Robert Harder e está disponível no seu site. Isso é necessário, porque o arquivo que acompanha a biblioteca não tem suporte as versões 64 bits do Mac OS X, enquanto a versão disponibilizada pelo Harder, segundo seu site, suporta tanto as versões 32 quanto 64 bits, Intel ou PowerPC. Na página tem explicação mais detalhada. Pra fazer o download direto clique aqui.

Agora o que você precisa fazer é:

  • Copiar o arquivo RXTXcomm.jar para /Library/Java/Extensions
  • Copiar o arquivo librxtxSerial.jnilib para /Library/Java/Extensions

Já estamos quase lá, você também vai precisar criar o diretório /var/lock como root e atribuir as permissões de escrita necessárias. Se você não sabe como fazer isso siga as instruções abaixo:

  1. Abra o terminal
  2. Digite sudo mkdir /var/lock para criar o diretório
  3. Informe a sua senha quando solicitado
  4. Feito isso, digite sudo chmod 777 /var/lock

Agora já temos a biblioteca pronta pra se comunicar com o SO. Para utiliza-la é só adicionar o jar RXTXcomm.jar ao classpath do seu projeto.

Caso a sua aplicação não compile, será necessário também, passar os seguintes parâmetros a VM quando for executar alguma aplicação:

-Djava.library.path=”/caminho_pasta_rxtx;$PATH”

Substituindo “/caminho_pasta_rxtx” pelo caminho onde se encontrar a sua lib “librxtxSerial.jnilib”. A minha por exemplo está localizada em “/Users/renatopeterman/rxtx”, logo o meu ficaria da seguinte forma: -Djava.library.path=”/Users/renatopeterman/rxtx;$PATH”. Mais adiante veremos como fazer tudo isso no Netbeans.

2. Arduino

Abaixo, um código bem simples para ser utilizado no Arduino para que possamos realizar a comunicação. Basicamente, ele identifica o que está sendo passado para o Arduino, nesse caso um número que corresponde ao char na tabela ASCII. Quando for informada a letra “a” na aplicação Java, será enviado ao arduino o equivalente a tabela ASCII desse char. Por exemplo, caso seja informada o char “a”, equivalente ao número “97” retorna a string “Voce informou a letra A”, e mesma coisa para a letra “b”, equivalente ao número “98”.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
void setup(){
 
  //Inicia a porta serial
  //com baud rate de 9600
  Serial.begin(9600);

}

void loop(){
 
  //Verifica se possui alguma entrada de dados
  //na entrada Serial
  if(Serial.available()){
   
    //Le o parametro de dados passado
    //para a porta serial
    char entrada = Serial.read();
   
    //Se o parametro passado for a letra "a"
    //escreve na saida serial "Voce informou a letra A"
    if(entrada == 97){
      Serial.println("Voce informou a letra A");
    }
   
    //Se o parametro passado for a letra "b"
    //escreve na saida serial "Voce informou a letra B"
    if(entrada == 98){
      Serial.println("Voce informou a letra B");
    }
  }

}

3. Java

Neste exemplo utilizei o código que está disponível na página do projeto RXTX. É um aplicativo simples, utilizando threads, que funciona via linha de comando e que permite uma comunicação de duas vias, onde, além de imprimir no console a saída serial, é possível também enviar comandos ao mesmo. Você pode copiar o código do projeto clicando aqui.

Como você já deve ter notado, é necessário informar a porta serial no metódo main do código, por exemplo, no meu caso, onde estou utilizando um Arduino Duemilanove, a porta serial está em “/dev/tty.usbserial-A600ae3J”.

Abaixo segue um trecho do código presente, onde deve ser informada a porta serial.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
...
public static void main ( String[] args )
    {
        try
        {
            //Informe a sua porta serial no metódo "connect()"
            //Por padrão ele traz a porta "COM3" que é utilizada no Windows.
            //É necessário substituir pelo nome da porta no Mac, conforme o exemplo abaixo.
            (new TwoWaySerialComm()).connect("/dev/tty.usbserial-A600ae3J");
        }
        catch ( Exception e )
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
...

Como citei anteriormente, antes de executar o código, é necessário algumas configurações adicionais. Primeiro é necessário adicionar o jar RXTXcomm.jar ao seu projeto. Conforme mostra a imagem abaixo, clique com o botão direito sobre a pasta bibliotecas do seu projeto, vá em “Adicionar JAR/pasta…” e selecione o arquivo “RXTXcomm.jar”.

Feito isso, caso não funcione, conforme citado acima, será necessário passar os seguintes argumentos para a VM:

-Djava.library.path=”/caminho_pasta_rxtx;$PATH”

Substituindo “/caminho_pasta_rxtx” pelo caminho onde está o arquivo “librxtxSerial.jnilib” no seu computador.

No Netbeans, clique com o botão direito sobre o seu projeto, e selecione a opção propriedades. Na janela que se abriu, do lado direito selecione a opção “executar” e em “Opções da VM” informe o argumento conforme especificado acima. As imagens abaixo ilustram o procedimento.

3. Pronto

Agora é só ligar tudo, cruzar os dedos e compilar, se tudo der certo, quando você informar a letra “a” ou “b” no console, ele retornará as strings correspondentes que serão impressas no console do Java. A partir desse exemplo simples, é possível entender como é feita a comunicação e serve de base para aplicações mais complexas. Só depende da sua criatividade. 😉

Se o tutorial foi útil pra você, por favor, não deixe de comentar. 🙂

12 pensou em “Comunicação Serial (RXTX) com Java e Arduino no Mac OS X

  1. Sos un genio!!
    Busque la solución por varios lados y no encontré nada!. Encontré este tutorial y quedo perfecto!!!

    Muchísimas gracias!!!

    Un fuerte abrazo y saludos desde Paraguay pero soy Uruguayo! jeje

  2. Você poderia me dar alguma dica de como fazer isso em c++, não pretendo utilizar o Arduino mas preciso capturar a saída de um teclado no mac e encaminhar a um outro aplicativo por uma porta serial virtual, qualquer ajuda seria muito útil, desde já obrigado Att Freddy

    • Olá Fredson,

      Aconselho dar uma pesquisada sobre como desenvolver aplicações pra Mac OS. Você pode utilizar o XCode e a linguagem utilizada no Mac é Objective-C, não sei te dizer exatamente como fazer isso que você precisa, mas acredito que você acha fácil na internet.

      Renato

  3. Olá, Renato
    Excelente Tutorial, parabéns!
    Eu posso seguir este passo a passo para fazer uma aplicação no Ubuntu ou terei que alterar alguma coisa?
    Obrigado!

    • Olá Vitor,

      No Ubuntu os caminhos (pastas) para onde os arquivos devem ser copiados são diferentes do Mac OS. Por isso aconselharia buscar um tutorial específico (no próprio site da biblioteca deve ter).

      Renato

  4. Olá, estou seguindo este exemplo e fazendo algumas modificações. Estou usando o sistema operacional Windows e a partir do momento que informo a letra “a” um led se acende e quando informo a letra “b” o led se apaga. Entretanto não esta funcionando. A comunicação esta OK mas não esta fazendo o esperado. Tenho observado que ao informar a letra “a” ou “b” no arduino apenas a luz do RX se acende. Poderia me ajudar?
    Obrigada

    • Olá Angelina,

      É um pouco complicado identificar o problema uma vez que não sei exatamente como você está fazendo, nas se a comunicação está ok (conforme mostra o tutorial), verifique o seu código, pode ser que o problema esteja nele. Não sei como foi feita a ligação, mas evite de usar as portas 0 e 1.

      Boa sorte!

      • Olá Renato, acho que sei o que aconteceu no teste da Angelina, tive o mesmo problema, no código java do site RXTX, a porta serial está configurada para 57600 e o Arduino para 9600, portanto no código java fora a correção da COM, é necessário arrumar a velocidade da porta serial para 9600.
        Estou começando em java e arduino, obrigado por este site, me ajudou muito.
        Sds,

        • Olá Ricardo,

          Verdade, não me lembrava disso, hehe.
          Muito provável que seja isso mesmo.
          Fico feliz em saber que lhe foi útil, este é o propósito.
          Boa sorte nos seus projetos!

          Renato

        • Ricardo… só não te dou um beijo porque estou longe kkkkkkkkkkk …
          Fiquei 2 dias tentando fazer funcionar… nunca ia imaginar que é isso…
          Muito Obrigado!!!!!
          Gustavo

Deixe um comentário para Ricardo Cancelar resposta

O seu endereço de e-mail não será publicado.

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.