17. Aquisição de dados de um espectrofotômetro - II

A partir de agora, vamos compartilhar algumas informações sobre a aquisição de dados feita com o espectrofotômetro USB2000 através da porta USB.

Lamento informar aos usuários de Windows que a partir de agora vou tratar exclusivamente do desenvolvimento em ambiente Linux, mais especificamente a distribuição Debian (Lenny).

Começamos a trabalhar com esse equipamento visando a implantação de um sistema de análise em fluxo SIA para automatizar análises químicas.

Queria utilizar um espectrofotômetro que permitisse a aquisição simultânea de diferentes comprimentos de onda e que ocupasse pouco espaço na bancada do laboratório.

17.1. Configurações Iniciais

Partindo do princípio que você já tem uma máquina com o sistema Debian instalado vamos aos procedimentos para instalar o interpretador Java.

17.1.1. Instalando o Java.

Por que instalar Java?

A empresa que fabrica este equipamento OceanOptics desenvolveu o driver em Java e por isso você precisa ter o interpretador Java instalado.

Seguindo as orientações deste FAQ incluí as opções contrib non-free no repositório:

deb http://linux.iq.usp.br/debian/ lenny main contrib non-free

no arquivo sources.list (/etc/apt/sources.list).

Em seguida o tradicional:

apt-get update

Após usar apt-get update,pode-se receber uma mensagem parecida com essa:

W: There are no public key available for the following key IDs:A70DAF536070D3A1

Esse Warning (não é erro) aparece porque pacotes de alguns repositórios são assinados com uma chave assimétrica, para garantir a integridade dos pacotes.

Para acessar um pacote assinado você precisa da chave pública. Só é necessário habilitar a chave uma vez. Caso isso ocorra, use os seguintes comandos, onde XXXXXXXX representa os oito últimos termos do erro apresentado sendo que o processo deve ser repetido para cada key pedida

# gpg --keyserver wwwkeys.eu.pgp.net --recv-keys XXXXXXXX

Se o wwwkeys.eu.pgp.net não funcionar tente o subkeys.pgp.net

# gpg --armor --export XXXXXXXX | apt-key add -

Depois é só dar mais um apt-get update.

E em seguida a instalação do kit de desenvolvimento Java:

apt-get install sun-java6-jdk

E do interpretador Java:

apt-get install sun-java6-jre

Para configurar o link java e javac para o JDK 6 rodei como root:

update-alternatives --config java

update-alternatives --config javac

17.1.2. Instalando a Biblioteca libstdc++5

Nas primeiras tentativas para rodar o driver (Beta) do fabricante recebia mensagens de erro da biblioteca libNatUSB.so.

Usando o comando ldd pude verificar a falta da biblioteca libstdc++.so.5.

Mais tarde pude verificar que o fabricante já tinha avisado sobre isso no site www.oceanoptics.com/products/omnidriver.asp.

Dica

O comando ldd é muito útil para localizar as bibliotecas que algum programa precisa. Por exemplo, para descobrir quais bibliotecas o comando pwd utiliza basta rodar:

bash$  /usr/bin/ldd /bin/pwd
        linux-gate.so.1 =>  (0xb7efb000)
	libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7d8d000)
	/lib/ld-linux.so.2 (0xb7efc000)

E o ldd retorna uma lista com as bibliotecas presentes e ausentes.

A biblioteca que faltava foi instalada com o comando:

apt-get install libstdc++5

17.1.3. Para o udev reconhecer o novo dispositivo usb

Coloquei o arquivo 10-oceanoptics.rules para a pasta /etc/udev/rules.d e o sistema criou os respectivos links na pasta /dev para o driver poder acessar.

Depois de conectar o USB2000 na porta USB você pode visualizar todos os dispositivos usb com o comando:

