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をソースからビルドする必要がある。
- まずはビルド用ツールをシステムにインストール。
$ sudo apt-get install git cmake swig g++ python3-dev python3-setuptools
- 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
- 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ソフトウエア測定器としてだけではなく、幅広く活用出来そうだ。
コメント