現在PDS5022SというOWON社製のデジタルストレージオシロスコープを使用しています.このオシロはとても廉価なことで有名で,Web上にも様々な情報があります.帯域は25MHzと高くはありませんが,趣味の電子工作で使うには十分な機能と性能を持っていてとても重宝しています.
このオシロはUSBでPCに接続することができて,付属のソフトウェアによりPC上で信号を表示できます.こちらのページで,このソフトウェアではlibusbというデバイスドライバを使っていることを知り,オシロの情報を取り込めるソフトを自作できないかと考えていたところ,既にowondumpというLinuxでこのオシロのデータを取り込むソフトがあることを知りました.以前から,libusbやGTK+などを勉強してみたいと思っていたこともあり,オシロからデータをリアルタイムに取り込んでフーリエ変換を行い周波数スペクトルを表示するプログラムなどを作成してみました.
手始めに,オシロから画面イメージや波形データを取り込むプログラムを作成しました.
このプログラムの行っていることはowondumpと基本的に同じで,オシロに付属のソフトウェアで"Get Data"をメニューから選んで実行するのと同じ結果が得られます.
PDS5022SがPCへデータを送るモードは2種類存在します.Bitmapモードでは画面の表示イメージをそのまま送り,Vectorモードではサンプリングされた波形データ(バイナリ)を送ります.DISPLAYというボタンを押して出てくるCarryを切り替えることによりモードを変更できます.
このプログラムは,
% owonsave.exe <filename>
として引数を1つ指定して起動すると,Bitmapモードの場合はその引数に".bmp"を付けたファイル名でビットマップを保存し,Vectorモードの場合は".bin"を付けたファイル名で波形データを保存します.ファイル名を指定せずに起動した場合は,カレントディレクトリに"owonsave"というファイル名でファイルを保存するので,デスクトップ上に実行ファイルを置いてマウスでダブルクリックして起動すれば,簡単にオシロの画面のスナップショットをとることができます.
このプログラムはOSやマシンアーキテクチャ(エンディアン)には依存していないはずで,Windows(MinGW)上とLinux(Debian lenny)上で動作確認をしています.Linuxの場合,何も設定しなくても,オシロをUSBで接続するとlsusbで表示されて制御することができました.
USBのタイムアウトの時間を十分大きくしておかないとエラーとなる場合があり,プログラムの作成時にはまりました.
オシロから波形データを連続して受け取り,リアルタイムでフーリエ変換(FFT)を行い周波数スペクトルを画面に表示します.オシロの波形をそのまま表示させることもできます.
実用性を考えたプログラムではなく実験的に作ってみただけのものなので,窓関数は矩形窓だけで,縦軸も横軸も線形スケールの表示のみです.
オシロをUSBで接続した状態で(上述のデータの転送モードはVectorモードにしておく),
% owonfft.exe
としてプログラムを実行すれば起動します.
ModeメニューのTimeとFrequencyで,それぞれ時間軸での表示か周波数軸での表示かを切り替えます.
このオシロは,時間軸のレンジによって取り込むことができるサンプル数が変わりますが,サンプル数が5,000のレンジにだけ対応しています.非対応のレンジでは,エラーメッセージがステータスバーに表示されます.
ちなみに,Vectorモードでオシロから送られてくるデータは符号付きの16bit整数(リトルエンディアン)で,この値の25がオシロの画面上の縦軸の1divに相当します(画面の一番下が-100で一番上が+100になります).またデータのフォーマットは,「OWON 製デジタルオシロスコープ PDS5022を買ってみた」や「owondump」に解析結果やプログラムのソースがあったので参考にさせていただきました.
GUIは,以前から興味があって使ってみたかったGTK+を初めて使ってみました.FFTはGSL (GNU Scientific Library)というライブラリに入っているものを利用しました.FFTの際にはデータ数を8192個にして変換を行っています.
このプログラムもOSやマシンアーキテクチャ(エンディアン)には依存していないはずで,Windows(MinGW)とLinux(Debian lenny)上で動作確認をしています.
表示例1(時間軸)
表示例1(周波数軸)
表示例2(時間軸)
表示例2(周波数軸)
プログラムの実行には,owonsaveの場合はlibusbが,owonfftの場合はそれに加えてさらにGTK+のランタイムライブラリが必要です.
Linuxの場合はパッケージをとってくるなりしてインストールして,Windowsの場合はlibusb-win32とWindows用のGTK+ランタイムライブラリをインストールすれば動きます.owonfftではGSLも使用していますが,Windows用の実行ファイルには静的にリンクしているのでランタイムライブラリは不要です.
プログラムをコンパイルする場合は,開発用のヘッダファイル等もインストールする必要があります.
Linuxの場合はやはりパッケージをインストールすれば簡単です.
WindowsでMinGW/Cygwinでコンパイルする場合は,llibusb-win32はインストールしたディレクトリにあるusb.hというヘッダファイルを/usr/local/includeなど適当なディレクトリに置きます.GTK+は,GTK+の配布サイトからAll-in-one bundlesというファイルをとってきて,/usr/local/gtkなどに展開して,/usr/local/gtk/binにPATHを通します.ただし,このGTK+に含まれるpkg-configの出力はそのままではCygwinで扱えなかったので,sedで変換しました(詳しくはMakefileを参照して下さい).GSLは,Gsl for WindowsのサイトからDeveloper filesをとってきて,その中身を/usr/local/includeや/usr/local/libに展開しました.
なお,Linuxでlibusbを使う場合,root権限がなければデバイスにアクセスできなかったので,
# echo 'ATTRS{idVendor}=="5345", ATTRS{idProduct}=="1234", MODE="0666"' > /etc/udev/rules.d/95-my.rules
とすることにより,誰でもオシロにアクセスできるように設定して使いました.