Skip to content

tecgihan/dma-03-python

Repository files navigation

DMA-03B Python ライブラリ

テック技販製 3ch デジタルアンプ DMA-03B を Python から制御するためのライブラリです。 FTDI D2XX ドライバ経由で USB 通信を行い、既存のテック技販製 Python ライブラリ (forceplate-python / dss300-hr-python / dpa-06-python など)と同じ作法で利用できます。

主な機能

  • FTDI D2XX による接続(Description "DMA-03B" でオープン)
  • デバイス情報の読み取り(シリアル / バージョン / 周波数 / まとめ数)
  • システムステータス・エラーの取得
  • チャンネルごとの有効/無効設定(IS_CH_ENABLED
  • 現在値取得(NOW、生 ADC 値)
  • 測定制御(START / STOP / EXT / TRIG)とパケット解析(ヘッダ/フッタ検証)
  • 校正・出力パラメータの読み書き(ZERO / PRF / NPU / 干渉補正行列 ITF(3x3) / FS / OFFSET)
  • 測定周波数・まとめ数の設定
  • ゼロ調整(ZERO
  • ロボット用モード(16 進 ASCII ストリーム)
  • 工学値変換(eng = AD * FullScale / 32000)と CSV 保存

動作環境

  • Python 3.9 以上
  • OS: Windows(Linux / WSL2 も可。下記インストール参照)
  • 依存パッケージ: ftd2xx (>=1.3.3), numpy (>=1.20.0)
  • FTDI D2XX ドライバ(OS に別途インストールが必要)
  • 接続機器: テック技販製 DMA-03B(FW Ver.1.0.1 で確認)

ファイル構成

ファイル 説明
dma03.py メインクラス Dma03
ftdi_comm.py FTDI D2XX 通信ヘルパ
packet_parser.py NOW・測定パケット解析、ロボット16進解析、工学値変換
csv_utils.py CSV 保存ヘルパ
_check_device.py FTDI デバイス列挙/オープン診断
test_initial_connect.py 接続+デバイス情報読み取り
test_packet_parser.py パケット解析の単体テスト(実機不要)
test_measure.py START/STOP 短時間測定
test_ext_trig.py EXT 待ち受け+ソフトウェアトリガ測定
test_read_parameters.py ゼロ点・各種パラメータ・干渉補正行列の読み取り
test_set_frequency.py 周波数/まとめ数の設定(リードバック検証)
test_zero.py ゼロ調整
test_robot_mode.py ロボットモード測定
test_measure_csv.py 測定→工学値→CSV 保存
requirements.txt / pyproject.toml 依存・パッケージ定義

インストール

Windows

  1. FTDI の D2XX ドライバをインストールする。
  2. 依存パッケージをインストールする。
pip install -r requirements.txt

ローカル開発用にインストールする場合:

pip install -e .

Linux (Ubuntu/Debian)

  1. FTDI の libftd2xx を導入する。
  2. pip install -r requirements.txt
  3. 仮想 COM ポートのカーネルモジュールを解除する(D2XX と競合するため):
sudo rmmod ftdi_sio usbserial

WSL2

usbipd-win で USB デバイスを WSL2 へアタッチしてから上記 Linux 手順を実施する。

基本的な使い方

from dma03 import Dma03

dma = Dma03()
dma.connect()
try:
    print(dma.info)                 # シリアル/バージョン/周波数/まとめ数/有効ch など
    print(dma.get_now().tolist())   # 現在値(生 ADC 値、符号付き int16 × 有効ch)

    ad = dma.measure(num_packets=5)  # START → 5 パケット取得 → STOP
    eng = dma.ad_to_eng(ad)           # 工学値へ変換(FS / 32000)
    print(ad.shape, eng[0])
finally:
    dma.disconnect()

with 文にも対応しています。

with Dma03() as dma:
    print(dma.info)

値について

  • 測定パケットロボットモード出力 の値は、デバイス側で干渉補正・フルスケール 換算済みの符号付き 16bit 値です(±32000 がフルスケールに対応)。工学値は eng = AD * FullScale / 32000 で求まります。
  • NOW の値は 生 ADC 値(補正前)です。工学値換算(ad_to_eng)の対象は 測定パケット側であり、NOW には直接適用できない点に注意してください。
  • DMA-03B は チャンネルごとに有効/無効 を設定でき、NOW・測定・ロボット出力は いずれも 有効チャンネル分のみ が送られます(データ長が可変)。

チャンネル設定

3 つのチャンネル(CH1, CH2, CH3)は個別に有効/無効を切り替えられます。 無効チャンネルは測定・NOW・ロボット出力のいずれにも含まれません。

from dma03 import Dma03, Ch

with Dma03() as dma:
    # CH1, CH2 のみ有効化(CH3 を無効化)
    dma.set_is_ch_enabled(Ch.CH1, True)
    dma.set_is_ch_enabled(Ch.CH2, True)
    dma.set_is_ch_enabled(Ch.CH3, False)

    print(dma.get_is_ch_enabled())   # [True, True, False]
    print(dma.enabled_channels())    # [0, 1]

    ad = dma.measure(3)              # 列数は 2(有効ch分のみ)
    print(ad.shape)                  # (300, 2) など

有効チャンネルが 0 個のときは測定(START)が拒否されます。

センサ接続時の設定

新しい力覚センサ/ロードセルを DMA-03B に接続したら、そのセンサの検査成績書に 記載された値をアンプへ書き込みます。書き込んだ値はアンプの不揮発メモリに保存され、 次回以降も保持されます(設定は IDLE 状態 でのみ受け付けられます)。

力の演算に関わる主な設定は次のとおりです(チャンネルは 0 始まり)。

設定 内容 API
フルスケール FS 各出力チャンネルの定格容量(満点 = ±32000 に対応) set_fs(value, ch)
干渉補正行列 ITF 3×3 の干渉補正係数(行=出力ch, 列=入力ch) set_itf_matrix(matrix) / set_itf(value, item)
アンプセル値 PRF 入力チャンネル係数 set_prf(value, ch)
ロードセル感度 NPU 入力チャンネル感度 set_npu(value, ch)
D/A オフセット OFFSET アナログオフセット(0..255) set_offset(value, ch)

入力チャンネル感度(NPU) は、特別な理由がなければ 1 に設定します(set_npu(1, ch))。

例:3 軸力覚センサ USL06-H5-500N-E を接続

3 軸力覚センサ(Fx, Fy, Fz の 3 軸)を DMA-03B の 3 チャンネルに割り当てます。 検査成績書の 定格容量 をフルスケール(FS)に、行列係数(3×3) を干渉補正行列 (ITF)に書き込みます。

import numpy as np
from dma03 import Dma03, Ch

# --- 検査成績書「定格容量」(Fx, Fy, Fz)---
rated = [250, 250, 500]   # 例: N(実際の値は検査成績書から転記)

# --- 検査成績書「行列係数」3x3(行=出力ch, 列=入力ch)---
itf = np.array([
    [ 0.22376, -0.00631, -0.00480],
    [ 0.00311,  0.23149,  0.00403],
    [ 0.00099,  0.00425,  0.25989],
])  # 例(実際の値は検査成績書から転記)

with Dma03() as dma:
    # 必ず IDLE 状態で設定する
    for ch, fs in zip(Ch, rated):
        dma.set_fs(fs, ch)        # フルスケール(定格容量)
    dma.set_itf_matrix(itf)        # 干渉補正行列(3x3 を書き込み)

    # 読み戻して確認
    print("FS :", dma.get_fs())
    print("ITF:\n", dma.get_itf())

設定後はセンサを無負荷にして zero_and_wait() でゼロ調整を行い、 measure()ad_to_eng() で工学値(N など)が得られます。

個別要素だけを書き換えたい場合は set_itf(value, item)item = 出力ch * 3 + 入力ch、0〜8)、 読み取りは get_itf()(3×3 行列を返す)を使います。

動作確認

python _check_device.py          # FTDI から DMA-03B が見えるか
python test_packet_parser.py     # 実機不要のパケット解析テスト
python test_initial_connect.py   # 接続+デバイス情報
python test_measure.py --packets 5
python test_measure_csv.py --packets 5

ゼロ調整は現在の入力を基準にゼロ点を取り直します。

python test_zero.py            # ゼロ調整を実行

対応コマンド

  • 読み取り: STATUS, GET_SERIAL, GET_VERSION, GET_FREQUENCY, GET_MATOME, GET_ZERO, GET_PRF, GET_NPU, GET_ITF, GET_FS, GET_IS_CH_ENABLED, GET_OFFSET, GET_FOR_ROBOT, GET_ERROR, NOW
  • 制御: START, STOP, EXT, TRIG, ZERO
  • 設定: SET_SERIAL, SET_FREQUENCY, SET_MATOME, SET_PRF, SET_NPU, SET_ITF, SET_FS, SET_IS_CH_ENABLED, SET_OFFSET, SET_FOR_ROBOT

設定可能値: 周波数 = 10 / 50 / 100 / 500 / 1000 / 5000 / 10000 [Hz]、 まとめ数 = 1〜2000、D/A オフセット = 0〜255。

API リファレンス

主なメソッド(クラス Dma03)。詳細は各メソッドの docstring を参照。

分類 メソッド 説明
接続 list_devices() / connect() / disconnect() / is_open() デバイス列挙・接続・切断。with Dma03() as dma: も可
情報 get_status() / get_serial() / get_version() / get_frequency() / get_matome() / info ステータス・デバイス情報
ch設定 get_is_ch_enabled() / set_is_ch_enabled(ch, on) / enabled_channels() / enabled_ch_count() チャンネル有効/無効
現在値 get_now() 現在の生 ADC 値 (有効ch数,) int16
測定 start() / stop() / ext() / trig() 測定制御
測定 read_packet() / read_packets(n) / measure(n) パケット取得((まとめ数, 有効ch数) int16)
読み取り get_zero() / get_prf() / get_npu() / get_fs() / get_offset() / get_itf() 校正・出力・干渉補正の読み取り
設定 set_frequency() / set_matome() / set_prf() / set_npu() / set_fs() / set_offset() / set_itf(value,item) / set_itf_matrix(m) / set_serial() 各種設定(IDLE 時のみ)
ゼロ調整 zero() / zero_and_wait() ゼロ点を取り直す
ロボット get_for_robot() / set_for_robot() / get_robot_sample() / get_robot_samples(n) ロボット用モード
エラー get_error() / has_error() / clear_errors() デバイスエラーの確認・排出
変換 ad_to_eng(ad) AD 値 → 工学値(AD * FS / 32000

注意事項

  • 校正・干渉補正・出力設定などの SET_* 系は IDLE 状態のときのみ受け付けられる(測定中は拒否=SET_*_NG)。
  • STATUS はステータスとエラー番号の 2 値("<status>,<error>")を返し、応答時にエラーキューから 1 件を取り出す(消費する)。エラーキューを確実に読みたい場合は get_error() / clear_errors() を使う。
  • 測定値・ロボット出力は デバイス側で干渉補正・FS 換算済み(±32000 = フルスケール)。NOW生 ADC 値(補正前)。
  • 測定中はバイナリ/16 進ストリームと ASCII 応答が混在するため、設定の読み書きは測定停止(IDLE)後に行う。
  • 工学値は eng = AD * FS / 32000(満点は 32768 ではなく 32000)。

トラブルシューティング

  • デバイスが見つからない: D2XX ドライバ未導入、他アプリが占有、ケーブル等を確認。python _check_device.py で診断。Linux では sudo rmmod ftdi_sio usbserial
  • SET_*_NG で拒否される: ステータスが IDLE か、値・チャンネルが範囲内かを確認。
  • 測定が開始できない: 有効チャンネルが 0 個になっていないか get_is_ch_enabled() で確認する。
  • コンソールが文字化けする: 端末の文字コードの問題。set PYTHONUTF8=1(PowerShell は $env:PYTHONUTF8=1)で UTF-8 出力にする。

ライセンス

MIT License(LICENSE を参照)。

バージョン

0.1.0

About

Python library for the TEC GIHAN DMA-03B 3-channel digital amplifier (FTDI D2XX / USB)

Resources

License

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages