Vous pouvez utiliser PyVISA pour obtenir des données de l'oscilloscope. Pour la méthode d'installation, reportez-vous à VISA in Python --Qiita. De plus, dans mon cas, j'ai eu une erreur lors de l'utilisation de PyVISA, donc [[Note] pyvisa.errors.VisaIOError: VI_ERROR_INV_OBJECT (-1073807346): La session ou la référence d'objet donnée est invalide. --Qiita] J'ai installé NI-VISA en me référant à (https://qiita.com/grinpeaceman/items/9a580c137f1cbbfe5ba7).
Voici le code et les commentaires descriptifs.
import numpy as np
import visa
rm = visa.ResourceManager()
#Dans cet endroit, rm.list_resources()De l'Intérieur
#Sélectionnez l'appareil souhaité et rm.open_resource()Veuillez passer à
inst = rm.open_resource(rm.list_resources()[0])
#paramètre de délai
scope.timeout = 30000 #30 secondes
# Setting source as Channel 1
scope.write('DATA:SOU CH1')
scope.write('DATA:WIDTH 1')
scope.write('DATA:ENC ASCI')
#C'est un paramètre pour acquérir des données à PLEIN à partir de l'oscilloscope
#Dans mon environnement, commenter cet emplacement semble réduire la quantité de données
scope.write('DATA:RESOLUTION FULL')
# Getting axis info
#Le processus de récupération des données est
# How to save Data from Oscilloscope using Python in Linux - Tech For Curious
# <https://techforcurious.website/how-to-save-data-from-oscilloscope-using-python-in-linux/#more-348>Ou
# How do I get a waveform using the Instrument Control Toolbox in Matlab? | Tektronix
# <https://techforcurious.website/how-to-save-data-from-oscilloscope-using-python-in-linux/#more-348>
#Je faisais référence
ymult = float(scope.query('WFMPRE:YMULT?')) # y-axis least count
yzero = float(scope.query('WFMPRE:YZERO?')) # y-axis zero error
yoff = float(scope.query('WFMPRE:YOFF?')) # y-axis offset
xincr = float(scope.query('WFMPRE:XINCR?')) # x-axis least count
xoff = float(scope.query('WFMP:PT_OFF?')) # x-axis offset
xzero = float(scope.query('WFMPRE:XZERO?')) # x-axis least count
#Obtenez les données. Dans mon environnement environ 6.Cela a pris 5 secondes
ADC_wave = scope.query_ascii_values('CURV?', container=np.array)
#Les données
volts = (ADC_wave - yoff) * ymult + yzero
time = np.arange(xzero, xincr * len(Volts) - xoff + xzero, xincr)
Voici le code ci-dessus qui vous permet d'acquérir, d'afficher et de sauvegarder des données en temps réel.
import numpy as np
import matplotlib.pyplot as plt
import visa
from matplotlib import _pylab_helpers
import tkinter
from tkinter import filedialog
import threading
import csv
#Indiquer s'il faut enregistrer
#Verrouiller le fil lors de la modification de cette variable
is_save_requested = False
def gui(lock):
global is_save_requested
def change_title():
global is_save_requested
lock.acquire()
is_save_requested = True
lock.release()
root = tkinter.Tk()
#bouton
button1 = tkinter.Button(
master=root,
text="Save", #valeur initiale
width=30, #largeur
bg="lightblue", #Couleur
command=change_title #Fonction à exécuter au clic
)
button1.pack()
root.mainloop()
def get_data_from_inst(rm , scope):
scope.timeout = 30000
# Setting source as Channel 1
scope.write('DATA:SOU CH1')
scope.write('DATA:WIDTH 1')
scope.write('DATA:ENC ASCI')
scope.write('DATA:RESOLUTION FULL')
# Getting axis info
ymult = float(scope.query('WFMPRE:YMULT?')) # y-axis least count
yzero = float(scope.query('WFMPRE:YZERO?')) # y-axis zero error
yoff = float(scope.query('WFMPRE:YOFF?')) # y-axis offset
xincr = float(scope.query('WFMPRE:XINCR?')) # x-axis least count
xoff = float(scope.query('WFMP:PT_OFF?')) # x-axis offset
xzero = float(scope.query('WFMPRE:XZERO?')) # x-axis least count
ADC_wave = scope.query_ascii_values('CURV?', container=np.array)
Volts = (ADC_wave - yoff) * ymult + yzero
Time = np.arange(xzero, xincr * len(Volts) - xoff + xzero, xincr)
return (Time, Volts)
def main():
rm = visa.ResourceManager()
inst = rm.open_resource(rm.list_resources()[0])
#Configuration d'une interface graphique qui déclenche l'enregistrement
global is_save_requested
lock = threading.Lock()
t1 = threading.Thread(target=gui, args=(lock,))
t1.start()
data = get_data_from_inst(rm, inst)
x, y = data
x = x * 1e6 # sec to micro sec
y = y * 1e3 # V to mV
fig, ax = plt.subplots(1, 1)
ax.set_xlabel('time(μs)')
ax.set_ylabel('Intensity (mV)')
lines, = ax.plot(x, y)
while True:
manager = _pylab_helpers.Gcf.get_active()
if manager is None: break
#Mettre à jour les données du tracé
data = get_data_from_inst(rm, inst)
x, y = data
x = x * 1e6 # sec to micro sec
y = y * 1e3 # V to mV
# data update
lines.set_data(x, y)
plt.pause(.01)
#Enregistrer le processus
lock.acquire()
if is_save_requested:
file = filedialog.asksaveasfilename(initialfile='', title = "Sélectionnez un emplacement de sauvegarde",filetypes = [("fichier csv", ".csv")])
if file:
with open(file, mode='w',encoding="utf-8") as f:
writer = csv.writer(f, lineterminator='\n')
writer.writerows(np.array(data).T)
is_save_requested = False
lock.release()
if __name__ == "__main__":
main()
pyVISA est très pratique!
Recommended Posts