Skip to content

tecgihan/dss300-hr-python

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DSS300-HR (12CH AD) Python ライブラリ

テック技販 DSS300-HR (12CH AD) を Python から制御するためのライブラリです。 Windows と Ubuntu (Linux) の両方で動作します。

ファイル構成

ファイル 内容
dss300_hr.py メインのデバイス制御クラス
ftdi_comm.py FTDI D2XX USB 通信モジュール
packet_parser.py パケット解析・工学値変換モジュール
test_initial_connect.py 接続・デバイス情報表示テスト
test_measure.py 測定テスト(1000Hz、10秒)
test_now.py 現在値(NOW)取得テスト
test_ext_trig.py 外部トリガ(ソフトウェアトリガ)テスト
test_ext_trig_wait.py 外部トリガ(ハードウェアトリガ入力待ち)テスト
test_ext_trig_ttl.py TTLトリガテスト(neg 引数で負論理、トリガ信号をCHで同時取得・CSV保存)
test_pretrig_ttl.py プリトリガテスト(トリガ前データ取得・トリガヘッダ検証・CSV保存)
test_level_trig.py レベルトリガテスト(引数: CH番号 閾値V up/down、CSV保存)
test_ch_count.py 有効CH数設定テスト(1/6/12ch、測定データ形状確認)
test_20khz_matome.py 20kHz/12CH・任意まとめ数テスト(MATOME 1〜2000、測定データ形状確認)
test_conv_out.py 同期クロック出力設定テスト(IS_CONV_OUT_EN ON/OFF読み戻し確認)
test_external_clock.py 外部クロック測定テスト(スレーブモード、CONV_SYNC入力に同期)
test_stop_trig.py ストップトリガテスト(EXT待ち受け後、外部トリガ入力Highで測定開始、Lowで停止)
_check_device.py デバイス占有状態の診断ツール(他プロセスに掴まれていないかの確認)
requirements.txt 依存パッケージ

動作環境

  • Python 3.8 以降
  • Windows 10/11 または Ubuntu (Linux)
  • FTDI D2XX ドライバ

インストール

1. FTDI D2XX ドライバ

Windows

FTDI 公式の CDM ドライバをインストールします (参考資料\制御ソフト\Usb Driver\CDM212364_Setup.exe、または FTDI 公式サイト から最新版を入手)。

Ubuntu (Linux)

  1. FTDI 公式サイト から Linux 用 libftd2xx をダウンロードして展開し、ライブラリを配置します。

    tar xvf libftd2xx-x86_64-*.tgz
    cd linux-x86_64
    sudo cp libft4222.so* /usr/local/lib/ 2>/dev/null || true
    sudo cp libftd2xx.so* /usr/local/lib/
    sudo ldconfig
  2. Linux 標準の FTDI シリアルドライバ(ftdi_sio)が接続を横取りするため、 デバイス接続後に毎回アンロードするか、udev ルールで無効化します。

    # 一時的に解除する場合(デバイス接続後に実行)
    sudo rmmod ftdi_sio
    sudo rmmod usbserial
    # udev ルールで恒久対応する場合
    sudo tee /etc/udev/rules.d/99-dss300hr.rules << 'EOF'
    # DSS300-HR (12CH AD) : FTDI VID:PID=0403:6010 の例。lsusb で確認すること
    ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="0666", RUN+="/bin/sh -c 'echo -n $kernel:1.0 > /sys/bus/usb/drivers/ftdi_sio/unbind 2>/dev/null; echo -n $kernel:1.1 > /sys/bus/usb/drivers/ftdi_sio/unbind 2>/dev/null'"
    EOF
    sudo udevadm control --reload-rules

    ※ PID はデバイスにより異なる場合があります。lsusb で確認してください。

  3. 一般ユーザーで USB デバイスにアクセスするため、上記 udev ルールの MODE="0666" を設定するか、sudo 付きで実行してください。

2. Python パッケージ

pip install -r requirements.txt

使い方

基本的な測定

import time
from dss300_hr import Dss300Hr

device = Dss300Hr()

# 接続(デバイス名 "12CH AD" を自動検索)
if not device.connect():
    raise RuntimeError("接続失敗")

print(f"Serial: {device.info.serial}, Version: {device.info.version}")

