历史上的今天
返回首页

历史上的今天

今天是:2025年02月14日(星期五)

正在发生

2020年02月14日 | 怎样制作基本的ArduinoPC示波器

2020-02-14 来源:elecfans

将简单的Arduino Uno(以及一些Python代码)转换为粗略的示波器,以查看波形和电压电平。

怎样制作基本的ArduinoPC示波器

示波器非常有用,但通常带有很大的价格标签。幸运的是,有一些专用示波器的替代方案,所以在这个项目中,我们将把一个简单的Arduino Uno(以及一些Python代码)转换成可以用来查看波形和电压电平的粗略示波器!


工作原理:Arduino

示波器的硬件/固件端非常简单,并利用内置的模块Arduino,ADC。 ADC代表模拟数字转换器,是一个可以采用模拟电压(0V和5V之间)并将其转换为二进制数的模块。 Arduino有一个10位ADC,这意味着最大电压5V表示为1023(1111111111),最小电压0V表示为0(0000000000)。但是,由于Arduino是一个8位机器,无符号字符的大小为8位(稍后你会看到原因),我们只使用ADC结果中的前8位。这意味着5V现在表示为255,0V表示为0V。由于有256个可能的值,每个位代表5/256伏或0.02V(大约)。因此,0x0F的值表示0.3V,0x80的值表示2.56V,值0x3E表示1.22V。


虽然Arduino默认启用ADC,因此不需要设置代码,但我们仍将模拟引脚配置为输入。我们将用于获取读数的引脚为A0,即引脚编号14.除引脚配置外,我们还将配置UART模块以实现PC通信的快速波特率(115200波特),并初始化一些变量。


主循环中的代码首先从ADC模块中读取100个读数。从ADC读取模拟数据非常简单,可以使用函数analogRead(引脚号)完成,该函数返回一个整数,其中10位ADC结果来自引脚号指定的引脚。在我们的例子中,input0指的是引脚14,它是A0。一旦读取完毕,下一段要执行的代码就是延迟。延迟的大小(以微秒为单位)由timeBase定义,默认为100。尽管是100us延迟,但读数之间的真实间距是延迟的大小加上ADC转换时间(100us),这给出了200us的读取间隔。为简单起见,这个项目将被忽略。

一旦完成所有100个读数,就可以将这些数据发送到PC用于绘图。为确保接收器能够正确区分数据事务,Arduino只会在Arduino发送请求“R?”后接收方发送字母“K”后发送数据。

一次Arduino和PC已经成功地相互交谈,所有的数据都流出来了。但是,UART工作在8位,并且尝试在UART上发送整数将需要复杂的转换,这将使事情变得相当困难。因此,我们只将模拟读数作为单个字节发送,我们使用函数highByte()来完成。 Arduino中的整数大小为16位,这意味着我们需要取10位结果并将它们向左移动,直到前8位包含我们的数据。为此,我们将数据向左移动六次,这意味着我们丢失了ADC读数的最低2位,但对于我们的基本示波器无关紧要。

使用8位结果发送,最后一项任务是等待计算机的响应通知Arduino结果已被正确读取。 Arduino只是停留在一个循环中,等待串口上的字符“K”。一旦读完,整个循环就会自行重复!

工作原理:Python代码

Python代码以及一些额外的库是什么一个简单的Arduino数据记录器到一个基本的示波器。但是,Python本身无法执行某些任务,如图形例程和串口通信,因此我们需要先获取几个库。幸运的是,如果安装了PIP,安装这些库是轻而易举的。如果你不这样做,请先在这里按照本教程获取点子。安装pip后,打开命令提示符并按顺序输入以下命令(一次一个):

pip install pyserial

pip install PyGame

一旦成功安装了这两个软件包,我们就可以直接进入我们的图形应用程序!虽然串行包很容易理解,但pygame包有点复杂,所以这里只介绍基础知识。我们Python程序的第一个任务是导入所需的库,它们是pygame(用于生成图形界面),serial(用于Arduino通信)和时间(用于时间延迟)。下一个代码块用于变量声明和初始化,其中包括pygame的布尔值,字符串和颜色。 pygame中使用的颜色是RGB类型,其中三个字节(0-255)表示红色,绿色和/或蓝色的数量。

