In terms of hardware, almost all of my equipment is old enough that GPIB is the only interface, and I connect to it using GPIB-to-Ethernet interfaces like HP/Agilent E5810A and E2050A, which support VXI-11. I think this is by far the simplest solution from software support point of view. No USB drivers necessary. I found USB-GPIB interfaces a pain to use in terms of stability and updating drivers with OS upgrades. But this was with a NI GPIB-USB-B interface, I can't speak about the Arduino solution.
Most instruments I control were not supported by any pre-existing solutions when I started, and do not support SCPI (a sort of standard protocol supported by many more modern test instruments). And I sometimes need extra logic in the instrument driver to easily control it. For example maybe an instrument needs to go through an adjustment procedure before a particular measurement. Then I want to be able to implement that logic in the instrument driver. So I have been using
python-ivi and been writing pretty much
all of my own drivers. Python-ivi will use
python-vxi11,
python-usbtmc,
PyVISA and a number of other libraries to actually talk to the hardware. To then use it looks something like this:
dmm = ivi.keithley.keithley2000("TCPIP::gpib1::gpib,17::INSTR",
id_query=True)
dmm.measurement_function = 'four_wire_resistance'
dmm.range = 10e3
with open('output.csv', 'a', newline='') as csv_file:
csvw = csv.DictWriter(csv_file, fieldnames=['datetime', 'value'])
while True:
row = {}
row['datetime'] = datetime.datetime.utcnow().isoformat()
row['value'] = dmm.measurement.fetch(1)
csvw.writerow(row)
The advantage is that this is based on an industry standard, however imperfect, which means different instrument drivers for the same type of instrument, like multiple DMMs or multiple scopes, will behave pretty similar, so if you have a program that uses a function generator and a scope to do a measurement, you could swap out a different brand, higher bandwidth function generator and scope without much of any changes to the program. For the metrology-type work I do this is quite helpful. Changing the Keithley 2000 I used in the above script to an Agilent 34401A DMM would just require changing the first line.
A problem with python-ivi is that it's not being maintained, so instrument drivers are spread out over different Github repositories (including mine). The best suggestion I have is trying to find a fork that has the drivers you need.