aptpod Advent Calendar 2021 9日目担当のハードウェア/OT製品Grの野本です。
ANALOG-USB InterfaceがIndustrial 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/ |
入力データの読み込みに利用 |
※ deviceX
のX
には項番が入ります
以降、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を起動します。
Device SelectionでANALOG-USB Interface(EP1-AG08A)を選択します。
デバイスを選択すると、各種設定項目が表示されます。 上記コマンドラインでの操作に相当する項目がメニューに表示されており、各種設定操作がGUI上で可能です。
Plot画面で取得したいチャンネルにチェックを付けて、キャプチャボタンを押すと波形が表示されます。
Plot TypeをFrequency Domainに変更すると、周波数解析が可能です。
ネットワーク経由で利用する
IIO Oscilloscopeはバックエンドにlibiioを利用しており、ローカルバックエンドだけでなく、ネットワークバックエンドでも利用することができます。*7
ローカルバックエンドは単一のアプリケーションしかデバイスにアクセスできませんが、ネットワークバックエンドは複数のアプリケーションからアクセスが可能です。
ネットワークバックエンドを利用する場合、ANALOG-USB Interfaceが接続されているLinuxマシンでiiod*8サーバーを起動する必要があります。
$ sudo iiod
次に、閲覧したいPC(今回はWindows10)でIIO Oscilloscopeを起動します。
Settings>接続メニューを選択してネットワーク上のIIOデバイスをスキャンし、接続ボタンを押下してサーバーに接続します。
以降は、ローカルバックエンドと同様の操作が可能です。
まとめ
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のインストールで同時にインストールされます。