aptpod Tech Blog

株式会社アプトポッドのテクノロジーブログです

Linuxでアナログデータ扱うためにEDGEPLANT ANALOG-USB Interfaceを利用する

f:id:aptpod-tetsu:20211206171325j:plain aptpod Advent Calendar 2021 9日目担当のハードウェア/OT製品Grの野本です。

ANALOG-USB InterfaceIndustrial I/Oに対応し、アナログデータを簡単に取り扱えるようになりましたのでご紹介します*1

はじめに

弊社のインターフェイス周辺機器EDGEPLANT Peripheralsは、これまでintdash Appliancesに付属する形としてのみ提供していました。

より幅広いお客様にお使いいただけるよう、USB-CAN InterfaceではLinuxのオープンソース CANドライバであるSocket CANに対応*2しましたが、ANALOG-USB InterfaceにおいてもLinux標準インターフェイスであるIndustrial I/Oに対応しました。

この対応で、より簡単にアナログデータを扱うことができるようになるほか、オープンソースのオシロスコープアプリケーションであるIIO Oscilloscopeを利用した表示&解析処理が可能になりました。*3

Industrial I/Oとは

Industrial I/Oとは、ADC(アナログ-デジタルコンバーター)やDAC(デジタル-アナログコンバーター)といったデバイスをサポートするためのLinux kernelのサブシステムです。以下のようなセンサーデバイスを操作するアプリケーションの標準インターフェイスを提供しています。

  • ADC/DAC
  • 加速度センサー
  • ジャイロセンサー
  • 色/光センサー
  • 磁界センサー
  • 圧力センサー
  • 近接センサー
  • 温度センサー

Industrial I/O インターフェイスの操作方法

Industrial I/Oには、2種類のインターフェイスがあります。

インターフェイス 用途
/sys/bus/iio/iio:deviceX/ 設定変更および確認のために利用
/dev/iio:deviceX/ 入力データの読み込みに利用

deviceXXには項番が入ります

以降、ANALOG-USB Interfaceでの利用例を説明します。

サンプリング周波数を設定する

10000[Hz]に設定する場合、以下のコマンドを実行します。

$ echo 10000.0 > /sys/bus/iio/devices/iio\:deviceX/in_voltage_sampling_frequency

設定可能なサンプリング周波数は以下のコマンドで確認できます。

$ cat /sys/bus/iio/devices/iio\:deviceX/in_voltage_sampling_frequency_available
10000.0 5000.0 2500.0 1250.0 625.0 312.5 156.25 10.0 1.0 0.1 0.01
入力電圧範囲を設定する

チャンネル0の入力電圧範囲を「max: 10V、min: -10V」(+-10V)に設定する場合、以下のコマンドを実行します。

$ echo pm10v > /sys/bus/iio/devices/iio\:deviceX/in_voltage0_range

設定可能な入力電圧範囲は以下のコマンドで確認できます。*4

$ cat /sys/bus/iio/devices/iio\:deviceX/in_voltage_range_available 
pm10v pm5v
入力チャンネルを設定する

チャンネル0~7を有効化する場合、以下のコマンドを実行します。

$ echo 1 > /sys/bus/iio/devices/iio\:deviceX/scan_elements/in_voltage0_en
$ echo 1 > /sys/bus/iio/devices/iio\:deviceX/scan_elements/in_voltage1_en
$ echo 1 > /sys/bus/iio/devices/iio\:deviceX/scan_elements/in_voltage2_en
$ echo 1 > /sys/bus/iio/devices/iio\:deviceX/scan_elements/in_voltage3_en
$ echo 1 > /sys/bus/iio/devices/iio\:deviceX/scan_elements/in_voltage4_en
$ echo 1 > /sys/bus/iio/devices/iio\:deviceX/scan_elements/in_voltage5_en
$ echo 1 > /sys/bus/iio/devices/iio\:deviceX/scan_elements/in_voltage6_en
$ echo 1 > /sys/bus/iio/devices/iio\:deviceX/scan_elements/in_voltage7_en
タイムスタンプ出力を設定する

タイムスタンプ出力を有効化する場合、以下のコマンドを実行します。*5

$ echo 1 > /sys/bus/iio/devices/iio\:deviceX/scan_elements/in_timestamp_en
バッファサイズを設定する

バッファに保存するサンプル数を100個に設定する場合、以下のコマンドを実行します。*6

$ echo 100 > /sys/bus/iio/devices/iio\:deviceX/buffer/length
アナログ入力を開始する

enableに1を書き込むと、/dev/iio:deviceXのバッファへのアナログデータの入力が開始されます。

$ echo 1 > /sys/bus/iio/devices/iio\:deviceX/buffer/enable
アナログ入力データを取得する

アナログ入力データ(CH0-7有効、タイムスタンプ有効)を取得する例です。以下のコマンドを実行すると、1サンプルとして16bitのデータx8個が取得されます。

$ cat /dev/iio\:deviceX | xxd -
00000000: 1111 2222 3333 4444 5555 6666 7777 8888
00000010: TTTT TTTT TTTT TTTT 1111 2222 3333 4444
00000020: 5555 6666 7777 8888 TTTT TTTT TTTT TTTT
...
# 1111: 0chのデータ(16bit)
# 2222: 1chのデータ(16bit)、以下他チャンネルも同様
# TTTT: タイムスタンプ(64bit)
アナログ入力を停止する

