どんぶらアニマル さんぽ道

CBR250RR(MC22)とNSR80(HCO6)とAPE50(AC16)を中心とした備忘録。

arduinoを使ったGP-IBアダプタでpython使ってリモートワーク

simulinkのモデルを(比較的)簡単にFPGA化してHILを実現する自社製品のPCアプリをテストするのにFPGA化したモデルに様々な信号を与えなければならなくて、それを手作業で何度もやりたくなかった。今後のリグレッションテストでも繰り返すことになるかと思うとうんざり。

 
テスト対象の装置は会社に置いてあるが、自宅からリモートでやりたい。ファンクションジェネレータ以外の環境は会社に行かなくてもリモートでやっつけられるようにしてあるのでファンクションジェネレータもリモートでやっつけたい。
 
と言うことで、PCからファンクションジェネレータを制御できるようにUSB BP-IB変換を作った。といっても外人さんが作ってくれてるものを真似ただけ。
 
ARDUINO UNO USB to GPIB controller

 

用意するもの

・arduino uno
・アンフェノール コネクタ 24ピン
・適当なケース
 

作成

参考にしたのはイタリアのEmanuele Girlandoさんのブログ。
 
この通りに作るだけ。
 
コネクタのピン配とarduinoのピンの対応を1枚の紙に書いておいた方が配線が楽なので、Emanuele Girlandoさんのwebサイトを自動翻訳したコメントをコネクタの図に張り付けて、この紙一枚見れば配線できるように準備。
ARDUINO UNO USB to GPIB 結線図
2023/12/06 追記

久々に上の紙を見てもすぐには読み方を思い出せなかったので表に書き直した。

GPIB信号名 アンフェノール ピンNo. arduino ピン名 メモ
DIO1 1 A0  
DIO2 2 A1  
DIO3 3 A2  
DIO4 4 A3  
EOI(24) 5 12  
DAV 6 11  
NRFD 7 10  
NDAC 8 9  
IFC 9 8  
SRQ 10 GND  
ATN 11 7  
shield 12 未接続  
DIO5 13 A4  
DIO6 14 A5  
DIO7 15 4  
DIO8 16 5  
REN(24) 17 GND  
GND(6) 18 GND  
GND(7) 19 GND  
GND(8) 20 GND  
GND(9) 21 GND  
GND(10) 22 GND  
GND(11) 23 GND  
GND Logic 24 GND  
 
 
■20cmくらいの線を緑6本、白と青5本、黒1本、黄いろ1本作成
まとめて被覆剥いて予備はんだしておいた。
 
■GPIBコネクタに線をはんだ付け
1ピン側の列。マジックで黒丸を付けてあるところがアンフェノールの1ピンの位置。
ARDUINO UNO USB to GPIB ケーブル

13ピン側の列。
ARDUINO UNO USB to GPIB ケーブル2
 
■unoにヘッダを挿して、GPIBの1ピンから順番にソケットにはんだ付け
unoにはヘッダが立っているのでソケットを指す。(多分やらないと思うけど)もしヘッダに直接はんだ付けする場合はコネクタのケースを通してはんだ付けする)
 
こっち側のソケット。
ARDUINO UNO USB to GPIB 配線
 
あっち側のソケット。
ARDUINO UNO USB to GPIB 配線2
 
■コネクタのケースを通して、テープを巻き巻き
ソケットをarduinoから外してケースに通す。通しにくいけど、ケースを通してはんだ付けする方が面倒なので後から通した。
ケースの穴のサイズに合わせてテープをグルグル巻き。
ARDUINO UNO USB to GPIBケーブルカバー
 
■ヘッダをarduinoに挿してグルーで固める
いきなりケースに入ってるけど、ケースに入れる前にグルーで固めた。
ARDUINO UNO USB to GPIBケース

 

ケースはセリアにちょうどいいのがあったので買い占めてきた。
ケーブル側はドリルで穴を開けて、ホットナイフで上に切り込みを入れた、この切れ込みからケーブルを通す。
ARDUINO UNO USB to GPIBケース2

 

USBコネクタ側は写真撮り忘れた。リモート先にあるので撮れない。ホットナイフで四角く大きめに穴を開けた。雑。。。

arduinoでgpibのケース

 
ちなみにarduino nanoも同じ配線、ファームで動くことが確認できた。アンフェノールのコネクタのケースを付けずに使うときは機器との接続に注意。上下逆でも刺さってしまうので。
 

動作確認

とりあえずteratermで。

シリアルは115.2kbps、8N1。
ARDUINO UNO USB to GPIB設定
 

