基于树莓派的示波器项目

描述

大家好,欢迎来到今天的帖子。成为创客最迷人的事情之一是知道如何开发临时工具,当您拥有这种多功能性时,您将永远不会陷入任何项目的工作。所以今天,我将分享如何构建电气/电子工程中最重要的工具之一的基于Raspberry Pi的临时版本;示波器。

示波器是一种电子测试仪器,可以可视化和观察变化的信号电压,通常作为二维图,其中一个或多个信号与时间的关系图。今天的项目将寻求使用Raspberry Pi和模数转换器模块复制示波器的信号可视化功能。

项目流程:

使用 Raspberry Pi 复制示波器的信号可视化将需要以下步骤;

1. 执行输入信号的数字到模拟转换

2. 准备结果数据以进行表示

3. 在实时图上绘制数据

该项目的简化框图如下图所示。

示波器

项目要求

该项目的要求可分为两类:

硬件要求

软件要求

硬件要求

要构建此项目,需要以下组件/部件;

树莓派 2(或任何其他型号)

8 或 16GB SD 卡

局域网/以太网电缆

电源或 USB 数据线

ADS1115 模数转换器

LDR(可选,用于测试)

10k 或 1k 电阻

跳线

面包板

监视器或任何其他查看 pi 桌面的方式(包括 VNC)

软件要求

该项目的软件要求基本上是用于数据可视化的python模块(matplotlib和drawnow)和用于与ADS1115 ADC芯片接口的Adafruit模块。在我们继续时,我将展示如何在树莓派上安装这些模块。

虽然本教程无论使用哪种树莓派操作系统都可以工作,但我将使用树莓派拉伸操作系统,我假设您熟悉使用 Raspbian 拉伸操作系统设置 Raspberry Pi,并且您知道如何使用 putty 等终端软件 SSH 进入树莓派。如果您对此有任何问题,本网站上有大量的树莓派教程可以提供帮助。

所有硬件组件就绪后,让我们创建原理图并将组件连接在一起。

电路图:

为了将模拟输入信号转换为可以使用Raspberry Pi可视化的数字信号,我们将使用ADS1115 ADC芯片。该芯片变得很重要,因为Raspberry Pi与Arduino和大多数微控制器不同,没有板载模数转换器(ADC)。虽然我们可以使用任何兼容树莓派的ADC芯片,但我更喜欢这款芯片,因为它的高分辨率(16位)和Adafruit的有据可查的数据表和使用说明。您还可以查看我们的树莓派ADC教程以了解更多信息。

ADC是基于I2C的器件,应连接到树莓派,如下图所示。

为清楚起见,下面还介绍了两个元件之间的引脚连接。

示波器

ADS1115 和树莓派连接:

VDD – 3.3V

接地 – 接地

SDA – SDA

标准及校正实验所 – 标准及校正实验所

完成所有连接后,启动您的 pi 并继续安装下面提到的依赖项。

示波器

安装树莓派示波器的依赖项:

在我们开始编写 python 脚本以从 ADC 中提取数据并将其绘制在实时图形上之前,我们需要启用树莓派的I2C 通信接口并安装前面提到的软件要求。这将在以下步骤中完成,以便于遵循:

第 1 步:启用树莓派 I2C 接口

要启用 I2C,请从终端运行;

sudo raspi-config

当配置面板打开时,选择接口选项,选择 I2C,然后单击启用。

第 2 步:更新树莓派

在开始任何项目之前,我要做的第一件事就是更新 Pi。通过这个,我确信操作系统上的每件事都是最新的,我不会遇到与我选择在 Pi 上安装的任何最新软件的兼容性问题。为此,请运行以下两个命令:

sudo apt-get update

sudo apt-get upgrade

第 3 步:为 ADC 安装 Adafruit ADS1115 库

更新完成后,我们现在准备从 ADS115 芯片的 Adafruit python 模块开始安装依赖项。通过运行确保您位于树莓派主目录中;

cd ~

然后通过运行安装构建要素;

sudo apt-get install build-essential python-dev python-smbus git

接下来,通过运行克隆库的 Adafruit git 文件夹;

git clone 

https://github.com/adafruit/Adafruit_Python_ADS1x15.git

切换到克隆文件的目录并运行安装文件;

cd Adafruit_Python_ADS1x1z 

sudo python setup.py install

安装后,您的屏幕应如下图所示。

示波器

第 4 步:测试库和 12C 通信。

在继续项目的其余部分之前,测试库并确保ADC可以通过I2C与Raspberry Pi通信非常重要。为此,我们将使用库附带的示例脚本。

当仍在 Adafruit_Python_ADS1x15 文件夹中时,通过运行将目录更改为示例目录;

cd examples

接下来,运行 sampletest.py 示例,该示例以表格形式显示ADC上四个通道的值。

使用以下方法运行示例:

python simpletest.py

如果启用了I2C模块并且连接良好,则应看到如下图所示的数据。

示波器

如果发生错误,请检查以确保ADC与PI连接良好,并且在Pi上启用了I2C通信。

第 5 步:安装Matplotlib

为了可视化数据,我们需要安装 matplotlib 模块,该模块用于在 python 中绘制所有类型的图形。这可以通过运行来完成;

sudo apt-get install python-matplotlib

您应该会看到如下图所示的结果。

示波器

第 6 步:安装Drawnowpython 模块

最后,我们需要安装 drawnow python 模块。该模块可帮助我们提供数据图的实时更新。