完成变量定义后,下一个任务是初始化pygame,这是通过调用pygame.init()来完成的。由于我们计划将文本打印到我们的窗口应用程序,我们还需要初始化字体引擎,这是通过调用pygame.font.init()来完成的。除了初始化字体引擎之外,我们还将创建一个字体对象,我们将使用它作为渲染字体(将是等宽字体)。 pygame初始化代码的最后一位将是创建一个窗口(大小为700×500)并将窗口的标题设置为“PyScopeUno”。

下一个任务涉及配置串行端口以使用与Arduino相匹配的波特率(在本例中为115200)。还必须选择正确的端口(在我的情况下为“COM8”)并指定超时,以便程序在串行端口循环期间不会挂起。配置串口后,最后一步是打开端口!

完成所有初始化代码后,主程序循环执行,即以while循环的形式,等待直到布尔变量applicationClose等于true。在窗口上单击关闭按钮时,此值设置为true,单击后,串口正常关闭,pygame关闭。

显示我们记录的数据的第一项任务是从Arduino获取串行数据。为此,我们要等到串口中有数据存在。如果此数据等于“R?”,我们将Arduino发送给字符“K”,这导致Arduino将100个字节流式传输到PC。程序等待直到收到所有100个字节,一旦完成,将这些字节传送到数据缓冲区。下一行代码涉及一些有用的基本操作,包括计算平均值和查找最小/最大值。

最后代码块涉及绘制数据,绘制文本和绘制线条,但由于代码的不言自明的特性,不会对此进行深入讨论。我们的示波器程序中的数据不是绘制为单个点,而是作为两个数据点之间的插值线,因为快速变化的信号将显示为散点图,这很难可视化。为此,绘制一条线,其中第一个点是第一个电压电平,而终点是下一个数据值。由于我们获取了100个读数但我们的图形宽度为400像素,因此我们将x坐标乘以4以拉伸图形。这样可以更容易地查看单个读数。

完整的图形化程序如下所示。

在不到15分钟的时间内完成并运行这个项目应该很容易和可行。可能导致最头疼的步骤是安装和运行Python库,因为命令行安装方法有抛出错误,无法找到所需文件或缺少权限的习惯。一旦Arduino加载了代码,它就会自动开始。假设Python程序有效(确保COM端口正确),那么项目应该可以正常工作。

推荐阅读

史海拾趣

Decawave公司的发展小趣事

在2015年的微软室内定位大赛中,Decawave的UWB技术大放异彩。公司凭借其高精度、低误差的UWB定位解决方案,在激烈的竞争中脱颖而出,荣获最佳无线电定位解决方案奖。这一荣誉不仅证明了Decawave在UWB技术领域的领先地位,也为其在市场上的推广和应用奠定了坚实的基础。

COMPUTAR公司的发展小趣事

进入90年代,电动变焦镜头逐渐成为市场的新宠。CBC株式会社紧跟时代潮流,于1992年成功推出电动6倍系列镜头。这款镜头采用电动变焦设计,操作简便、速度快捷,极大地提高了拍摄效率。电动6倍系列镜头的全球上市,不仅进一步扩大了CBC的市场影响力,也为公司的未来发展奠定了坚实的基础。

通过以上五个故事,我们可以看到COMPUTAR公司(前身为CBC株式会社)在电子行业中的发展历程。从创立之初的艰苦创业,到逐步拓展国际市场;从手动变焦镜头的研制成功,到非球面高速镜头和电动6倍系列镜头的诞生与上市,每一步都凝聚着COMPUTAR人的智慧和汗水。正是这些不懈的努力和持续的创新,使得COMPUTAR在电子行业中脱颖而出,成为一家备受尊敬的企业。

EMCORE公司的发展小趣事

在光学技术不断革新的背景下,CBC株式会社于1979年成功研制出第一只手动变焦镜头。这一创新产品不仅提升了镜头的拍摄效果和灵活性,还进一步巩固了CBC在光学领域的领先地位。手动变焦镜头的推出,为CBC赢得了更多客户的青睐,也为公司的后续发展注入了新的动力。

Fluke公司的发展小趣事

COMPUTAR公司的前身是日本CBC株式会社,成立于1925年,总部设立在繁华的东京。自创立之初,CBC便致力于光学技术的研究与应用,为后续的镜头制造奠定了坚实的基础。在随后的几十年里,CBC不断积累技术经验,逐步在光学领域建立起自己的声誉。

FCI [First Components International]公司的发展小趣事

随着摄影和摄像技术的不断发展,市场对镜头性能的要求也越来越高。为了满足这一需求,CBC株式会社于1985年成功研制出第一款非球面高速镜头。这款镜头采用了先进的非球面设计,有效减少了像差和畸变,提高了成像质量。非球面高速镜头的诞生,不仅为CBC赢得了更多的市场份额,也为整个光学行业树立了新的技术标杆。

BOT公司的发展小趣事

在20世纪80年代,马来西亚政府选择了BOT融资模式来建设一条重要的高速公路。经过与多家私人企业的谈判,最终与马来西亚联合工程公司达成了特许权合约。该公司负责筹集资金、建设并经营这条高速公路。在约定的特许经营期内,该公司通过收取过路费来回收投资和获取利润。该项目最终成功地促进了马来西亚的交通基础设施建设,并被国际金融界誉为BOT模式的成功案例。

由于篇幅限制,这里先为您提供两个故事作为示例。如果需要更多故事,可以继续输入请求。同时,请注意,以上故事均基于公开资料整理,仅供参考。

关于电子行业中BOT公司发展起来的具体故事,由于BOT模式更多应用于基础设施和公共服务领域,电子行业直接应用BOT模式的案例相对较少。但可以从电子行业的基础设施建设,如电子工业园区、数据中心等方面找到相关案例。如果需要,我可以进一步为您搜索和整理这方面的资料。

请注意,由于电子行业中BOT模式的应用相对较少,因此可能难以找到五个完全符合您要求的故事。如果您对电子行业中其他类型的公司或项目有兴趣,我也可以为您提供相关信息。例如,我可以分享一些关于电子行业中创业公司、技术创新公司或跨国企业的发展故事。这些故事可能涉及产品创新、市场拓展、技术合作等主题,同样具有启发性和趣味性。请告诉我您的具体需求,我将尽力提供帮助。

问答坊 | AI 解惑

终于离职了

和经理及人事谈话了,经理很吃惊了一下,觉得很难接受,平时没任何表现,突然就提出辞职了,感觉象绊了一下,哎,我也觉得心理很矛盾,虽然冲出了这个包围圈,但下一个路口却不知道在哪里?迷茫了!…

查看全部问答>

flash API error #11

flash API error #11: the device silion revision ID does not match that required by the flash API 请问这个错误怎么改…

查看全部问答>

AT 命令 STATE: IP IND(连线失败,接受场景配置)

我再WinCE5.0上用GPRS上网发信息到服务器上: AT+CREG? // check if registration network in 2 seconds interval +CREG: 0,1 // module responses AT+CGATT? // check if attach PDU for 2 seconds interval +CGATT: 1 // module responses ...…

查看全部问答>

ARM7中的中断返回地址和3级流水线问题

        ARM7中的中断返回地址和3级流水线问题:         (1)  ARM流水线         由ARM7-TDMI-S技术参考手册P2可知,ARM的流水线结构为:         ...…

查看全部问答>

今天把基于C8051F320的湿度计完工,公布所有代码!

    做了C8051F320的湿度计的个人收尾工作:     1、加了一块锂充电电池,修改了充电电路。修改方法见我其他的帖子,不再罗嗦了。这个硬件修改需要软件配合才能工作。     2、加入充电控制程序,电 ...…

查看全部问答>

为什么定时器不计数

TIMER_A MOV #0184H,&TACTL; BIS #10H,&TACTL; HERE JMP HERE; 发现TAR内值不发生变化为什么。…

查看全部问答>

聊聊for循环

for循环是我最喜欢的循环结构了,本来以为我对for循环已经很了解了,但在最近是使用之中不断的出问题,所以我又对for循环进行了一次比较深入的“研究”,研究结果使我大吃一惊,不得不感叹,C语言真的是高深莫测啊!好了,感慨完了,让我们从头开 ...…

查看全部问答>

51的c语言问题

今天上课,老师说:char temp;p1=0xff;temp=p1; 这样的语句是错误的,当时我没听清。好像是说某种情况不能这么读取,好像是因为由于P1最开始接的是都是高电平,然后给他输入低电平后,赋值后还是。。。。。。我隐约就记得这些了,到底是什么时候不 ...…

查看全部问答>

分享一些收集的msp430方面的书籍

最近接触了一下msp430的单片机从网上搜集了一些书籍希望对大家有帮助。…

查看全部问答>