ターミナルは改行をLF、ローカルエコー有効。

ARDUINO UNO USB to GPIB設定2
 

HP 3478A マルチメータ

■機器側(HP 3478A)のアドレスを調べる
SHIFT→SRQ(ADDR)
で表示される。
7だった。
 
■ardunoにアドレスをセット
++addr 7
セットすると7が返ってくる。
 
++addr
とやるとセットされているアドレスが返って来る。
デフォルトは2みたい。
 
■機器の画面に文字を表示する。
D2HELLO
パネルに「HELLO」が表示される。
小文字は使えない。
 
D21234567890
パネルに「1234567890」が表示される。
 
■電圧を測定して値を取得する
> F2RAZIN4
> H1
 
> ++read
/0.50350E+0
 
読めた。
 
■デバッグ
++verbose
でコントローラが詳細モードになる。
 

HP 3325A シグナルジェネレータ

■機器側(HP 3325A)のアドレスを調べる
SHIFT(青ボタン)→LOCAL(BUS ADDR)で表示される。
17だった。
 
■HP 3325Aのコマンド
こんなコマンド体系。
HP 3325Aコマンド一覧
 
■ardunoにアドレスをセット
なんとなく詳細モードに切り替える。
++verbose
 
アドレスをセット。
> ++addr 17
 
■波形の切り替え
サイン波に切り替える。
> FU1
 
矩形波に切り替える。
> FU2
 
■周波数を設定
周波数を1HZに。
> FR1HZ
 
0.5Hzに
> FR0.5HZ
 
10Khzに。
> FR10KH
 
■電圧オフセットを設定
オフセットを1Vに。
> OF1VO
 
一通り動いた。
 

YOKOGAWA DL1200

結論から書くと、マニュアルがなく、コマンドがわからず敗退。
 
■機器側(YOKOGAWA DL1200)のアドレスを調べる
MISC→F1(COMM)
F1が「T-ONLY」の場合は、F1を押す。
Term.をLFに変更。
10だった
 
■通信確認
ZでREMOTE LEDが点灯
 
下記でオシロ側では初期化が始まるが、ターミナルにはack無しのエラー。
> ++clr
gpibWrite: timeout waiting NDAC
gpibSDC: gpib SDC (0x04) write failed
clr_h: sendGPIB_Acmd failed
 
■DL1200側にエラーの表示が出る。
 
200 invalid commandみたいなエラーだったが忘れた。オシロは会社にあるのでここからは見れない。
 
ファームの
// #define DEBUG_BUILD
// #define DEEP_DEBUG_BUILD 
を有効にして、gpibWriteにウェイトを追加した。
 
++addr 10
++eos 2
++clr
 
sending data:0x2A(*) W1 W2 W3 W4 W5 - Done
sending data:0x4() W1 W2 W3gpibWrite: timeout waiting NDAC
gpibSDC: gpib SDC (0x04) write failed
clr_h: sendGPIB_Acmd failed
 