我们将通过 python 包安装程序安装 drawnow;pip,所以我们需要确保它已安装。这可以通过运行来完成;

sudo apt-get install python-pip

然后,我们可以使用 pip 通过运行以下命令来安装 drawnow 包:

sudo pip install drawnow

运行它后,您应该得到如下图所示的结果。

示波器

安装完所有依赖项后,我们现在可以编写代码了。

Raspberry Pi 示波器的 Python 代码:

这个Pi示波器的python代码相当简单,特别是如果你熟悉python matplotlib模块。在向我们展示整个代码之前,我将尝试将其分解为一部分并解释代码的每个部分在做什么,以便您有足够的知识来扩展代码以执行更多操作。

在此阶段,切换到显示器或使用VNC查看器非常重要,通过它可以看到Raspberry Pi的桌面,因为正在绘制的图形不会显示在终端上。

以监视器为界面打开一个新的python文件。你可以叫它任何你想要的名字,但我会称它为 scope.py。

sudo nano scope.py

创建文件后,我们要做的第一件事是导入我们将使用的模块;

import time

import matplotlib.pyplot as plt

from drawnow import *

import Adafruit_ADS1x15

接下来,我们创建一个指定 ADS1115 ADC 的 ADS1x15 库实例

adc = Adafruit_ADS1x15.ADS1115()

接下来,我们设置ADC的增益。有不同的增益范围,应根据ADC输入端的预期电压进行选择。在本教程中,我们估计 0 – 4.09v,因此我们将使用 1 的增益。有关增益的更多信息,请查看 ADS1015/ADS1115 数据表。

GAIN = 1

接下来,我们需要创建数组变量,这些变量将用于存储要绘制的数据,另一个变量用作计数。

Val = [ ]

cnt = 0

接下来,我们了解我们使绘图具有交互性的意图,以便我们能够实时绘制数据。

plt.ion()

接下来,我们开始连续ADC转换,指定ADC通道,在本例中为通道0,我们还指定增益。

应该注意的是,ADS1115上的所有四个ADC通道可以同时读取,但1个通道足以进行本演示。

adc.start_adc(0, gain=GAIN)

接下来,我们创建一个函数 def makeFig,以创建和设置将保存我们的实时图的图形的属性。我们首先使用 ylim 设置 y 轴的极限,然后输入绘图的标题和标签名称,然后使用 plt.plot() 指定要绘制的数据及其绘图样式和颜色。我们还可以声明通道(如通道0所示),以便在使用ADC的四个通道时识别每个信号。plt.legend 用于指定我们希望在图上显示有关该信号的信息(例如通道 0)的位置。

plt.ylim(-5000,5000)

plt.title('Osciloscope')

plt.grid(True)

plt.ylabel('ADC outputs')

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

plt.legend(loc='lower right')

接下来,我们编写 while 循环,该循环将用于不断从 ADC 读取数据并相应地更新图。

我们要做的第一件事是读取ADC转换值

value = adc.get_last_result()

接下来,我们在终端上打印值,只是为了给我们另一种确认绘制数据的方法。我们在打印后等待几秒钟,然后将数据附加到为存储该通道的数据而创建的列表 (val) 中。

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

time.sleep(0.5)

val.append(int(value))

然后我们调用 drawnow 来更新绘图。

drawnow(makeFig)

为了确保最新数据是图上可用的数据,我们在每 50 个数据计数后删除索引 0 处的数据。

cnt = cnt+1

if(cnt>50):

val.pop(0)

就这样!

完整的 Python 代码在本教程末尾给出。

树莓派示波器的实际应用:

复制完整的 python 代码并粘贴到我们之前创建的 python 文件中,请记住我们需要一台显示器来查看绘图,因此所有这些都应该通过 VNC 或连接的显示器或屏幕完成。

保存代码并使用运行;

sudo python scope.py

如果您使用了 scope.py 以外的其他名称,请不要忘记更改此名称以匹配。

几分钟后,您应该会看到终端上打印的ADC数据。有时,您可能会收到来自 matplotlib 的警告(如下图所示),该警告应被禁止显示,但它不会影响正在显示的数据或绘图。但是,为了禁止显示警告,可以在代码中的导入行之后添加以下代码行。

Import warnings

import matplotlib.cbook

warnings.filterwarnings(“ignore”, category=matplotlib.cbook.mplDeprecation)

示波器

 

示波器

这就是本教程的伙计们,要全面测试示波器,您可以将电位计等模拟设备连接到ADC上的通道,您应该看到数据随着电位计的每一次转动而变化。

import time

import matplotlib.pyplot as plt

#import numpy

from drawnow import *

# Import the ADS1x15 module.

import Adafruit_ADS1x15

# Create an ADS1115 ADC (16-bit) instance.

adc = Adafruit_ADS1x15.ADS1115()


GAIN = 1

val = [ ]

cnt = 0

plt.ion()

# Start continuous ADC conversions on channel 0 using the previous gain value.

adc.start_adc(0, gain=GAIN)

print('Reading ADS1x15 channel 0')

#create the figure function

def makeFig():

plt.ylim(-5000,5000)

plt.title('Osciloscope')

plt.grid(True)

plt.ylabel('ADC outputs')

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

plt.legend(loc='lower right')

while (True):

# Read the last ADC conversion value and print it out.

value = adc.get_last_result()

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

# Sleep for half a second.

time.sleep(0.5)

val.append(int(value))

drawnow(makeFig)

plt.pause(.000001)

cnt = cnt+1

if(cnt>50):

val.pop(0)
 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分