# 測定周波数を設定(100/500/1000/5000/10000/20000 Hz)
# まとめ数は周波数の 1/10 に自動設定される
device.set_frequency(1000)

# 測定開始
device.start()

# データ取得(1まとめ分ずつ)
for _ in range(100):
    while device.data_count == 0:
        time.sleep(0.001)
    ad = device.get_data()              # AD値 [まとめ数, CH数]
    eng = device.ad_to_eng(ad)          # 工学値 (ad - ゼロ点) × アンプ校正値
    print(eng[-1])                      # 最新サンプルを表示

# 測定停止・切断
device.stop()
device.disconnect()

外部トリガ測定

device.ext()        # 外部トリガ待ち受けに移行
device.trig()       # ソフトウェアトリガ出力(ハードウェアトリガ入力でも開始する)
...                 # get_data() でデータ取得
device.stop()

プリトリガ測定

device.set_is_pretrig_enable(True)
device.pretrig()    # 測定しながらトリガ待ち受け
                    # トリガ前のデータも取得される
                    # (トリガ検出で status が MEASURE に変わる)
device.trig()       # ソフトウェアトリガ出力
...
device.stop()

純正サンプルアプリの「プリサンプリング件数」「ポストサンプリング件数」は デバイス設定ではなく、PC側の保存件数です。Pythonで同等動作にする場合は、 get_data_with_trig() のトリガヘッダを見ながら、トリガ前データをリングバッファに保持し、 トリガ後の指定サンプル数まで取得します。

現在値取得(Idle 状態、マスタのみ)

now = device.get_now()      # AD値 [12]
eng = device.ad_to_eng(now)

API 概要

Dss300Hr クラス

接続・切断

メソッド 説明
list_devices() DSS300-HR (12CH AD) デバイスの一覧を取得
connect() 接続して全パラメータを取得
disconnect() 切断

測定制御

メソッド 説明 使用可能な状態
start() 測定開始 IDLE
stop() 測定停止(IDLE に戻る) EXT/PRE_MEASURE/MEASURE/LEVEL
ext() 外部トリガ待ち受けに移行 IDLE
pretrig() 測定を開始した状態でトリガ待ち受けに移行 IDLE(プリトリガ有効時)
level() レベルトリガ待ち受けに移行 IDLE(Ver.1.3.0以降、マスタのみ)
trig() トリガ出力 EXT/PRE_MEASURE
get_now() 現在値を取得(AD値 [12]) IDLE(マスタのみ)

データ取得

メソッド/プロパティ 説明
data_count 取得済みデータ数(まとめ単位)
get_data() 測定データを1まとめ分取得 → AD値 [まとめ数, CH数]
get_data_with_time() 測定データと受信時刻のタプルを取得
get_data_with_trig() 測定データ・トリガヘッダ(2byte)・受信時刻のタプルを取得
discard_data() バッファ内の測定データをすべて破棄
ad_to_eng(ad) AD値を工学値に変換 (ad - zero_offset) × amp_prf

注意(アンプ極性): 本デバイスはアンプが反転型(アンプ校正値が負)のため、 正電圧の入力は生のAD値ではゼロ点より小さい値(下向き)として記録されます。 ad_to_eng() による工学値変換後は実際の電圧と同じ符号・向きになります。

パラメータ設定(すべて IDLE 状態のみ)

