[PYTHON] Obtenez des données d'un oscilloscope avec pyVISA

introduction

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).

Code Python

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()

en conclusion

pyVISA est très pratique!

Recommended Posts

Obtenez des données d'un oscilloscope avec pyVISA
[Note] Obtenir des données de PostgreSQL avec Python
Obtenez des données de Cloudant avec le flacon Bluemix
Obtenir les données structurelles de CHEMBLID
Obtenez des données Youtube avec python
Obtenir des données de la base de données via ODBC avec Python (Access)
Obtenez des données de l'API d'analyse avec le client API Google pour python
Obtenir des données de Quandl en Python
Obtenir une colonne de DataFrame avec DataFrame
[Python] Obtenez des données économiques avec DataReader
Obtenez des données de Twitter avec Tweepy
Obtenez des données de VPS MySQL avec Python 3 et SQL Alchemy
J'obtiens une erreur avec les pandas d'importation.
Recevoir des données textuelles de mysql avec python
Scraping depuis un site authentifié avec python
Faites fonctionner l'oscilloscope avec le Raspberry Pi
Obtenez des données de séries chronologiques de k-db.com avec Python
Obtenez des données sur le cours de l'action avec l'API Quandl [Python]
Générez une instruction d'insertion à partir de CSV avec Python.
Obtenez plus de 10 données du magasin de paramètres SSM
J'obtiens une erreur avec toutes les commandes yum
Extraire des données d'une page Web avec Python
Comment récupérer des données d'image de Flickr avec Python
Obtenir le calendrier de l'API Garoon SOAP avec Python + Zeep
Note de lecture: Introduction à l'analyse de données avec Python
Obtenez des données du module GPS à 10 Hz avec Python
Comment obtenir plus de 1000 données avec SQLAlchemy + MySQLdb
Obtenez des commentaires et des abonnés avec l'API de données YouTube
Recevoir des e-mails de Gmail et étiqueter avec Python3
[Bases de la science des données] Collecte de données depuis RSS avec python
Analyse de données avec python 2
Extraction de données depuis S3
Lecture de données avec TensorFlow
Démarrez avec MicroPython
Manipulation des données avec les Pandas!
Recevez des tweets avec Tweepy
Obtenez des données compressées par Gzip en mémoire
Mélangez les données avec les pandas
Augmentation des données avec openCV
Démarrez avec Mezzanine
Normariser les données avec Scipy
Analyse de données avec Python
CHARGER DES DONNÉES avec PyMysql
Récupérer une image d'une page Web et la redimensionner
[Python] Envoyez un e-mail depuis Gmail avec le paramètre d'authentification en deux étapes
Premiers pas avec le dessin avec matplotlib: création de diagrammes à partir de fichiers de données
J'ai essayé d'envoyer un e-mail d'Amazon SES avec Python
[Linux] Copie des données de Linux vers Windows avec un script shell
Vérifiez! Obtenez les données du capteur via Bluetooth avec Raspberry Pi ~ Préparation
Créez un environnement pour "Deep Learning from scratch" avec Docker
Débarrassez-vous des données sales avec Python et les expressions régulières
Résumé Xpath lors de l'extraction de données d'un site Web avec Python Scrapy
[Python] Récupère le répertoire d'exécution du script avec un chemin absolu
Essayez d'acquérir des données lors de la redirection de port vers RDS avec anaconda.
Comment obtenir un aperçu de vos données dans Pandas
Obtenez des données supplémentaires vers LDAP avec python (Writer et Reader)
Obtenir le message du premier offset avec le consommateur kafka en python
[Introduction à Python] Comment obtenir des données avec la fonction listdir