如何使用安装在树莓派上的 DAQ 测量加速度计
IEPE(集成电子压电)传感器用于测量加速度、压力或力。这些类型的压电传感器包含内置的独立转换电子设备,用于将来自压电传感器的信号转换为低阻抗电压信号。
该项目将演示如何使用 MCC 172 DAQ HAT(与 Raspberry Pi 结合使用)来测量从此类传感器接收到的信号。使用的传感器用于振动,可以安装在不同的地方,以监测不同设备的状态。
所需的硬件和软件
该项目使用 MCC 172 IEPE Measurement DAQ HAT 和 Raspberry Pi 读取输出 IEPE 传感器。该项目使用的传感器是 805 加速度计 500G IEPE T05-3(data sheet)。面包板和电线用于连接到 HAT 通道,如下所示。
在软件方面,需要以下内容:
– Raspbian OS
– GIT
– Python libraries
– MCC DAQ HAT Libraries
设置必要的软件
要将 MCC 172 DAQ HAT 与 Raspberry Pi 一起使用,首先要做的是安装制造商提供的库。
以下是步骤:
1.如果使用图形界面,请打开终端窗口并更新您的包列表:
sudo apt update
2.可选:更新已安装的软件包并重新启动:
sudo apt full-upgrade sudo reboot
3.如果未安装安装 git:
sudo apt install git
4.使用 git 将制造商提供的软件包下载到您的用户文件夹:
cd ~ git clone https://github.com/mccdaq/daqhats.git
5.安装库。安装程序将询问您是否要安装 Python 2 和 Python 3 支持。
cd ~/daqhats sudo ./install.sh
要执行固件更新或阅读有关 MCC 172 的更多信息,请访问 MCC DAQ HAT Library documentation.
设置硬件
对于这个项目,我们将使用 IEPE 传感器。 TE Connectivity 的 805-0500 是一款 3 针 IEPE 低成本加速度计,非常适合使用 TO-5 接头的嵌入式应用。 该型号传感器具有 500g 的动态范围和高达 12kHz 的宽带宽。 该传感器可以使用粘合剂安装到要监测的结构上。 在这个项目中,传感器将使用面包板上的 3 个引脚安装,将引脚连接到 MCC 172 的通道以方便使用。 在制造数据表中,它指定了引脚功能。 引脚 1 是传感器的输出,作为参考,传感器封装有一个缺口(如下图所示),接地引脚是相反的。
图 1:传感器连接端口
图 2:传感器 +OUT 引脚
下一步是将输出和接地连接到 MCC 172 的通道 0 输入。市场上有几种类型的 IEPE 传感器连接器,但对于这种传感器,我们将使用螺钉连接器牢固地连接通向 传感器。 该项目的代码以这样一种方式编写,即如果需要,通道 2 也用于第二个传感器。
图 3:连接到 MCC 172
程序流程
挂载组件和安装库后,下面附加的两个文件必须保存在同一个文件夹中。 “daqhats_utils.py”取自示例文件夹,它位于执行使用 git 安装库的步骤后安装的“daqhats”文件夹中。 “main.py”是这个项目的主文件。
– 下载 main.py
– 下载 daqhats_utils.py (确保它与 main.py 位于同一文件夹中)
导入库
要执行测量,我们需要 git 存储库和 daqhats_utils 中的库中提供的一些函数。 我们导入整个 MCC 118 类和一些帮助函数。 “OptionFlags” 用于设置扫描 HAT 上通道提供的值的模式,并使用“HatIDs”和“HatError”函数识别 id 和错误。
读取和显示数据
total_samples_read = 0 read_request_size = READ_ALL_AVAILABLE dt_string = date_time.strftime(“%d/%b/%Y/ %H:%M:%S”)#convert values store in the date_tame to string print('\n\n', dt_string, file=open('log.txt', 'a')) print('\nSamples Read Scan Count Channel 0 Channel 1', file=open('log.txt', 'a')) timeout = 5.0 while True: read_result = hat.a_in_scan_read(read_request_size, timeout) # Check for an overrun error if read_result.hardware_overrun: print('\n\nHardware overrun\n') break elif read_result.buffer_overrun: print('\n\nBuffer overrun\n') break samples_read_per_channel = int(len(read_result.data) / num_channels) total_samples_read += samples_read_per_channel # Display the last sample for each channel,in a maximum number of 12 digits. print('\r{:12}'.format(samples_read_per_channel), ' {:12} '.format(total_samples_read), end='') print('\r{:12}'.format(samples_read_per_channel), ' {:12} '.format(total_samples_read), end='', file=open('log.txt', 'a')) # \r is use to write over the existing line # Display the RMS voltage for each channel. if samples_read_per_channel > 0: for i in range(num_channels): value = calc_rms(read_result.data, i, num_channels, samples_read_per_channel) # Display the value number of 10 digits and 5 digits after the comma print('{:10.5f}'.format(value), 'Vrms ', end=”) # save on a log file the value number of 10 digits and 5 digits after the comma print('{:10.5f}'.format(value), 'Vrms ', end=”, file=open('log.txt', 'a')) stdout.flush() sleep(0.1) print('\n')
读数在循环中执行,直到用户停止扫描或检测到溢出错误。 读取所有可用样本(最大为 read_buffer 的大小)。 由于 read_request_size 设置为 -1 (READ_ALL_AVAILABLE),函数“hat.a_in_scan_read”立即返回当前可用的样本,超时参数被忽略。 函数“hat.a_in_scan_read”返回多个元素:运行、硬件溢出、缓冲区溢出、触发和超时,所有都是布尔类型,数据是浮点列表。 数据返回是我们接下来将用来显示从缓冲区读取的信息的数据。
samples_read_per_channel = int(len(read_result.data) / num_channels) total_samples_read += samples_read_per_channel
“samples_read_per_channel”用于显示获取的数据列表中的编号,并显示它。 “total_samples_read”存储样本总数。 这些数字以 12 位数字格式显示。
如果缓冲区中有样本,则程序将开始显示。 对于每个通道,其结果保存到列表中的某个值,每个值的位置是所用通道数的倍数。 为了显示,我们使用一个索引,为每个读数保存每个通道上每个样本的位置。
f samples_read_per_channel > 0: for i in range(num_channels): value = calc_rms(read_result.data, i, num_channels, samples_read_per_channel) # Display the value number of 10 digits and 5 digits after the comma print('{:10.5f}'.format(value), 'Vrms ', end='') # save on a log file the value number of 10 digits and 5 digits after the comma print('{:10.5f}'.format(value), 'Vrms ', end=”, file=open('log.txt', 'a'))
对于终端中显示的每个值,每个显示值的副本都保存在日志文件中。 为此,在显示每个数据值后,我们有另一个以“file=open(‘log.txt’, ‘a’))”结尾的打印行是在 Python 中处理文件的函数,该函数需要两个参数:文件名和模式。 “a” 在此模式下,打开一个文件以进行追加,如果该文件不存在,将创建一个具有文件名的文件。
数值显示格式
def calc_rms(data, channel, num_channels, num_samples_per_channel): “”” Calculate RMS value from a block of samples. “”” value = 0.0 index = channel for _i in range(num_samples_per_channel): value += (data[index]* data[index]) / num_samples_per_channel index += num_channels return sqrt(value)
在终端中,缓冲值显示为 Vrms(均方根电压)。 RMS 值是瞬时值平方函数的平均值的平方根。 IEPE 传感器的输出是 8 到 12 V 之间的正弦偏移。比较 MCC 172 读取的这些值的一种方法是计算 RMS 值。 这个值比读取 DAQ 直接发送的值更容易解释。 在值显示在终端之前调用 calc_rms 函数。
for i in range(num_channels): value = calc_rms(read_result.data, i, num_channels, samples_read_per_channel)
启动脚本
要启动 Python 脚本,请使用以下命令在保存两个文件的文件夹中打开一个终端。
python main.py
之后,终端中会出现 MCC 172 所在的地址。 回答问题以启用 IEPE,其中 y 表示是,n 表示否。 之后,终端应显示:如何设置 HAT(连续扫描)、IEPE 电源状态、正在使用的通道,以及最后设置为工作的扫描速率。 按下 ENTER 键后,程序将开始扫描。 第一次运行时,程序将创建一个日志文件。 第一行将包含开始和保存扫描的日期和时间。 然后在日志文件中,将终端中显示的数据保存在不同的行中。 再次执行程序时,数据将保存在上次写入的最后一行之后的同一个日志文件中。
图 4:终端显示
图 5:日志文件
显示的解释如下:
– Samples Read 是显示的样本数,在缓冲区填满后重置为 0。
– Scan Count 是读取的样本总数,当缓冲区已满时它不会重置并继续计数。
– 通道0 和通道1 是该通道读取的值。
结论
该项目是 MCC 172 DAQ HAT 如何与基于 IEPE 的加速度计一起用于监测突然运动或振动的示例。 借助其他 IEPE 传感器,还可以监测力和压力。 该代码无需任何修改即可使用其他类型的 IEPE 传感器。
这个加速度计可以测量几个方向?
树莓派供电能够带动该传感器吗?