基于Arduino构建的4通道实时示波器

发布时间:2023-03-08  

示波器是任何电子工程师或制造商的工作台上最重要的工具之一。它主要用于查看波形并确定施加在其输入端的信号的电压电平、频率、噪声和其他参数,这些参数可能会随时间变化。嵌入式软件开发人员还使用它进行代码调试,技术人员使用它在维修期间对电子设备进行故障排除。这些原因使示波器成为任何工程师的必备工具。唯一的问题是它们可能非常昂贵,以最低精度执行最基本功能的示波器可能高达 45 至 100 美元,而更先进和更高效的示波器的成本超过 150 美元。今天,我将演示如何使用Arduino和一款软件,该软件将使用我最喜欢的编程语言Python开发,以构建低成本的4通道Arduino示波器,该示波器能够执行部署一些廉价示波器的任务,例如显示波形和确定信号的电压电平。


工作原理

这个项目有两个部分;

数据转换器

绘图仪

示波器通常涉及施加到其输入通道的模拟信号的视觉表示。为此,我们需要首先将信号从模拟转换为数字,然后绘制数据。对于转换,我们将利用Arduino使用的atmega328p微控制器上的ADC(模数转换器)将信号输入的模拟数据转换为数字信号。转换后,每次的值通过UART从Arduino发送到PC,在那里,将使用python开发的绘图仪软件将通过绘制每个数据与时间的关系将传入的数据流转换为波形。


必需组件

生成此项目需要以下组件;

Arduino Uno(可以使用任何其他板)

面包板

10k 电阻器 (1)

LDR (1)

跳线

所需软件

Arduino IDE

Python 库:Pyserial、Matplotlib、Drawnow

图表

Arduino示波器的原理图很简单。我们需要做的就是将要检查的信号连接到Arduino的指定模拟引脚。但是,我们将在简单的分压器设置中使用LDR来生成要检查的信号,以便生成的波形将根据LDR周围的光强度描述电压电平。

按照下面的原理图连接组件;

poYBAGNqIH-AMaOkAAC2FqL_6us425.png

连接后,设置应如下图所示。

poYBAGNqIIKAIGAVAAC7wTNAn7w775.jpg

完成所有连接后,我们可以继续编写代码。

ArduinoOsclloscopeCode

我们将为这两个部分中的每一个编写代码。对于前面提到的绘图仪,我们将编写一个python脚本,通过UART和Plots接受来自Arduino的数据,而对于转换器,我们将编写一个Arduino草图,该草图从ADC接收数据并将其转换为发送到绘图仪的电压电平。

Python(绘图仪)脚本

由于 python 代码更复杂,我们将从它开始。

我们将使用几个库,包括;drawnow,Matplotlib和Pyserial使用前面提到的python脚本。Pyserial 允许我们创建一个可以通过串行端口进行通信的 python 脚本,Matplotlib 使我们能够从通过串行端口接收的数据生成绘图,drawnow 为我们提供了一种实时更新绘图的方法。

有几种方法可以在您的 PC 上安装这些软件包,最简单的是通过pip。Pip 可以通过命令行安装在 Windows 或 Linux 机器上。PIP 与 python3 打包在一起,所以我建议您安装 python3 并选中有关将 python 添加到路径的框。如果您在安装 pip 时遇到问题,请查看 Python 官方网站以获取提示。

安装 pip 后,我们现在可以安装所需的其他库。

打开Windows用户的命令提示符,Linux用户的终端,然后输入以下内容;

pip install pyserial

完成此操作后,请使用以下命令安装 matplotlib;

pip install matplotlib

Drawnow 有时与 matplotlib 一起安装,但可以肯定的是,运行;

pip install drawnow

安装完成后,我们现在可以编写 python 脚本了。

我们首先导入代码所需的所有库;

import time import matplotlib.pyplot as plt from drawnow import *

import pyserial

接下来,我们创建并初始化将在代码期间使用的变量。数组 val 将用于存储从串行端口接收的数据,cnt 将用于计数。每 50 个数据计数后,位置 0 处的数据将被删除。这样做是为了保持示波器上显示的数据。

val = [ ] cnt = 0

接下来,我们创建串行端口对象,Arduino 将通过该对象与我们的 python 脚本进行通信。确保下面指定的 COM 端口与 Arduino 板与 IDE 通信的 COM 端口相同。上面使用的115200波特率用于确保与Arduino的高速通信。为防止错误,还必须启用 Arduino 串行端口才能与此波特率通信。

port = serial.Serial('COM4', 115200, timeout=0.5)

接下来,我们使用;

plt.ion()

我们需要创建一个函数来从收到的数据生成绘图,创建我们期望的上限和最小限制,在这种情况下,基于 Arduino's ADC 的分辨率为 1023。我们还设置了标题,标记了每个轴并添加了图例,以便于识别情节。

#create the figure function def makeFig(): plt.ylim(-1023,1023) plt.title('Osciloscope') plt.grid(True) plt.ylabel('ADC outputs') plt.plot(val, 'ro-', label='Channel 0') plt.legend(loc='lower right')

完成此操作后,我们现在准备编写主循环,该循环在可用时从串行端口获取数据并绘制它。为了与Arduino同步,python脚本将握手数据发送到Arduino,以指示其准备读取数据。当Arduino收到握手数据时,它会回复来自ADC的数据。没有这种握手,我们将无法实时绘制数据。

while (True):

port.write(b's') #handshake with Arduino

if (port.inWaiting()):# if the arduino replies

value = port.readline()# read the reply

print(value)#print so we can monitor it

number = int(value) #convert received data to integer

print('Channel 0: {0}'.format(number))

# Sleep for half a second.

time.sleep(0.01)

val.append(int(number))