下記ウェイトを200から1000に変更
  // if (Wait_level_on_pin(HIGH,NDAC,htimeout))  { 
  if (Wait_level_on_pin(HIGH,NDAC,1000))  { 
 
NDACのエラーが出なくなった。
sending data:0x2A(*) W1 W2 W3 W4 W5 - Done
sending data:0x4() W1 W2 W3clr_h: sendGPIB_Acmd failed
 
エラーは出なくなったがコマンド体系が違うみたい。IEEE488の共通コマンドも使えないっぽい。
START
STOP
でトリガ待ちを制御できるっぽい。
 
下記はオシロ側にエラーが表示されない。
MATH
TIME
 
コマンドの資料が無いとこれ以上は無理なので中止。
オシロはテトリスオシロのHP 54602Aを修理してから使おう。
 

HP 54602A オシロスコープ

2023/12/06追記

オシロの制御は初めてなので手探り状態。

 

■機器側(HP 54602A)のアドレスを調べる

print/utilityボタン→HP-IBの中の「address」がGPIBのアドレスで1だった。

 

■HP 54602Aのコマンド

keysightから「Agilent 54600-Series Oscilloscopes Programmer’s Guide」をダウンロードして、これを元にいろいろ試した。

 

■ardunoにアドレスをセット

> ++addr 1

1が返ってくる。

 

■トリガをかける

試しにマニュアルに書いてある「*TRG:RUN」を実行してみたら、オートトリガ状態になった。「:run」、「:RUN」でも同じ動きをする。

ちなみに「:AUT」を実行するとオートスケールが実行された。

今回は、シングルトリガで、トリガがかかったら波形をPCに取り込みたいので、シングルトリガを実行する方法を探ってみた。

 

トリガモードを「:TRIGger:MODE?」コマンドで調べてみると

> :TRIGger:MODE?

> ++read
AUTL

となり、オートトリガになってた。

 

トリガモードを「:TRIGger:MODE SINGle」コマンドでシングルにしてみた。

> :TRIGger:MODE SINGle

> :TRIGger:MODE?

> ++read
SING

 

シングルになったのでRUNしてみた。

> :run

 

一発トリガがかかったら止まった。うまくいったみたい。

 

■波形をPCに取り込む

マニュアルのP 2-7に載ってるExsample Programを元にしていろいろ試してみた。

結果的には、下記のコマンドで波形自体は取得できた。

:ACQUIRE:TYPE NORMAL
:ACQUIRE:COMPLETE 1
:WAVEFORM:SOURCE CHANNEL1 ←入力チャンネルを指定
:WAVEFORM:FORMAT ASC    ←これは受信データの確認の手間削減の為にバイナリからアスキーに変更するために追加した。
:ACQUIRE:COUNT 1
:WAVEFORM:POINTS 2000
:DIGITIZE CHANNEL1
# 処理待ち
:WAVEFORM:DATA?

 

実行した時の様子はこんな感じ。

> :ACQUIRE:TYPE NORMAL

> :ACQUIRE:COMPLETE 1

> :WAVEFORM:SOURCE CHANNEL1

> :WAVEFORM:FORMAT ASC

> :ACQUIRE:COUNT 1

> :WAVEFORM:POINTS 2000
:DIGITIZE CHANNEL1

>
> :WAVEFORM:DATA?

> ++read
#80000800049,50,49,50,49,49,50,50,50,49,49,49,49,48,50,49,50,50,50,49,50,50,48,50,49,49,50,50,49,49,50,49,50,50,49,49,49,49,50,49,49,49,49,49,49,49,49,49,49,50,49,49,49,49,50,49,49,49,49,49,49,49,49,50,49,50,49,49,49,49,49,49,49,49,49,49,49,49,50,49,49,49,50,49,48,49,50,50,50,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,50,50,49,50,49,49,49,49,49,49,49,49,50,49,49,49,50,49,49,49,49,49,49,50,49,49,49,49,49,50,49,49,49,50,49,49,49,49,48,49,49,50,49,48,49,48,49,49,49,49,49,49,49,49,48,49,50,49,49,50,50,49,49,48,49,49,50,49,48,49,49,49,49,50,50,49,50,49,50,49,49,69,126,144,165,174,186,192,193,197,199,201,202,203,203,204,203,204,204,204,204,205,204,204,205,204,205,204,204,205,205,205,204,205,205,205,205,205,205,205,205,204,204,205,204,205,205,204,205,205,205,205,204,205,205,205,205,205,204,204,204,205,204,205,206,204,206,205,205,205,205,205,205,205,205,205,205,204,204,205,204,205,204,205,205,205,204,204,205,205,205,205,205,205,205,205,205,205,205,205,205,205,204,204,205,205,205,205,205,205,205,204,206,205,204,204,204,205,204,205,204,204,204,205,205,205,205,205,204,205,205,205,204,205,204,205,205,204,205,204,205,205,205,205,205,205,205,206,205,205,205,205,205,205,205,205,204,205,204,205,205,205,205,205,204,205,205,204,205,205,205,205,205,205,204,205,204,205,205,205,204,205,204,205,205,205,205,205,204,205,205,204,206,204,205,205,204,205,205,204,205,204,205,205,205,205,205,205,204,204,204,205,204,204,205,205,204,204,205,205,205,205,204,204,205,204,204,204,205,204,205,205,205,205,205,205,205,205,204,204,205,205,204,205,204,205,204,205,205,205,205,205,205,205,205,205,205,205,205,204,205,205,205,205,205,205,205,204,205,204,204,204,205,205,205,205,205,205,204,204,205,205,204,204,205,205,204,204,205,204,205,205,204,205,205,205,204,205,205,205,205,205,204,205,205,205,204,205,205,205,204,205,205,205,205,205,205,205,205,205,204,205,204,205,205,205,205,205,204,205,205,204,205,205,205,205,205,204,205,205,205,204,205,206,205,204,205,205,204,205,204,204,205,204,205,205,204,204,205,205,205,205,205,205,205,204,205,204,205,205,205,205,205,205,205,205,205,205,204,205,204,204,205,205,204,205,205,205,205,205,204,204,205,205,205,204,204,205,205,205,204,206,205,205,205,205,191,137,107,95,78,71,64,61,58,55,53,52,52,51,50,49,50,49,50,49,50,49,50,49,50,50,49,49,49,49,50,50,50,49,49,49,49,49,50,50,49,50,49,49,49,49,50,49,49,49,49,49,49,49,48,49,49,50,49,49,50,50,49,49,49,49,49,49,49,50,49,50,49,49,49,49,49,50,49,49,50,49,49,49,50,49,49,49,49,49,49,49,49,49,50,48,48,49,49,48,49,49,50,49,49,50,49,49,49,49,49,50,50,49,49,49,49,49,49,49,49,50,50,49,50,49,50,49,49,49,49,49,49,49,50,50,49,49,49,49,49,50,48,49,49,49,48,50,50,50,49,49,50,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,50,49,50,49,50,49,50,50,50,49,49,49,49,49,49,49,50,49,49,49,50,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,50,49,49,49,50,49,49,49,48,49,49,49,48,49,50,48,49,49,49,49,49,50,49,49,49,50,48,50,49,50,49,49,49,49,49,49,49,49,50,49,50,48,50,49,49,49,49,49,48,49,48,49,49,50,50,49,50,50,49,50,49,49,49,48,49,48,49,49,49,48,49,50,49,50,49,49,49,49,49,49,49,49,49,49,49,49,49,50,49,49,48,49,49,49,49,48,49,49,50,49,48,48,49,50,49,49,49,49,50,49,49,50,49,49,49,49,49,49,49,49,49,49,49,49,49,48,49,49,49,49,50,49,49,49,49,49,49,48,50,49,49,49,49,48,49,49,50,49,49,50,49,49,50,49,49,49,49,49,49,49,49,49,49,49,49,49,49,50,49,50,49,48,50,50,49,49,49,49,49,49,49,49,49,49,50,49,50,49,48,49,49,50,48,79,120,139,163,174,186,191,195,196,201,201,202,202,203,203,204,204,204,204,204,205,205,204,204,204,204,204,204,204,204,204,204,204,204,205,205,205,205,205,205,204,204,205,204,205,204,204,204,205,205,204,204,205,204,204,205,205,204,204,204,204,204,205,204,205,205,205,204,204,205,204,204,205,205,205,203,205,204,205,205,205,204,205,204,205,204,204,204,204,206,205,204,205,204,205,205,205,204,204,205,205,204,205,205,204,205,204,204,204,205,204,204,205,204,205,204,204,204,204,204,205,205,205,204,205,204,204,204,204,205,205,205,204,205,205,205,205,205,205,204,205,205,204,204,205,204,204,204,204,204,204,205,205,205,204,205,203,204,204,204,204,205,205,205,205,205,205,205,204,205,204,205,204,204,205,204,205,204,205,204,205,204,205,205,204,205,204,205,204,205,204,204,205,204,205,205,205,205,205,205,205,205,205,205,205,205,204,204,205,204,205,205,205,205,205,205,204,205,205,204,205,205,204,205,205,205,205,204,205,204,205,205,204,205,204,204,205,204,205,205,205,205,205,204,204,205,204,204,205,205,204,205,204,204,205,205,205,204,204,204,204,205,204,205,204,204,204,205,204,206,204,205,204,205,204,204,204,204,205,205,205,205,205,205,205,204,205,205,204,205,205,204,204,205,204,204,204,205,204,205,205,205,205,205,204,205,204,204,204,205,205,204,205,204,204,205,205,204,205,204,204,205,205,205,205,204,205,205,205,205,204,204,205,205,205,204,204,205,205,205,204,204,205,205,204,205,205,204,206,204,205,204,205,205,205,204,205,205,204,204,205,204,205,205,205,205,205,204,205,205,204,205,205,205,205,205,204,205,205,205,205,205,205,204,205,204,204,204,205,204,204,205,204,205,205,205,205,205,205,205,205,205,205,205,205,195,155,124,93,79,70,66,62,58,55,53,52,51,50,50,51,50,50,49,50,50,49,50,49,50,50,49,49,49,49,50,50,50,49,50,49,48,50,50,49,49,50,49,49,49,49,49,50,49,50,50,49,48,49,50,49,48,48,48,49,49,49,49,49,49,49,49,49,50,49,49,49,49,50,50,49,50,49,49,50,50,49,49,48,49,50,49,49,50,49,49,49,49,49,49,49,50,50,50,49,49,50,48,49,49,49,49,50,49,50,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,50,49,49,49,49,49,49,50,50,49,50,50,49,50,49,49,49,49,49,49,49,49,48,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,50,49,49,49,49,49,49,49,49,49,49,49,48,49,48,48,50,50,49,49,50,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,48,49,49,49,49,49,48,50,49,49,50,49,49,49,49,49,49,49,49,49,49,49,50,49,49,49,48,49,49,49,49,50,49,50,49,49,50,49,48,50,49,49,49,49,49,50,50,49,49,50,49,50,49,49,49,48,49,49,49,50,49,48,49,49,49,49,48,49,49,49,49,48,50,49,49,49,49,48,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,49,50,49,50,49,49,49,50,49,49,49,48,49,48,49,48,49,49,49,49,49,49,49,49,48,49,48,49,50,48,48,50,49,49,49,49,49,49,48,49,49,49,49,50,49,49,49,49,49,49,49,49,49,49,49,49,49,49,48,49,49,49,48,50,49,49,48,49,50,49,49,49,49,49,49,49,49,49,49,49,49,50,48,48,49,49,49,49,49,50,49,49,49,49,48,49,49,50,49,49,49,49,49,50,49,49,50,50,91,115,138,157,178,182,190,194,198,200,200,202,203,203,203,203,203,204,203,204,204,204,205,205,205,204,205,205,204,204,204,205,204,205,204,204,204,205,204,205,205,204,205,204,205,204,204,205,204,205,204,205,205,205,204,204,204,204,204,205,204,205,204,205,205,205,204,204,204,205,204,205,204,205,204,205,204,204,204,205,205,204,205,205,204,205,205,204,204,204,204,205,205,204,204,205,204,204,204,205,205,205,204,204,204,204,205,204,204,204,204,204,205,204,205,205,204,204,205,204,205,205,204,206,204,205,204,205,205,204,205,204,205,205,204,205,205,204,205,205,205,204,205,204,204,204,205,205,206,204,205,205,205,204,205,205,204,205,205,204,204,205,205,205,205,205,205,205,205,204,205,205,204,205,204,205,205,205,204,205,205,205,204,205,205,205,204,205,205,204

 

チャンネル1の波形のデータのみが取れた。この数値の羅列をレベルとしてグラフにすると波形になる。

取得した波形のスケールってどうなってるのかもう少し調べないといけないのと、画面のハードコピーも取りたいんだけど、時間切れで今日はここまで。P 8-6の「:DISPlay:DATA?」を使えばとれるかな?

 

pythonで制御

pythonをインストール

windowsでやるのでwindowsにpythonをインストール。
下記のwebサイトに行く。
 
Python 3.10.7 - Sept. 6, 2022
をダウンロードする。
 
ダウンロードしたインストーラを管理者権限でインストールする。
 

pyserialをインストール

pipでインストール。
> pip install pyserial
 
 
下記のファイルをpyserial-01.pyで保存。
 
import serial
import time
 
ser = serial.Serial('COM35', 115200) # COMポート番号は環境に合わせて変更
 
print(ser)
 
time.sleep(3)
print("send ++addr 17")
ser.write(b'++addr 17\n')
time.sleep(3)
 
 
while True:
    print("send FU1")
    ser.write(b'FU1\n')
    time.sleep(3)
 
    print("send FU2")
    ser.write(b'FU2\n')
    time.sleep(3)
 
ser.close()
 
スクリプトを実行。
> python pyserial-01.py 
 
すると3秒ごとに正弦波、矩形波に切り替わる。
他の箇所にもウェイトを入れてるのは、ウェイト0ではファンクションジェネレータが動いてくれなかったから。ウェイトはもっと短くできる。
 
リモートでテストを自動実行し、経過を動画に保存するスクリプトを作って自動テストができる環境ができた。
自動化には他に下記のパッケージをインストールした。
pywin32
PyAutoGUI
pywinauto 
pillow
opencv
 
ただし、録画のためにスクリーンショットを撮るがpillowのバグのせいで下記のエラーが出て止まることがある。
 
OSError: screen grab failed
完全な回避策はpillowを使わないこと。スクリーンショットの実装はpillowを使ったものばかりだったので自前で作る必要がありそう。今回の目的はそこではないので止まったら再実行することで妥協した。
 
PySideを使うとできるらしいが、ちょっと試した限りではうまくいかなかった。。。
少し負けた感じがした。
 
気が向いたら感想をお願いします。(ログイン不要、ボタンを押すだけです)