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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

8774閲覧

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

omiteratail

総合スコア19

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

3クリップ

投稿2018/11/02 07:15

前提・実現したいこと

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通信にての測定器制御を行いたいです。

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

tarou_yamada👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

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/08 23:51

編集2018/11/09 00:01
dinosauria123

総合スコア25

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

omiteratail

2018/11/12 02:17

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

0

ベストアンサー

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

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

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

python

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

投稿2018/11/02 09:41

編集2018/11/03 01:19
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

omiteratail

2018/11/02 15:37

scizormanさん ご返信ありがとうございます、とても参考になります!早速試してみたいと思います。 ただ、私自身勉強不足で通信のことがよく分かっておらず恐縮ですが、もう一つお伺いさせていただきたいです。 実はMacにて測定器を制御したいというのが本音なのですが、測定機器の企業がWindows用のUSBドライバしか提供していないため、しょうがなく、Windows10でやっているという現状です。 ただ、測定機器のシリアル番号がわかれば、専用のUSBドライバがなくても、pyserialを用いることでMacにて通信ができるようになるのでしょうか。 よろしくお願いします。
pepperleaf

2018/11/03 00:55

Windows7以降でも OKでしょうか? (USBの話) Pythonは、未確認ですが、Visual Studio C++ あたりだと、ダメだった記憶が。 (レジスタを色々と調べて対応) あっと、質問は Macの話でしたか。またちょっと違うかも。
退会済みユーザー

退会済みユーザー

2018/11/03 01:09

その装置について詳しく知らないのでなんとも言えませんが,少なくとも私の場合はドライバをインストールしなくても制御出来ました。(ちなみに Mac です) 装置のマニュアルはないのでしょうか? 恐らくリモート制御に関する項目があると思うので,それを見るのが一番確実だと思います。 >> pepperleaf さん Windows に関しては私はやったことないので,正確な事は言えません。 すみません...
omiteratail

2018/11/03 03:30

scizormanさん ありがとうございます! 今、Macのターミナルにて $ system_profiler SPUSBDataType を実行し、確認してみたのですが、目的の機器にそもそものSerial Numberが出てきません。 WindowsにおいてもSerial Numberが出てこないため、ないのだと思います。 SerialNumberがないケースを対処されたことはありますでしょうか。
pepperleaf

2018/11/03 04:15

Macって確か、Unixだったかと。 とすると、/dev の下にUSBデバイスが無いでしょうか? 検索かけたら、 /dev/ttyUSB0 とかの文字列が引っ掛かりましたが、そんなのあるでしょうか? もし、あれば、それらを オープンするとか。
退会済みユーザー

退会済みユーザー

2018/11/03 04:41

>> pepperleaf さん おっしゃる通りで,Mac の場合は /dev 以下に USB のシリアルナンバーがあります。 >> omiteratail さん /dev 以下にあるかどうか確認してみて頂けますか? 恐らく,tty.usbserial... とかそんな雰囲気のものがあるはずです。 パワープレーでやるなら,接続・非接続時の /dev 以下の ls の差分をとるとかですかね? もし見つかったら,回答のコードの port にそのシリアルナンバーのパスを指定してみてください。
omiteratail

2018/11/03 12:25 編集

>> pepperleaf さん ご回答ありがとうございます。大変助かります。月曜日に確認してみます! >> scizorman さん ご回答ありがとうございます。大変助かります。今朝/dev以下を確かめた際にttyで始まるファイルが多くあったので、よくわからなかったのですが、接続・非接続時のlsの差分は取っていなかったので、月曜日に確認してみます! 確認次第ここで報告させていただきますね!
omiteratail

2018/11/05 06:00

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

退会済みユーザー

2018/11/05 12:07

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

2018/11/05 14: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でのアクセスができず、製品名元にレジストリから、探しました。(最後は、ただの記号列..) 少しでもお役に立てば、と思いますが、手元に無いので、この辺が限界かと。
guest

0

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

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

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

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

投稿2019/09/27 05:20

omiteratail

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問