テック技販製 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 |
依存・パッケージ定義 |
- FTDI の D2XX ドライバをインストールする。
- 依存パッケージをインストールする。
pip install -r requirements.txtローカル開発用にインストールする場合:
pip install -e .- FTDI の libftd2xx を導入する。
pip install -r requirements.txt- 仮想 COM ポートのカーネルモジュールを解除する(D2XX と競合するため):
sudo rmmod ftdi_sio usbserialusbipd-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 軸力覚センサ(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。
主なメソッド(クラス 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