テック技販 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 ドライバ
FTDI 公式の CDM ドライバをインストールします
(参考資料\制御ソフト\Usb Driver\CDM212364_Setup.exe、または
FTDI 公式サイト から最新版を入手)。
-
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
-
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で確認してください。 -
一般ユーザーで USB デバイスにアクセスするため、上記 udev ルールの
MODE="0666"を設定するか、sudo付きで実行してください。
pip install -r requirements.txtimport 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() のトリガヘッダを見ながら、トリガ前データをリングバッファに保持し、
トリガ後の指定サンプル数まで取得します。
now = device.get_now() # AD値 [12]
eng = device.ad_to_eng(now)| メソッド | 説明 |
|---|---|
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()による工学値変換後は実際の電圧と同じ符号・向きになります。
| メソッド | 説明 |
|---|---|
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 - 制御:
STARTSTOPEXTPRETRIGLEVELTRIG→<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 パススルーのレイテンシによりデータ欠けが発生する場合があります。