bash$ ls -l /dev/usb*
crw-rw---- 1 root root 252, 34 Dez 29 09:11 /dev/usbdev3.3_ep00
crw-rw---- 1 root root 252, 30 Dez 29 09:11 /dev/usbdev3.3_ep02
crw-rw---- 1 root root 252, 32 Dez 29 09:11 /dev/usbdev3.3_ep07
crw-rw---- 1 root root 252, 31 Dez 29 09:11 /dev/usbdev3.3_ep82
crw-rw---- 1 root root 252, 33 Dez 29 09:11 /dev/usbdev3.3_ep87

Mas para identificar a qual dispositivo corresponde o USB2000 usei o comando udevadm (como root) pedindo informações sobre todos os dipositivos.

udevadm info -a -p $(udevadm info -q path -n /dev/usbdev3.3*)

...
ATTRS{manufacturer}=="USB2000 2.41.3 "
ATTRS{product}=="Ocean Optics USB2000"
...

O comando retorna muitas informações mas destaquei apenas as linhas que identificam o equipamento da Ocean Optics.

17.1.4. Usando o OmniDriver

Muito bem! Agora vamos mexer nos arquivos do pacote do OmniDriver, o driver desenvolvido em Java para Windows, Macintosh e Linux e fornecido pelo fabricante do USB2000.

Utilizamos a versão beta deste driver e fizemos apenas algumas modificações no arquivo PollingTest.class, um programa para teste do equipamento que faz parte do pacote.

Como eu não sei programar em Java tive que ler alguns tutoriais no site da Sun para fazer algumas pequenas mudanças no programa de testes do fabricante para usá-lo com uma interface desenvolvida em Tcl/Tk.

Aqui você pode baixar um arquivo zipado com os arquivos do OmniDriver (versão beta) e as modificações que fizemos, contendo os diretórios omnidrive e OOI_HOME.

OmniDriver_beta.tar.gz.

Conseguimos editar, compilar e rodar o programa exemplo PollingTest.java que estava dentro do arquivo OmniDriver.jar.

Primeiro criamos o diretório teste_omnidrive_jar e copiamos o arquivo OmniDriver.jar, que é um arquivo compactado o qual foi descompactado com o unzip.

O nosso objetivo foi utilizar os programas fornecidos pelo fabricante apenas para enviar as leituras do espectrofotômetro para o terminal e em seguida desenvolver uma interface com Tcl/Tk para automatizar esse processo e manipular as leituras para exibição em uma interface gráfica.

Para ter um exemplo de como isso pode ser feito veja o exemplo de um canal de comunicação de uma interface em Tcl/Tk com um executável Fortran no link: Tcl/Tk and FORTRAN

Fizemos algumas pequenas alterações no arquivo PollingTest.java para o envio das leituras de contagens do espectrofotômetro no terminal em um formato adequado e fizemos a compilação do mesmo com os comandos:

export CLASSPATH=../OOI_HOME/OmniDriver.jar:../OOI_HOME/SPAM.jar:../OOI_HOME/HighResTiming.jar:../OOI_HOME/UniUSB.jar:../OOI_HOME/OOIUtils.jar:../OOI_HOME/xpp3_min-1.1.3.4.M.jar:../OOI_HOME/xstream-1.1.2.jar

javac -classpath $CLASSPATH PollingTest.java

O arquivo PollingTest.class gerado foi copiado para o diretório: com/oceanoptics/tests

Novo arquivo OmniDriver.jar foi criado com o comando:

jar cvf OmniDriver.jar com/*

E finalmente colocamos o arquivo OmniDriver.jar na pasta OOI_HOME.

Editando o script test_Polling.sh observamos que é necessário incluir apenas 3 bibliotecas no CLASSPATH para rodar o script que ficou assim:

#!/bin/sh

JAVAHOME=/usr/lib/jvm/java-6-sun

CLASSPATH=../OOI_HOME/OmniDriver.jar:../OOI_HOME/SPAM.jar:../OOI_HOME/HighResTiming.jar:../OOI_HOME/UniUSB.jar

LIBRARY_PATH=../OOI_HOME

echo Executando PollingTest...

$JAVAHOME/bin/java -classpath $CLASSPATH -Djava.library.path=$LIBRARY_PATH com.oceanoptics.tests.PollingTest

echo Teste realizado