メソッド 説明
set_frequency(value) 測定周波数(100/500/1000/5000/10000/20000 Hz、まとめ数も自動設定)
set_matome(value) まとめ数(Ver.1.3.0以降: 1〜2000、それ以前: 10/50/100/500/1000/2000)
set_zero_offset(value, ch) ゼロ点(0〜65535、ch: 0〜11)
set_amp_prf(value, ch) アンプ校正値(ch: 0〜11)
set_ch_count(value) 有効CH数(1〜12、Ver.1.3.0以降)
set_id(value) デバイスID
set_serial(value) / set_revision(value) シリアル / レビジョン
set_is_stop_trig_enable(value) 外部トリガでの測定停止の有効/無効
set_is_pretrig_enable(value) プリトリガの有効/無効
set_is_ttl_enable(value) TTL の有効/無効(無効時は接点)
set_is_active_high(value) 正論理の有効/無効(無効時は負論理)
set_is_ttl_out_enable(value) TTL OUT の有効/無効(無効時は TTL IN)
set_level_threshold(value) レベルトリガ閾値(AD値で指定、0〜65535。電圧からの変換: AD値 = ゼロ点 + 電圧 / アンプ校正値
set_level_slope(value) レベルトリガ立ち上がり/立ち下がり(Slope入力電圧の方向で指定: RISE_EDGE=電圧上向き。実機検証済み)
set_level_ch(value) レベルトリガ選択CH(0〜11)
set_is_conv_out_enable(value) 同期クロック出力の有効/無効

状態取得

メソッド/プロパティ 説明
status ライブラリ側のステータス(DeviceStatus
info デバイス情報(DeviceInfo:シリアル、周波数、各種フラグ等)
calibration 校正パラメータ(ゼロ点・アンプ校正値)
ch_count 有効CH数(旧ファームウェアでは周波数から自動判定)
get_device_status() デバイスからステータスを取得(測定中は使用不可)
get_device_error() デバイスからエラーを取得(測定中は使用不可)
update_master_state() マスタ状態のポーリング

ステータス遷移

NO_DEVICE → INITIALIZE → IDLE ─┬─ start() ──────────────→ MEASURE ─ stop() → IDLE
                               ├─ ext() ────→ EXT ─ trig()/外部トリガ → MEASURE
                               ├─ pretrig() → PRE_MEASURE ─ trig()/外部トリガ → MEASURE
                               └─ level() ──→ LEVEL ─ レベル検出 → MEASURE

通信プロトコル仕様(参考)

  • トランスポート: FTDI D2XX、デバイス名 "12CH AD"(Description でオープン)。 レイテンシ 1ms、受信転送サイズ 64KB、送受信タイムアウト 1000ms。

  • コマンド: 改行(\n)終端のテキスト

    • 取得: GET_<ITEM><ITEM>_<値>(失敗時 GET_<ITEM>_NG
    • 設定: SET_<ITEM>_<値> / SET_<ITEM>_<CH>_<値>SET_<ITEM>_OK / _NG
    • 制御: START STOP EXT PRETRIG LEVEL TRIG<CMD>_OK / _NG
    • 現在値: NOW → 24byte のバイナリ(12ch × リトルエンディアン uint16)
  • 測定データパケット:

    [0xAA × 4] [トリガヘッダ 2byte] [AD値 CH数 × 2byte × まとめ数] [0x55 × 4]
    
    • AD値はリトルエンディアン符号なし 16bit
    • トリガヘッダ(リトルエンディアン uint16):
      • 0x0000 = トリガ未検出
      • 非ゼロ = トリガ検出。値はまとめ内のトリガ発生サンプル位置(1始まり) (実機検証済み。これにより1サンプル分解能でトリガ時刻を特定できる)
      • 0xCCCC = 外部トリガによる測定停止
  • 工学値変換: eng = (AD値 - ゼロ点[ch]) × アンプ校正値[ch]

トラブルシューティング

  • デバイスが見つからない (Windows): デバイスマネージャーで「USB Serial Converter」が表示されているか確認。 VCP (Virtual COM Port) モードが有効な場合は無効化してください (デバイスマネージャー → USB Serial Converter → 詳細設定 → 「VCP をロードする」のチェックを外す)。
  • デバイスが見つからない (Ubuntu): ftdi_sio がアタッチされていないか確認(lsmod | grep ftdi)。 アタッチされている場合は sudo rmmod ftdi_sio usbserial
  • 接続に失敗する(DEVICE_NOT_OPENED): FTDI デバイスは同時に1プロセスしかオープンできません。 他のアプリケーション(メーカー製制御ソフトや自作アプリ等)がデバイスを 使用中でないか確認してください。python _check_device.py で占有状態を診断できます。 プロセスを強制終了するとドライバにハンドルが残ることがあり、 その場合は USB ケーブルの抜き差しで復旧します。
  • パケット欠落が発生する: USB ハブを介さず PC に直結してください。仮想環境(VM)では USB パススルーのレイテンシによりデータ欠けが発生する場合があります。

About

Python library for Tec Gihan DSS300-HR / 12CH AD

Topics

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages