用于树莓派的数据采集卡MCC简介及代码_树莓派 4b如何接 mcc118-程序员宅基地

技术标签: 算法  python  硬件  Linux  树莓派  MCC  数据采集  

树莓派(Raspberry)官网https://www.raspberrypi.org/

树莓派在某些小规模的数据采集和显示方面具有笔记本等大型设备所不具有的小巧灵活特性,入门树莓派同时相当于入门linux系统的小型计算机,树莓派的学习应用为后面的嵌入式开发也提供有必要的基础和储备,树莓派用于工业的flagship应用当属数据采集,本文主要介绍使用MCC配合树莓派进行数据的采集,同时使用在树莓派的Python程序来进行数据采集和显示。

MCC介绍

主要的MCC说明信息链接:https://mccdaq.github.io/daqhats/overview.html#functional-block-diagram

MCC的数据采集介绍:https://shumeipai.nxez.com/2018/12/28/raspberry-pi-and-mcc118-for-data-collection.html

树莓派上的Python程序实现数据采集

其相应的参考代码可以通过github 查询MCC工程,里面有详细的不同情况代码,其中实时采集的参考代码如下:

方便用于实时采集的MCC数据采集,显示:

#!/usr/bin/env python3
"""
    MCC 118 Control Panel

    Purpose:
        Display the MCC 118 input voltages

    Description:
        This app reads and displays the input voltages.
"""
from daqhats import hat_list, mcc118, HatIDs, HatError
from tkinter import *
from tkinter import messagebox
import tkinter.font
# matplotlib command
import matplotlib

import matplotlib.pyplot as plt

import numpy as np
# matplotlib command

class ControlApp:

    def __init__(self, master):
        self.master = master
        master.title("MCC 118 Control Panel")

        # Initialize variables
        self.device_open = False
        self.open_address = 0
        self.board = None

        # GUI Setup

        self.BOLD_FONT = tkinter.font.Font(
            family=tkinter.font.nametofont("TkDefaultFont")["family"],
            size=tkinter.font.nametofont("TkDefaultFont")["size"],
            weight="bold")

        # Create and organize frames
        self.top_frame = LabelFrame(master, text="Select Device")
        self.top_frame.pack(side=TOP, expand=False, fill=X)

        self.bottom_frame = LabelFrame(master, text="Analog Inputs")
        self.bottom_frame.pack(side=BOTTOM, expand=True, fill=BOTH)

        # Create widgets

        self.dev_label = Label(self.top_frame, text="MCC 118 address:")
        self.dev_label.grid(row=0, column=0)

        self.open_button = Button(self.top_frame, text="Open", width=6, command=self.pressedOpenButton)

        # Get list of MCC 118 devices for the device list widget
        self.addr_list = self.listDevices()

        if len(self.addr_list) == 0:
            self.device_lister = Label(self.top_frame, text="None found")
            self.open_button.config(state=DISABLED)
        else:
            self.device_variable = StringVar(self.top_frame)
            self.device_variable.set(self.addr_list[0])
            self.device_lister = OptionMenu(self.top_frame, self.device_variable, *self.addr_list)

        self.device_lister.grid(row=0, column=1)
        self.open_button.grid(row=0, column=2)

        self.checkboxes = []
        self.check_values = []
        self.channel_labels = []
        self.voltages = []
        for index in range(mcc118.info().NUM_AI_CHANNELS):
            # Checkboxes
            self.check_values.append(IntVar())
            self.checkboxes.append(Checkbutton(self.bottom_frame, variable=self.check_values[index], command=lambda index=index:self.pressedCheck(index)))
            self.checkboxes[index].grid(row=index, column=0)
            self.checkboxes[index].select()
            # Labels
            self.channel_labels.append(Label(self.bottom_frame, text="Ch {}".format(index), font=self.BOLD_FONT))
            self.channel_labels[index].grid(row=index, column=1)
            self.channel_labels[index].grid_configure(sticky="W")
            # Voltages
            self.voltages.append(Label(self.bottom_frame, text="0.000", font=self.BOLD_FONT))
            self.voltages[index].grid(row=index, column=2)
            self.voltages[index].grid_configure(sticky="E")

            self.bottom_frame.grid_rowconfigure(index, weight=1)

        self.bottom_frame.grid_columnconfigure(1, weight=1)
        self.bottom_frame.grid_columnconfigure(2, weight=1)

        self.bottom_frame.bind("<Configure>", self.resizeText)

        # Disable widgets until a device is opened
        self.disableControls()

        master.protocol('WM_DELETE_WINDOW', self.close) # exit cleanup

        icon = PhotoImage(file='/usr/share/mcc/daqhats/icon.png')
        master.tk.call('wm', 'iconphoto', master._w, icon)

    def resizeText(self, event):
        new_size = -max(12, int(event.height / 12))
        self.BOLD_FONT.configure(size=new_size)

    def pressedCheck(self, index):
        if self.check_values[index].get() == 0:
            self.channel_labels[index].config(state=DISABLED)
            self.voltages[index].config(state=DISABLED)
        else:
            self.channel_labels[index].config(state=NORMAL)
            self.voltages[index].config(state=NORMAL)

    def disableControls(self):
        # Enable the address selector
        self.device_lister.config(state=NORMAL)
        # Disable the board controls
        for child in self.bottom_frame.winfo_children():
            child.config(state=DISABLED)

    def enableControls(self):
        # Disable the address selector
        self.device_lister.config(state=DISABLED)
        # Enable the board controls
        for child in self.bottom_frame.winfo_children():
            child.config(state=NORMAL)

    def listDevices(self):
        self.dev_list = hat_list(HatIDs.MCC_118)
        addr_list = ["{}".format(dev.address) for dev in self.dev_list]
        return addr_list

    def openDevice(self, address):
        try:
            self.board = mcc118(address)
        except:
            return False
        else:
            return True

    def closeDevice(self):
        self.board = None

    def updateInputs(self):
        if self.device_open:
            for channel in range(mcc118.info().NUM_AI_CHANNELS):
                if self.check_values[channel].get() == 1:
                    value = self.board.a_in_read(channel)
                    self.voltages[channel].config(text="{:.3f}".format(value))
                    # corresponing with the channel 1
                    #t = np.arange(1, 10000, 1)
                    s=self.board.a_in_read(1)
                    fig, ax = plt.subplots()

