电脑能控电脑控--Analog Discovery Python(1)
经过上一期,相信简单的使用waveforms的script也能进行一个简单的操作,但联动其他仪器可能还不太方便。所以咱们再来聊聊如何用Python去控制Analog Discovery,虽然工作肯定是做不完的,但是能尽快的把工作推进,那就可以体验其他工作了。
在开始之前,提一嘴,现在anlalog discovery 2 二手只要1000+了,如果能在1200左右捡到我觉得还是香的。二手商品包含风险,大家自行甄别判断!

咱们就开始吧!
-
-
- 你要在电脑上安装 waveforms
- 你要在电脑上安装python
- 使用控制台输入 pip install dwfpy
- 先从一个简单的例子开始,例如控制个io
-
目标:
-
- 控制1个io 为输出,1个io为输入
- 控制输出读取输入
参考代码:
# waveforms.py
import dwfpy as dwf
import time# 使用with语句自动管理设备资源,确保程序结束时正确关闭设备
with dwf.Device() as device:# 打印找到的设备信息,包括设备名称和序列号print(f"Found device: {device.name} ({device.serial_number})")# 获取设备的数字IO接口对象io = device.digital_io# 配置DIO-0引脚为输入模式# enabled=False: 禁用输出驱动(即设置为输入)# configure=True: 立即应用配置io[0].setup(enabled=False, configure=True)# 配置DIO-1引脚为输出模式,并将初始状态设为低电平# enabled=True: 启用输出驱动(即设置为输出)# state=False: 设置输出状态为低电平(0V)# configure=True: 立即应用配置io[1].setup(enabled=True, state=False, configure=True)# 读取所有I/O引脚的当前状态io.read_status()# 读取DIO-0引脚的输入状态(由于DIO-0配置为输入,所以这里是读取外部输入)dio0 = io[0].input_state# 打印DIO-0的当前状态(True表示高电平,False表示低电平)print(dio0)# 将dio1的输出状态设置为高电平(True)io[1].output_state = True# 等待1秒钟time.sleep(1)# 再次读取所有I/O引脚的当前状态io.read_status()# 再次读取DIO-0引脚的输入状态dio0 = io[0].input_state# 打印DIO-0的当前状态print(dio0)
运行结果:

第一步:打印设备信息
第二步: 打印io0状态,因为此时IO1的status 还是0,所以io0的输入就是0,所以是false
第三步:打印io0状态,因为此时IO1的status 还是1,所以io0的输入就是1,所以是true
硬件连接信息:

既然analog discovery 2已经控制起来了,咱们就可以继续往下整,因为现在也没有具体的需求,咱们就随便编一个。
目标:
IO1输出翻转,IO0回读,每次翻转用示波器截图一张
先将以下文件保存为siglentscope.py放在同一个文件夹中
鼎阳示波器驱动:
import pyvisa
import time
from PIL import Image
import io
import tkinter as tk
from tkinter import filedialogclass SiglentScope:def __init__(self):self.rm = pyvisa.ResourceManager()self.scope = Noneself.screenshot_save_path = Nonedef set_screenshot_save_path(self, path):"""设置截图保存地址"""self.screenshot_save_path = pathdef capture_oscilloscope_screenshot(self, name="screenshot.png"):try:# 连接示波器 - 需要根据实际设备修改地址self.scope = self.rm.open_resource('USB0::0xF4EC::0x1017::SDS08A0C802172::INSTR')# 设置超时时间self.scope.timeout = 10000# 清除设备self.scope.write('*CLS')# 获取截图数据self.scope.write('PRINt? BMP')img_data = self.scope.read_raw()# 将二进制数据转换为图像image = Image.open(io.BytesIO(img_data))if self.screenshot_save_path:if name is None:file_path = self.screenshot_save_pathelse:file_path = nameelse:# 创建临时的 tk 根窗口(用于文件对话框)root = tk.Tk()root.withdraw() # 隐藏主窗口# 打开文件保存对话框file_path = filedialog.asksaveasfilename(defaultextension=".png",filetypes=[("PNG files", "*.png"), ("All files", "*.*")],title="保存示波器截图")if file_path: # 如果用户选择了保存位置# 保存图像image.save(file_path)print(f"截图已保存至: {file_path}")else:print("取消保存")except Exception as e:print(f"发生错误: {str(e)}")# finally:# # 关闭连接# if self.scope:# self.scope.close()# self.rm.close()if __name__ == '__main__':scope = SiglentScope()scope.capture_oscilloscope_screenshot()
最终实现的程序
# waveforms.py
import dwfpy as dwf
import time
import siglentscopescope=siglentscope.SiglentScope()
scope.set_screenshot_save_path("screenshot.png")
# 使用with语句自动管理设备资源,确保程序结束时正确关闭设备
with dwf.Device() as device:# 打印找到的设备信息,包括设备名称和序列号print(f"Found device: {device.name} ({device.serial_number})")# 获取设备的数字IO接口对象io = device.digital_ioio[1].setup(enabled=True, state=False, configure=True)for i in range(10):# 切换DIO-1引脚的输出状态(True表示高电平,False表示低电平)io[1].output_state = not io[1].output_statetime.sleep(0.5)scope.capture_oscilloscope_screenshot(f"screenshot_{i}.png")time.sleep(1)io.read_status()# 读取DIO-0引脚的输入状态(由于DIO-0配置为输入,所以这里是读取外部输入)dio0 = io[0].input_state# 输出DIO-0的当前状态(True表示高电平,False表示低电平)print(dio0)# 暂停1秒time.sleep(1)
测试结果:

好嘞,uu们今天就到这里,有了这些操作相信咱们可以更快的完成工作!

苍南渔岙村