enableに0を書き込むと、/dev/iio:deviceXのバッファへのアナログデータの入力が停止されます。

$ echo 0 > /sys/bus/iio/devices/iio\:deviceX/buffer/enable
設定内容を確認する

上記の設定内容は、catコマンドで現在の設定値を確認することができます。

以下に、デフォルト設定の出力を示します。

# サンプリング周波数
$ cat /sys/bus/iio/devices/iio\:deviceX/in_voltage_sampling_frequency
10.0
#  入力電圧範囲
$ cat /sys/bus/iio/devices/iio\:deviceX/in_voltage*_range
pm10v
pm10v
pm10v
pm10v
pm10v
pm10v
pm10v
pm10v
# 入力チャンネルの有効化設定
$ cat /sys/bus/iio/devices/iio\:deviceX/scan_elements/in_voltage*_en
0
0
0
0
0
0
0
0
# タイムスタンプ出力
$ cat /sys/bus/iio/devices/iio\:deviceX/scan_elements/in_timestamp_en
0
# バッファサイズ
$ sudo cat /sys/bus/iio/devices/iio\:deviceX/buffer/length
2

以上のように、sysfsによる操作で簡単にアナログ入力の設定やデータ取得が可能とりました。

IIO Oscilloscopeの操作方法

IIO Oscilloscopeは、Analog devicesによるIndustrial I/Oに対応したオープンソースの波形測定・解析ツールです。

クロスプラットフォームに対応しており、Windows/Linux/Macをサポートしています。インストール方法はこちらをご参照ください。

アナログ入力波形を表示・解析する

EDGEPLANT T1にANALOG-USB Interfaceを接続した環境での操作例を説明します。

IIO Oscilloscopeを起動します。

f:id:aptpod_tech-writer:20211206110955p:plain
IIO Oscilloscope起動画面

Device SelectionでANALOG-USB Interface(EP1-AG08A)を選択します。

f:id:aptpod_tech-writer:20211206111232p:plain

デバイスを選択すると、各種設定項目が表示されます。 上記コマンドラインでの操作に相当する項目がメニューに表示されており、各種設定操作がGUI上で可能です。

f:id:aptpod_tech-writer:20211206111556p:plain

Plot画面で取得したいチャンネルにチェックを付けて、キャプチャボタンを押すと波形が表示されます。

f:id:aptpod_tech-writer:20211206121830p:plain
例:サイン波(5[V]、100[Hz])

Plot TypeをFrequency Domainに変更すると、周波数解析が可能です。

f:id:aptpod_tech-writer:20211206122511p:plain
例:サイン波(100[Hz])の周波数解析

ネットワーク経由で利用する

IIO Oscilloscopeはバックエンドにlibiioを利用しており、ローカルバックエンドだけでなく、ネットワークバックエンドでも利用することができます。*7

ローカルバックエンドは単一のアプリケーションしかデバイスにアクセスできませんが、ネットワークバックエンドは複数のアプリケーションからアクセスが可能です。

f:id:aptpod_tech-writer:20211206123356p:plain
画像:https://wiki.analog.com/resources/tools-software/linux-software/libiio

ネットワークバックエンドを利用する場合、ANALOG-USB Interfaceが接続されているLinuxマシンでiiod*8サーバーを起動する必要があります。

$ sudo iiod

次に、閲覧したいPC(今回はWindows10)でIIO Oscilloscopeを起動します。

Settings>接続メニューを選択してネットワーク上のIIOデバイスをスキャンし、接続ボタンを押下してサーバーに接続します。

f:id:aptpod_tech-writer:20211206140331p:plain

以降は、ローカルバックエンドと同様の操作が可能です。

f:id:aptpod_tech-writer:20211206140937p:plain

まとめ

ANALOG-USB InterfaceがLinux標準インターフェイスであるIndustrial I/Oに対応したことをご紹介しました。

弊社のインターフェイス周辺機器EDGEPLANT Peripheralsは、より幅広いお客様にお使いいただけるよう様々な対応を予定しておりますので、今後の続報にご期待ください。

弊社製品にご興味がありましたら、お気軽にこちらよりお問い合わせください。

以上、お読みいただきありがとうございました。

*1:Industrial I/O対応のドライバはGitHubにて順次公開予定です。

*2:https://tech.aptpod.co.jp/entry/2021/06/18/100000

*3:IIO Oscilloscopeだけでなく、libiioなどのIndustrial I/Oのインターフェイスに対応したライブラリ/アプリケーションから利用可能になります。

*4:Industrial I/Oによるインターフェイスでは、入力電圧範囲「max: 5V、min: 0V」(+5V)の設定をサポートしていません。+5Vの設定を利用する場合はシステムコールによるインターフェイスを利用してください。

*5:タイムスタンプ出力を有効化した場合、サンプル毎のアナログ入力データの末尾にタイムスタンプ(単位はナノ秒)がs64_t型で格納されます。

*6:バッファに保存するサンプル数です、バイト数ではありません。 バッファ内のサンプル数が設定値を超えた場合、バッファへの新しいデータの書き込みは行われず、バッファ内の古いデータが保持されます。取りこぼし無くデータを取得し続けたい場合は、余裕を持った値を設定し、バッファが一杯になる前にバッファからデータを読み出す必要があります。

*7:ネットワークバックエンドを利用する場合は、iiodサーバーとしてLinuxマシンが必要です。

*8:iiodはlibiioのインストールで同時にインストールされます。