ax.plot( s)




            # schedule another update in 200 ms
            self.master.after(200, self.updateInputs)

    # Event handlers
    def pressedOpenButton(self):
        if self.open_button.cget('text') == "Open":
            # Open the selected device
            address = int(self.device_variable.get())
            if self.openDevice(address):
                self.device_open = True
                self.open_address = address

                self.enableControls()

                # Periodically read the inputs and update controls
                self.updateInputs()

                self.open_button.config(text="Close")
            else:
                messagebox.showerror("Error", "Could not open device.")
        else:
            if self.device_open:
                self.closeDevice()
                self.device_open = False
            self.open_button.config(text="Open")
            self.disableControls()

    def close(self):
        self.master.destroy()


root = Tk()
app = ControlApp(root)
root.mainloop()

该文主要用于MCC的数据采集入门,通过树莓派结合MCC,Python 实现数据的采集,处理,显示等基础功能 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/soga235/article/details/108864811

智能推荐

职称计算机在线模拟考试,2017职称计算机考试Windows模拟试题-程序员宅基地

文章浏览阅读256次。2017职称计算机考试Windows模拟试题习题的练习有利于知识点的复习,下面是小编给大家提供的职称计算机考试Windows模拟试题,大家可以参考练习,更多习题练习请关注应届毕业生考试网。1 Windows"回收站"中不可能有 。答案: DA 文件夹B 硬盘中的文件C 快捷方式D 软盘中的文件2 在windows资源管理器中,当前文件夹为D;\考试,选择其中的文件A.DOC,按住Shift键,用鼠..._在windows10操作环境下,文件命名错误的是

语音识别ASR背后的原理_asr算法识别静音是怎恶魔做到的-程序员宅基地

文章浏览阅读967次,点赞10次,收藏19次。语音识别技术(Automatic Speech Recognition)是一种将人的语音转换为文本的技术。_asr算法识别静音是怎恶魔做到的

第五章 微服务框架-Spring Boot、Spring Cloud_springboot微服务-程序员宅基地

文章浏览阅读526次。随着动态语言的流行(Ruby、Groovy、 Scala、 Node.js) ,Java的开发显得格外的笨重繁多的配置、低下的开发效率、复杂的部署流程以及第三方技术集成难度大。在上述环境下,Spring Boot应运而生。它使用“习惯优于配置”(项目中存在大量的配置,此外还内置了一个习惯性的配置 ,让你无需手动进行配置)的理念让你的项目快速的运行起来。_springboot微服务

如何查看数据包路由和转发情况_看发送的数据包的转发过程-程序员宅基地

文章浏览阅读1.7k次。tcpdump是一个强大的网络分析工具,可以捕获和分析网络流量。它可以应用于任何网络接口,包括veth、bridge等设备。例如,你可以使用以下命令来捕获在某个veth设备上的流量:其中vethXXX是你想要观察的veth设备的名称。: ip命令是一个多功能的网络配置工具。你可以使用它来查看网络设备、路由表、ARP表等信息。例如,你可以使用以下命令来查看veth设备的状态:你还可以使用以下命令来查看路由表:: netstat命令可以显示网络连接、路由表、接口统计等信息。_看发送的数据包的转发过程

计算两个经纬度点之间的距离_getdistance求经纬度之间的距离-程序员宅基地

文章浏览阅读1.2k次。计算经纬度点之间距离的算法 getDistance(lat1, lng1, lat2, lng2) { const radLat1 = lat1 * Math.PI / 180.0; const radLat2 = lat2 * Math.PI / 180.0; const a = radLat1 - radLat2; con..._getdistance求经纬度之间的距离

Unity + Grpc + protobuf + C# 使用流程详解_unity grpc-程序员宅基地

文章浏览阅读3.7k次,点赞11次,收藏30次。最近公司的一个unity项目要把通信方式从Photon替换成grpc,正好系统学一下grpc,以下是我的学习心得。本篇博客系统详细地介绍了unity使用grpc通信的全部要点,希望可以帮助到大家。奥利给!详解目录一、本篇博客知识点简介二、资源及工具的下载地址1、protocolBuffer各个版本2、GRPC3、grpc_unity_package.2.27.0-dev4、.NET Core SDK 2.1及以上三、C#使用Grpc方法流程1、新建项目2、定义服务3、使用GRPC.Tools自动生成.c_unity grpc

随便推点

记录一次kafka内存溢出,消费慢_kafka消费导致内存泄露-程序员宅基地

文章浏览阅读1k次。记录一次kafka内存溢出,消费慢_kafka消费导致内存泄露

前端学习week9-程序员宅基地

文章浏览阅读933次,点赞12次,收藏29次。数据存储在用户浏览器中设置、读取方便、甚至页面刷新不丢失数据容量较大,sessionStorage和localStorage约5M左右正则表达式是用于匹配字符串中正负组合的模式。在JavaScript中,正则表达式也是对象,通常用来查找、替换哪些符合正则表达式的文本作用:表单验证、过滤敏感词、字符串中提取我们想要的部分const 变量名 = /表达式/其中/ /是正则表达式字面量基于VueCli自定义创建项目架子安装脚手架创建项目。

解决syszuxpinyin重复点击lineEdit无法弹出输入法界面和无法删除原有内容问题_qlineedit输入中文无法删除-程序员宅基地

文章浏览阅读2.1k次。解决方法均来源于论坛,自己把它给整理一下1,因为自己做的界面用到了lineedit,但是发现第一次点击lineedit获得焦点就可以弹出输入法界面,但是再重复点击的时候就不能弹出来了,必须重新获得焦点,于是通过重载重载了QLineEdit的mousePressEvent在mousePressEvent加上一个自定义的信号 emit clicked()重载代码如下:mylineedi_qlineedit输入中文无法删除

jeb 下载-程序员宅基地

文章浏览阅读1k次。jeb-1.5.201408040(full)_keygen_by_scz(20150725) http://scz.617.cn/ 修改jeb_wincon.bat 中java home 变量,然后就可以启动 注册机 java kegen_jeb下载 csdn

python绿色参数_Python进阶三部曲之IO操作-程序员宅基地

文章浏览阅读60次。IO编程文件读写打开文件open(file, mode='r', buffering=None, encoding=None, errors=None, newline=None, closefd=True) 具体需要查看API,这里只介绍几个常用的方法。open函数的文件名是必传参数,返回一个文件对象#打开一个文件。f = open('read.txt', 'r')open函数的mode参数:值..._python程序里面传进去的参数是绿色

高通平台8953 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇)_高通提取dtb-程序员宅基地

文章浏览阅读5.8k次,点赞3次,收藏61次。本系列导航:高通平台8953 Linux DTS(Device Tree Source)设备树详解之一(背景基础知识篇)高通平台8953 Linux DTS(Device Tree Source)设备树详解之二(DTS设备树匹配过程)高通平台8953 Linux DTS(Device Tree Source)设备树详解之三(高通MSM8953 android7.1实例分析篇)一.什么是DTS?为..._高通提取dtb

推荐文章

热门文章

相关标签