質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.59%

Pythonで測定器とUSB通信をしたい。

解決済

回答 3

投稿

  • 評価
  • クリップ 2
  • VIEW 11K+

omiteratail

score 19

 前提・実現したいこと

Windows10にて, Pythonを使ってF.W. Bell社の5180 Gauss/Tesla Meter(つまり、制御対象である測定器)とのUSB通信をPythonを用いて行いたいです。
具体的には、パソコンからPythonで測定器にコマンド(送るコマンドは"*IDN?"のようにすでに指定されています。)を送ることで、測定器に書いてある値をパソコンにて読み取りたいです。
測定器にはインターフェースとして、USB-mini-Bメスタイプがあり、ケーブルにてパソコンと接続いたしました。

https://fwbell.com/resources/software-downloads/
上のURLに専用のUSBドライバが配布されているため、ダウンロードし、その際に提供されているGUIを使うことで測定器の制御をPCからできたので、PCにて測定器自体は認識されているようです。

ここからやりたいのが、この測定器に対して、その提供されているGUIを使うのではなく、PythonからPySerial(かPyUSB?)などのライブラリを用いることでUSB通信を確立し、用意されているコマンド(*IDN?や*CLSなど。)を直接測定器に送信し、その返り値としてデータをPCで受け取りたいです。

 教えていただきたいこと。

・USB通信を行うためのPythonのライブラリとして何を使えばいいのか。
・そして、そのライブラリにて具体的にどういったコードを書くことで、USB通信を確立し、コマンドを送り、返り値として測定器の値を得られるのか。
・その際参考になるウェブサイトなど(英語でも構いません。)があれば教えていただきたいです。

 試したこと

イメージとしてはこのサイトみたいな感じです。
ただ、使うべき関数名などをどうやって知ったのかがわからないため、このサイトの通りに行えませんでした。

今回のガウスメーターではなく、別の測定器に対して、PythonのライブラリPyVISAを用いることで、GPIB-USB通信による制御はできました。今回は、純粋なUSB通信にての測定器制御を行いたいです。

インターネットで調べても文献があまり見つけられないため、こちらで質問させていただきました。
不明な点や分かりにくい点がありましたら、質問していただけるとありがたいです。よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

pyserial を使えば良いと思います。
私も似たようにシリアル通信を用いて測定機器等の制御を行っていますが,pyserial で特に問題なく動作しています。(Linux環境ですが...)

測定機器を制御PCに接続した際に,その測定機器のUSBシリアル番号が Windows でも調べられるはずです。
そのシリアル番号を用いて,以下の様にして通信できないでしょうか?

追記:2018/11/3
コードを少し修正しました。コマンドを送る際,文字列ではなくバイト列にしてください。

>>> import serial
>>> port = "xxxxx" # 調べたシリアル番号
>>> byte = 4096    # 適当なサイズ(読み出せる範囲で)
>>> ser = serial.Serial(port=port)
>>> ser.write(b"*IDN?\n")
>>> ret = ser.read(size=byte)
>>> print(ret)
# デバイスの応答がプリントされる
>>> ser.close()

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/05 15:00

    お世話になっております。

    macにて/dev以下を接続・非接続時でのls差分をとったのですが、両者に違いはなくなぜか全く同じでした。
    $ system_profiler SPUSBDataType
    上記コマンドで機器の認識がされているのは確認したので、機器がPCより認識されていないということはないのですが、それにもかかわらず/dev以下には変化が確認できませんでした。
    また、dev以下にはttyで始まるファイルは多くあるのですが、
    特にttyUSB0やtty.usbserialなどの類のものはなく、一番近くてttys000でしたが、こちらも接続はできませんでした。
    完全に行き詰ってしまいました。何かアイデアなどがございましたら、いただけるととてもありがたいです。
    よろしくお願いします。

    キャンセル

  • 2018/11/05 21:07

    うーん,そうなるともしかしたらドライバが必要なのかもしれませんね。
    前も言ったかもしれませんが,マニュアルはありますか?
    あるなら,間違いなくリモート制御について書かれた欄があるはずなので,そこを見るのが確実です。

    また本筋と外れますが,装置にLAN port があるなら socket 通信を試みるのもありかもしれませんね。

    キャンセル

  • 2018/11/05 23:33

    > $ system_profiler SPUSBDataType
    で検出できるという事は、Macが認識しているという事ですね。その中に ポート番号とかないでしょうか?
    Macはほとんど、使ったことが無いので、検索してみると、 "Parsing Mac OS X's `system_profiler` for USB information is a blunderbuss."<https://github.com/arduino/Arduino/issues/4230> /dev 以下に、 "usb" を含んだデバイス名があるようですが。 或いは、VenderID, ProductIDから、参照名を作る?

    ちなみに、Windows7以降は、USBxxでのアクセスができず、製品名元にレジストリから、探しました。(最後は、ただの記号列..)

    少しでもお役に立てば、と思いますが、手元に無いので、この辺が限界かと。

    キャンセル

+1

こんなコードを使ってみてはどうでしょうか。

import serial.tools.list_ports

        try:
            ser = serial.Serial(port=list(serial.tools.list_ports.grep("1A86:7523"))[0][0], 
                baudrate=115200, timeout=0.5)
        except IndexError:
                QMessageBox.information(self,"Message","No Serial Connection")
                sys.exit()

ここから頂いてきたものですが、Macで動きました。エラーが出なければUSB機器が検出できています。

https://qiita.com/usop4/items/9abfa1a4b6bf66a5f8fa

1A86:7523というのは、USB機器のpid,vidです。これをご使用の機器のpid,vidにすればUSB機器が検出できるかもしれません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/12 11:17

    ありがとうございます。
    ターミナルにて、
    $ system_profiler SPUSBDataType
    では検出されるのですが、serial.tools.list_portsでは検出されませんでした。

    キャンセル

0

こちらの件解決したので、閲覧されている方々のためにも解決方法を残しておきます。
解決方法は単純で、配布されているdllファイル(測定器用ドライバ)をctypesで読み込んでSCPIコマンドを叩きました。参考にしたサイトは上記質問欄にも載せていますが、このサイトです。

ここでハマったのはwindllで読み込んでいるところです。
私はwindllではなく、cdllを使うことで無事読み込むことができ、コマンドを叩くことができました。
詳しくは調べていないのでわからないのですが、配布されていたファイルがc言語用のdllファイルであったためcdllで読み込まなければならなかったということだと勝手に思い込んでおります。

それとこれは当たり前ですが、一応見落としかねないので言及しておくと、使っている環境が32-bitなのか64-bitなのかはちゃんと確認して、それにあったドライバを使う必要がありますのでご注意ください。

以上です。回答していただいた方々、改めてありがとうございました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る