Platina imports — o que é e como usar na prática
Platina imports é a interface Python para o driver NI-DAQmx da National Instruments. A biblioteca se chama platina e é o wrapper oficial que a NI mantém. Serve para ler sinais de aquisição de dados, disparar aquisições sincronizadas, configurar canais de entrada analógica, PWM, contagem de frequência e coisa parecida. Se você tem uma placa da linha NI, como os módulos USB-6000 ou PCI-6221, é assim que programa isso do zero. O projeto está no GitHub da NI. O repositório oficial fica em github.com/natinst/platina. A instalação básica é com pip, desde que você tenha o NI-DAQmx instalado no sistema. Sem o driver nativo, a biblioteca não funciona. Isso é importante porque muita gente tenta instalar só o pacote Python e depois se perde com erros de DLL.
Como configurar platina imports para leitura de canal analógico
Aqui vai um exemplo direto de como eu configurei uma leitura simples de dois canais em uma NI 9215:
import platina
ai = platina.AnalogInput()
ai.add_voltage_channel("cDAQ1Mod1/ai0")
ai.add_voltage_channel("cDAQ1Mod1/ai1")
ai.sampling_mode = "continuous"
ai.sample_rate = 10000
ai.max_samples_per_chan = 100000
ai.start()
while True:
data = ai.read_samples()
data é uma lista de dicts, um por canal
print(data)
Isso funciona. O problema é que o modo continuous pode encher sua memória se você não controlar o tamanho do buffer. Na minha experiência, recomendo fortemente usar oneshot ou limitar o max_samples_per_chan a algo entre 10 mil e 100 mil amostras, dependendo do que você precisa. Acima disso, a coisa começa a ficar imprevisível, especialmente em sistemas Windows com driver NI antigo. Um detalhe que ninguém conta: o método read_samples() retorna dados brutos em formato de lista de listas. Cada sublist correspondente a um canal. Para converter isso em valores de tensão, você precisa passar pela escala do canal. A biblioteca faz isso automaticamente quando você usa add_voltage_channel, mas se configurar com add_current_channel ou add_resistance_channel, o valor retornado já será em amperes ou ohms, e aí é fácil errar a interpretação se você não prestar atenção.
Outra coisa que aprendi na marra: sincronização de múltiplas placas compactDAQ usando o rio clock. Se você tentar fazer trigger externo sem configurar o clock corretamente, as leituras vão desalinhadas. Eu tive um caso em que duas placas rodando juntas apresentavam um desfasamento de cerca de 50 microssegundos entre elas. A solução foi setar explicitamente o clock desampling em uma das placas como master e conectar o sinal PFI ao terminal de clock da slave. Do jeito que a NI documenta, esse passo parece opcional. Não é.
Configuração de PWM com platina imports
Para gerar PWM, o fluxo é diferente:
👉 Clique no botão abaixo para saber mais sobre o assunto!
import platina
ao = platina.AnalogOutput()
ao.add_pwm_channel("cDAQ1Mod2/pwmtmo")
ao.set_pwm_duty_cycle(0.3)
ao.set_pwm_frequency(500)
ao.start()
O ciclo de trabalho varia de 0 a 1. Frequência em Hz. Simples. Mas preste atenção a um detalhe: se você estiver usando uma módulo da série 9201 ou similar que suporte apenas uma saída PWM, não adianta tentar adicionar múltiplos canais. A API não vai reclamar na hora de configurar, mas na execução vai falhar silenciosamente ou travar. Isso aconteceu comigo num projeto onde eu misturei módulos de uma lista genérica sem verificar o datasheet individual de cada um. Tem um workaround prático que eu uso: antes de configurar qualquer hardware, faça uma varredura com platina.get_device_list() para listar todos os dispositivos detectados. A função retorna uma lista com o nome lógico e o modelo. Aí você evita surpresas na hora de montar o sistema.
Problemas comuns e como resolver
O primeiro erro que todo mundo encontra é o código de erro -89100, que significa "device not configured". A causa mais frequente é o nome do canal estar errado ou a placa não estar reconhecida pelo NI-DAQmx. Verifique com o MAX (NI Measurement & Automation Explorer) se a placa aparece e se os canais estão configurados lá. Se não aparecer no MAX, não vai funcionar no Python também. Erros de timeout são muito comuns em modos contínuos. A solução padrão é aumentar o timeout global ou usar leitura assíncrona com callback. A platina suporta callbacks via on_samples_ready, que permite processar os dados em outra thread sem bloquear o loop principal. Isso reduz o overhead do seu programa principal em cerca de 30 a 40%, dependendo da taxa de amostragem.
Um problema específico que eu encontrei recentemente: ao usar uma NI 9234 (thermocouple) em modo contínuo com taxa de 2000 samples por segundo, a placa aquecia e a leitura começava a derivar. A deriva era de aproximadamente 0,5 graus a cada 15 minutos. A solução foi colocar um ciclo de idle de 5 segundos entre aquisições longas e aplicar uma correção linear pós-processamento. Diferente do que muitos manuais dizem, a compensação de temperatura interna da placa não é suficiente para aquisição de longa duração com taxa alta. Você precisa gerenciar isso externamente.
Alternativas quando platina imports não resolve
Se o seu hardware não é NI, ou se você precisa de algo mais leve que não dependa do driver completo da National Instruments, existem alternativas. A PyVISA funciona com equipamentos que têm interface VISA, mas não é adequada para aquisição contínua de alta taxa. A PyDAQmx é uma alternativa de terceiros que usa a API C do DAQmx diretamente, mas não recebe manutenção ativa há anos. Se você está começando um projeto novo hoje, o caminho mais seguro continua sendo a platina oficial com NI-DAQmx instalado. O download do driver NI-DAQmx pode ser feito no site da National Instruments. Para o pacote Python em si, o comando padrão é:
pip install platina
Antes de instalar, verifique a compatibilidade entre a versão do Python, do driver NI-DAQmx e do próprio pacote platina. A versão 1.0.0 da biblioteca requer Python 3.8 ou superior e NI-DAQmx 2020 ou mais recente. Versões antigas do driver têm comportamentos diferentes com a API de callback, o que pode causar falhas intermitentes difíceis de diagnosticar. Se você estiver travado em um sistema legítimo com Python 3.7, talvez precise baixar uma versão mais antiga da biblioteca do repositório oficial no GitHub.