drawnow(makeFig)#update plot to reflect new data input

plt.pause(.000001)

cnt = cnt+1

if(cnt>50):

val.pop(0)#keep the plot fresh by deleting the data at position 0

Arduino 代码

第二个代码是Arduino草图,用于从ADC获取表示信号的数据,然后等待从绘图仪软件接收握手信号。一旦收到握手信号,它就会通过UART将采集的数据发送到绘图仪软件。

我们首先声明将应用信号的Arduino模拟引脚的引脚。

int sensorpin = A0;

接下来,我们初始化并开始波特率为 115200 的串行通信

void setup() {

// initialize serial communication at 115200 bits per second to match that of the python script:

Serial.begin(115200);

}

最后,voidloop() 函数处理数据的读取,并通过串行将数据发送到绘图仪。

void loop() {

// read the input on analog pin 0:

float sensorValue = analogRead(sensorpin);

byte data = Serial.read();

if (data == 's')

{

Serial.println(sensorValue);

delay(10); // delay in between reads for stability

}

}

完整的 Arduino 示波器代码在下面以及本文末尾给出,如下所示。

int sensorpin = A0;

void setup() {

// initialize serial communication at 115200 bits per second to match that of the python script:

Serial.begin(115200);

}

void loop() {

// read the input on analog pin 0:########################################################

float sensorValue = analogRead(sensorpin);

byte data = Serial.read();

if (data == 's')

{

Serial.println(sensorValue);

delay(10); // delay in between reads for stability

}

}

Arduino 示波器的实际应用

将代码上传到Arduino设置并运行python脚本。您应该看到数据开始通过python命令行流入,并且绘图随光强度而变化,如下图所示。

pYYBAGNqIIOAHPoeAAB5Hz-4b70766.png

Python Code:





import time

import matplotlib.pyplot as plt

from drawnow import *

import serial

val = [ ]

cnt = 0

#create the serial port object

port = serial.Serial('COM4', 115200, timeout=0.5)

plt.ion()


#create the figure function

def makeFig():

plt.ylim(-1023,1023)

plt.title('Osciloscope')

plt.grid(True)

plt.ylabel('data')

plt.plot(val, 'ro-', label='Channel 0')

plt.legend(loc='lower right')


while (True):

port.write(b's') #handshake with Arduino

if (port.inWaiting()):# if the arduino replies

value = port.readline()# read the reply

print(value)#print so we can monitor it

number = int(value) #convert received data to integer

print('Channel 0: {0}'.format(number))

# Sleep for half a second.

time.sleep(0.01)

val.append(int(number))

drawnow(makeFig)#update plot to reflect new data input

plt.pause(.000001)

cnt = cnt+1

if(cnt>50):

val.pop(0)#keep the plot fresh by deleting the data at position 0





Arduino Code:


int sensorpin = A0;

void setup() {

// initialize serial communication at 115200 bits per second to match that of the python script:

Serial.begin(115200);

}

void loop() {

// read the input on analog pin 0:########################################################

float sensorValue = analogRead(sensorpin);

byte data = Serial.read();

if (data == 's')

{

Serial.println(sensorValue);

delay(10); // delay in between reads for stability

}

}


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    两线式4—20ma电流信号传感器接线; 在一些自动化设备上,我们经常关于压力,温度等物理量的采集。也就是所谓的模拟量的信号的读取。一般我们多采用4-20ma电流信号。主要......
    流电压信号和0-20ma的电流信号;模拟量输出则是检测变频器运行状态的如运行电压、运行电流、功率和我们要检测的频率值都能以模拟量的形式给出。同样输出的形式有电压信号和电流信号,这个......
    床的电气控制中应用也比较普遍,这些应用中常见的是将PLC用于开关量的输入和输出控制。随着PLC技术的发展,它在位置控制、过程控制、数据处理等方面的应用也越来越多。 PLC采集、处理模拟量的一般过程在PLC组成......
    基于ADC0809和AT89S52单片机的数字电压表的设计;1.引言 本设计待测的输入电压为8路,电压范围为0~5V,使用目前广泛使用的AT89S52来做控制系统,用ADC0809来进行模拟电压的采集......
    西门子PLC S7-1200软件编写总结;1.SM1234模拟量模块输入档位的选择及数字量的对应计算。 根据数据手册,该型号的模拟量输入范围有:±10V、±5V和±2.5V,在应......
    连续变化的电压或电流表示的信号,也就是以模拟量的形式表示的信号。在Arduino中,的范围是0V到5V。 上共有6个模拟接口,从A0到A5。其中A0到A5接口也可以用作数字接口,编号为14到19。A4......
    信号可能会存在信号衰减和信号干扰。因为在信号传输过程中,信号可能会被电线电阻和电磁干扰等因素损失或变形,导致实际接收到的信号与原始信号存在较大偏差。此外,从PLC直接读取模拟量信号还存在一些其他问题。例如,PLC通常只能提供有限的采......
    是一个16位8通道模拟量输入模块,可以直接采集热电偶信号,可以分别对应不同的热电偶信号,本文中用到其中3个模拟输入通道,分别用于测试炉体加热管温度、被测材料附近温度和位移传感器环境温度。ADAM一......
    较齐全且能扩展的汽车行驶记录仪。 本记录仪采用带ARM7内核的LPC2104型CPU作为主控机,大容量闪速存储器作为存储载体,带有精确的时钟电路,利用高精度A/D转换器采集汽车传感器转换的模拟量,并直......
    设置改为允许,平均处理指令可选择采样。如图3-3所示。 图3-3 模拟量输入基本设置 (2)模拟量输入应用设置: 当温度在0℃时,模拟量的输入电压是0V;当温度在150℃时,模拟量的输入电压是10V......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>