ADALM2000をPythonプログラムから使う

ADALM2000はアナログデバイセズ社が学生の学習やホビー用途向けに開発したUSB接続の測定器。

ADALM2000にはPythonインタフェースライブラリlibm2kが用意されており、API仕様が公開されている。libm2kを使うと自作のPythonプログラムからADALM2000を制御して測定データを取得する事など色々出来る。

今回はlibm2k付属のPythonサンプルプログラムからADALM2000を動かす実験をしてみた。

スポンサーリンク

libm2kのインストール

libm2kは主にC++をターゲットとしているが、PythoやC#にも対応している。以下、Windows10とUbuntu18.04についてインストール方法のメモ。
その他プラットフォームのインストール方法についてはlibm2kの解説ページを参照。

Windows10

まずはPython本家のダウンロードページからPythonのバイナリをダウンロードしてインストールする。インストール方法はこちらのページに解説がある。

libm2kのインストーラ(libm2k-system-setup.exe)をダウンロードして実行。インストールの途中「追加タスクの選択」で”Install libm2k Python-3.x buildings”という項目にチェックが入っていることを確認すること。ここで表示されるlibm2kのPythonのバージョン(現時点では3.7)とWindowsにインストールしたPythonのバージョンが合っていないとDLLのロードに失敗するなど不具合が出るため、もし上記でインストールしたPythonのバージョンが違う場合はPythonのインストールをやり直す。

Ubuntu18.04

Linuxではlibm2kをソースからビルドする必要がある。

  1. まずはビルド用ツールをシステムにインストール。
$ sudo apt-get install git cmake swig g++ python3-dev python3-setuptools
  1. libiioのインストール。libiioとはAnalog Devices社が開発したLinux用のI/Oインタフェースとのこと。libiioがlibserialport0を使っているため、それもインストール。
$ sudo apt install libserialport0
$ wget http://swdownloads.analog.com/cse/travis_builds/master_latest_libiio-ubuntu-18.04-amd64.deb
$ sudo dpkg -i master_latest_libiio-ubuntu-18.04-amd64.deb 

  1. libm2kのビルドとインストール(libm2kのWikiに書かれた通りだが再掲)
$ git clone https://github.com/analogdevicesinc/libm2k.git
$ cd libm2k
$ mkdir build
$ cd build
$ cmake -DENABLE_EXCEPTIONS=TRUE ../
$ make
$ sudo make install

Pythonサンプルプログラムを動かしてみる

libm2kのPythonサンプルプログラムはAnalog Devices社管理のgithubリポジトリに置かれている。Linuxではlibm2kをビルドするためにgit cloneでダウンロードしたソースの中に既に含まれており、libm2k/bindings/python/examplesの下にファイルがある。

Linuxでは一般ユーザー権限でOKだが、Windowsだと何故か管理者権限が必要なのでコマンドプロンプトもしくはWindows PowerShellを「管理者として実行」する必要がある。

以下、Windows10上で管理者権限のWindows PowerShellから実行した結果。

voltmeter.py: 電圧計

このプログラムは短いのでリストを掲載する。ainオブジェクト(Analog In?)を生成し、15行目で電圧を取得して表示している。

# This example reads the analog voltage from channel 0 of the analog input

import libm2k as l

channel = 0

ctx=l.m2kOpen()
if ctx is None:
        print("Connection Error: No ADALM2000 device available/connected to your PC.")
        exit(1)

ctx.calibrateADC()
ain=ctx.getAnalogIn()
ain.enableChannel(channel,True)
print(ain.getVoltage()[channel])


l.contextClose(ctx)

1+端子と1-端子の間に電池ボックス(単3エネループ×2)を接続して実行したら、テスターの測定値と同じ電圧がちゃんと表示された。

> python voltmeter.py
2.637880748016855

analog.py: アナログブロックのサンプルプログラム

analog.pyは測定信号をDACから出力して、ADCからキャプチャした信号をプロットするプログラムだ。

実行にはグラフをプロットするためのPythonモジュールmatplotlibが必要なため、予めインストールしておく。

> pip install matplotlib

以下の表のようにADALM2000の端子同士を配線する。

入力端子接続先
1+W1
1-GND
2+W2
2-GND

配線したら以下を実行。

> python analog.py

すると以下のようなグラフが表示される。
グラフを閉じると次の測定がされ、10回繰り返される。

ソースコードを覗いてみるとこのこぎり波とsin波はPythonプログラム中で生成されており、サンプリング周波数750kHzでW1,W2からD/A変換出力され、サンプリング周波数100kHzで1+,2+からA/D変換入力されてグラフにプロットしている。

digital.py: デジタルブロックのサンプルプログラム

デジタルブロックのサンプルプログラムはdigital.pyだ。実行結果などは省略するが、

  • 4bitのバイナリカウンタを構成
  • デジタルI/Oの0〜3chから4bit信号を出力

という事をやっている。デジタルI/Oの0〜3chに抵抗を挟んでLEDを接続してみたが、そのまま実行するとサンプリング周波数が10kHzなので速すぎてずっと点灯しているように見えてしまう。プログラムを編集してサンプリング周波数を100Hz位に落とせば、カウントの様子が確認出来た。

まとめ

libm2kをインストールし、Pythonプログラムから実際にADALM2000をコントロールして測定などを行ってみたところ、PythonプログラムからADALM2000のハードウエア制御やデータキャプチャが簡単に出来ることが判った。

付属ソフトのScopyはオシロやFFTアナライザとして普通に使えるし使い勝手も悪くないが、自分でPythonプログラムを書けばどんな測定も出来ちゃいそうだ。その気になればRFアンプと繋げてSDR化も行けそうな気がする、と思ったら…GNU Radioのページに実際にそれをやったという記事を発見。

ADALM2000はただのPCソフトウエア測定器としてだけではなく、幅広く活用出来そうだ。

コメント