示波器是您可以在任何电子工程师或制造商的工作台上找到的最重要的工具之一。它主要用于查看波形并确定电压电平,频率,噪声和在其输入端施加的可能随时间变化的信号的其他参数。嵌入式软件开发人员还使用它进行代码调试,技术人员也可以使用它在维修过程中对电子设备进行故障排除。这些原因使示波器成为任何工程师必备的工具。唯一的问题是它们可能非常昂贵,以最差的精度执行最基本功能的示波器可能要花费$ 45到$ 100,而更先进,更高效的示波器则要花费$ 150以上。今天,我将演示如何使用Arduino以及将使用我最喜欢的编程语言Python开发的软件,以构建一个低成本的4通道Arduino示波器,该示波器能够执行部署了一些廉价示波器的任务,例如波形显示和电压电平确定用于信号。
这个怎么运作
该项目分为两个部分:
- 数据转换器
- 绘图仪
示波器通常包括施加到其输入通道的模拟信号的可视表示。为此,我们需要先将信号从模拟转换为数字,然后再绘制数据。对于转换,我们将利用Arduino使用的atmega328p微控制器上的ADC(模数转换器)将信号输入处的模拟数据转换为数字信号。转换后,每次时间的值通过UART从Arduino发送到Arduino,在PC上,将使用python开发的绘图仪软件通过根据时间绘制每个数据将输入的数据流转换为波形。
所需组件
构建此项目需要以下组件;
- Arduino Uno(可以使用任何其他板)
- 面包板
- 10k电阻器(1)
- LDR(1)
- 跳线
必备软件
- Arduino IDE
- 蟒蛇
- Python库:Pyserial,Matplotlib,Drawedow
原理图
Arduino示波器的示意图很简单。我们需要做的就是将要检查的信号连接到Arduino的指定模拟引脚。但是,我们将在简单的分压器设置中使用LDR来生成要检查的信号,这样生成的波形将根据LDR周围的光强来描述电压电平。
如下图所示连接组件。
连接后,安装程序应如下图所示。
完成所有连接后,我们可以继续编写代码。
Arduino示波器代码
我们将为两个部分中的每一个编写代码。对于前面提到的Plotter,我们将编写一个Python脚本,该脚本通过UART和Plots接收来自Arduino的数据,而对于Converter,我们将编写一个Arduino草图,该草图从ADC接收数据并将其转换为电压电平发送到绘图仪。
Python(绘图仪)脚本
由于python代码更复杂,因此我们将从其开始。
我们将使用几个库,包括: 如前所述, 使用python脚本 绘制 了 drawow,Matplotlib 和 Pyserial 。 Pyserial 允许我们创建一个可以通过串行端口进行通信的python脚本, Matplotlib 使我们能够从通过串行端口接收的数据生成图,而 drawow 为我们提供了一种实时更新图的方法。
有几种方法可以在PC上安装这些软件包,最简单的方法是通过 pip 。可以通过命令行在Windows或Linux计算机上安装Pip。PIP与python3打包在一起,因此我建议您安装python3并选中有关将python添加到路径的框。如果您在安装pip时遇到问题,请访问python官方网站以获取提示。
安装pip之后,我们现在可以安装所需的其他库。
为Windows用户打开命令提示符,为Linux用户打开终端并输入以下内容;
pip安装pyserial
完成后,使用以下命令安装 matplotlib :
pip安装matplotlib
有时将 drawow 与matplotlib一起安装,但是要确保运行。
点安装drawow
安装完成后,我们现在就可以编写python脚本了。
该项目的python脚本类似于我为基于Raspberry Pi的示波器编写的脚本。
我们首先导入代码所需的所有库。
导入时间从drawow导入matplotlib.pyplot作为plt导入* 导入pyserial
接下来,我们创建并初始化将在代码期间使用的变量。数组 val 将用于存储从串行端口接收的数据,而 cnt 将用于计数。每50个数据计数后,将删除位置0的数据。这样做是为了使数据保持在示波器上。
val = cnt = 0
接下来,我们创建串行端口对象,Arduino将通过该对象与我们的python脚本进行通信。确保下面指定的com端口与Arduino开发板与IDE进行通信的com端口相同。上面使用的115200波特率用于确保与Arduino的高速通信。为防止错误,还必须启用Arduino串行端口以与此波特率通信。
port = serial.Serial('COM4',115200,超时= 0.5)
接下来,我们使用以下方式使绘图变为交互式:
plt.ion()
我们需要创建一个函数来根据接收到的数据生成图,并创建我们期望的上限和下限,在这种情况下,基于Arduino ADC的分辨率为1023。我们还设置了标题,标记了每个轴并添加了图例,以便于识别图。
#创建图形功能def makeFig():plt.ylim(-1023,1023)plt.title('Osciloscope')plt.grid(True)plt.ylabel('ADC输出')plt.plot(val,'ro -',label ='Channel 0')plt.legend(loc ='右下角')
完成此操作后,我们现在就可以编写主 循环 ,以便在可用时从串行端口获取数据并进行绘制。为了与Arduino同步,握手数据通过python脚本发送到Arduino,以表明其准备读取数据。 Arduino收到握手数据时,会用ADC的数据进行回复。没有这种握手,我们将无法实时绘制数据。
while(True): port.write(b's)#与Arduino握手 if(port.inWaiting()):#如果arduino回复 value = port.readline()#读取回复 print(value)#print这样我们就可以监视它 number = int(value)#将接收到的数据转换为整数 print('Channel 0:{0}'。format(number)) #睡眠半秒钟。 time.sleep (0.01) val.append(int(number)) drawow(makeFig)#update图以反映新数据输入 plt.pause(.000001) cnt = cnt + 1 if(cnt> 50): val.pop( 0)#通过删除位置0的数据使图保持新鲜
本文末尾给出了arduino示波器的完整python代码。
Arduino代码
第二个代码是Arduino草图,用于获取表示来自ADC信号的数据,然后等待从绘图仪软件接收握手信号。一旦接收到握手信号,它将通过UART将获取的数据发送到绘图仪软件。
我们首先声明要向其施加信号的Arduino的Analog引脚。
int sensorpin = A0;
接下来,我们初始化并开始以115200的波特率进行串行通信
void setup(){ //以每秒115200位的 速率 初始化串行通信,以匹配python脚本的串行通信:Serial.begin(115200); }
最后, voidloop() 函数处理数据的读取,并将数据通过串行发送到绘图仪。
void loop(){ //读取模拟引脚0上的输入: 浮点sensorValue = AnalogRead(sensorpin); 字节数据= Serial.read(); 如果(数据=='s') { Serial.println(sensorValue); 延迟(10); //为了保持稳定性,两次读取之间会延迟 } }
在完整的Arduino的示波器代码在这篇文章下面显示的结束下面给出以及。
int sensorpin = A0; void setup(){ //以每秒115200位的 速率 初始化串行通信,以匹配python脚本的串行通信:Serial.begin(115200); } void loop(){ //读取模拟引脚0上的输入:################################# ###################### float sensorValue = AnalogRead(sensorpin); 字节数据= Serial.read(); 如果(数据=='s') { Serial.println(sensorValue); 延迟(10); //为了保持稳定性,两次读取之间会延迟 } }
实际操作中的Arduino示波器
将代码上传到Arduino设置并运行python脚本。您应该看到数据开始通过python命令行流入,并且绘图随光强度而变化,如下图所示。
因此这就是Arduino可用作示波器的方式,也可以使用Raspberry pi制成,请在此处查看有关基于Raspberry Pi的示波器的完整教程。