wringPi 初始化GPIO 为上拉_玩转GPIO之PWM点亮呼吸灯(非树莓派)

在这篇文章,我介绍了基于逸宸电子开发的总线适配器来点亮LED灯的基本方法!

myastrotong:玩转GPIO之点灯(非树莓派)​zhuanlan.zhihu.com

这款总线适配器的介绍见这里:

工业级高速USB转SPI I2C PWM GPIO UART CAN接口电压可软件配置​item.taobao.com
77b2648518b2a573b315cabca90e6144.png

没错,就是这个物件,一款USB转GPIO等常见接口的总线适配器,看上去牛皮的不得了。

378d28076a04c51281b0a4ebd140171a.png

学会了点灯,自然要挖掘一些高级点的玩法,以下是基于这个总线适配器点亮呼吸灯的玩法。

在很多需要调光的场合都采用PWM(脉冲调制)的方式调光(也称为“数字调光”),就是在固定流经LED的电流大小的情况下,通过占空比可调节的PWM脉冲来反复控制LED的导通和关断 。 导通的时候LED按照设定好的电流值发出相应亮度的光,关断的时候LED不亮。如果PWM脉冲的重复周期高于人眼视觉暂留需要的频率,特别是达到50Hz以上后,一般人眼就觉察不出LED的闪烁了,从而通过改变PWM脉冲的占空比就能够改变LED的亮度。

熄灭之前就又打开了,那么灯实际上是会维持在一个亮度的,或者你的眼睛看上去灯会维持在一个亮度。如果你一直保持某一个固定的频率,那么电灯就会保持一个固定的亮度。理论上,你可以通过调整开灯持续的时间长度和关灯持续的时间长度的比例,从而得到不同亮度。这个比例被称为“占空比”。
通过调整“占空比”就可以做到呼吸灯的效果。
准备硬件:一个三色信号灯(你也可以选择一个发光二极管和一个电阻,我这里仅仅是为了方便)、两根母对公杜邦线。

查询官方文档,总线适配器的各个GPIO的定义如下:

52ae3957f1133a67ceb4d9066f63977b.png

我选择接入PWM_CH3接口端(也就是P8端口)。白色杜邦线接入CH3接口和三色灯的G口,黄色杜邦线接入总线适配器的GND端和三色灯的GND端。

接好的效果图如下:

6e3893746a9d17c04794f102fc0c40ba.png

然后基于官方示例文件进行修改。修改examplespythonUSB2PWMUSB2PWM_Test下面的USB2PWM_Test.py文件:

from ctypes import *
import platform
from time import sleep
from usb_device import *
from usb2pwm import *if __name__ == '__main__': DevIndex = 0DevHandles = (c_int * 20)()# Scan deviceret = USB_ScanDevice(byref(DevHandles))if(ret == 0):print("No device connected!")exit()else:print("Have %d device connected!"%ret)# Open deviceret = USB_OpenDevice(DevHandles[DevIndex])if(bool(ret)):print("Open device success!")else:print("Open device faild!")exit()# Get device infomationUSB2XXXInfo = DEVICE_INFO()USB2XXXFunctionString = (c_char * 256)()ret = DEV_GetDeviceInfo(DevHandles[DevIndex],byref(USB2XXXInfo),byref(USB2XXXFunctionString))if(bool(ret)):print("USB2XXX device infomation:")print("--Firmware Name: %s"%bytes(USB2XXXInfo.FirmwareName).decode('ascii'))print("--Firmware Version: v%d.%d.%d"%((USB2XXXInfo.FirmwareVersion>>24)&0xFF,(USB2XXXInfo.FirmwareVersion>>16)&0xFF,USB2XXXInfo.FirmwareVersion&0xFFFF))print("--Hardware Version: v%d.%d.%d"%((USB2XXXInfo.HardwareVersion>>24)&0xFF,(USB2XXXInfo.HardwareVersion>>16)&0xFF,USB2XXXInfo.HardwareVersion&0xFFFF))print("--Build Date: %s"%bytes(USB2XXXInfo.BuildDate).decode('ascii'))print("--Serial Number: ",end='')for i in range(0, len(USB2XXXInfo.SerialNumber)):print("%08X"%USB2XXXInfo.SerialNumber[i],end='')print("")print("--Function String: %s"%bytes(USB2XXXFunctionString.value).decode('ascii'))else:print("Get device infomation faild!")exit()# Initialize adcPWMConfig = PWM_CONFIG()#我选的是P8,对应的PWM是CH3 二进制是1000 ->16进制是0x08PWMConfig.ChannelMask = 0x08for i in range(0,8):PWMConfig.Polarity[i] = 1 # 将所有PWM通道都设置为正极性for i in range(0,8):PWMConfig.Precision[i] = 100 # 将所有通道的占空比调节精度都设置为1%for i in range(0,8):PWMConfig.Prescaler[i] = 10 # 将所有通道的预分频器都设置为10,则PWM输出频率为200MHz/(PWMConfig.Precision*PWMConfig.Prescaler)for i in range(0,8):PWMConfig.Pulse[i] = PWMConfig.Precision[i]*30//100 # 将所有通道的占空比都设置为30%# 初始化PWMret = PWM_Init(DevHandles[DevIndex],byref(PWMConfig));if ret != PWM_SUCCESS:print("Initialize pwm faild!")exit()else:print("Initialize pwm sunccess!")print(DevHandles[DevIndex])# 启动PWM,RunTimeOfUs之后自动停止,利用该特性可以控制输出脉冲个数,脉冲个数=RunTimeOfUs*200/(PWMConfig.Precision*PWMConfig.Prescaler)#RunTimeOfUs=0,表示一直输出  RunTimeOfUs = 0ret = PWM_Start(DevHandles[DevIndex],PWMConfig.ChannelMask,RunTimeOfUs)if(ret != PWM_SUCCESS):print("Start pwm faild!")exit()else:print("Start pwm sunccess!")try:while (True):#改变PWM波形占空比 for j in range(0,101,2):for i in range(0,8):PWMConfig.Pulse[i] = j                 PWM_SetPulse(DevHandles[DevIndex],PWMConfig.ChannelMask,PWMConfig.Pulse)sleep(0.05)     for j in range(100,-1,-2):for i in range(0,8):PWMConfig.Pulse[i] = j                 PWM_SetPulse(DevHandles[DevIndex],PWMConfig.ChannelMask,PWMConfig.Pulse)                sleep(0.05)     except KeyboardInterrupt:pass# 停止PWM# l、et = PWM_Stop(DevHandles[DevIndex],PWMConfig.ChannelMask)# if(ret != PWM_SUCCESS):#     print("Stop pwm faild!");#     exit()# else:#     print("Stop pwm sunccess!")# Close deviceret = USB_CloseDevice(DevHandles[DevIndex])if(bool(ret)):print("Close device success!")else:print("Close device faild!")exit()

关键控制电路部分的代码为:

fc4ceea9326ef547f5a42cfafca3c7e1.png

我选择的是CH03端口,所以对应的

 PWMConfig.ChannelMask = 0x08

然后程序通过修改如下代码来改变占空比:

 PWMConfig.Pulse[i] = j 

并且先通过占空比增加,然后使占空比减小,从而得到呼吸灯暗亮的间歇变化。

效果视频如下:

73c9c7c1c8b876232cf26464c4d947c9.png
点亮一盏呼吸灯https://www.zhihu.com/video/1224789136399835136

以上就是通过PWM来点亮一盏呼吸灯的全部过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/506091.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dnf如何快速拾取物品_DNF手游泰拉该如何获取,游戏蜂窝辅助托管快速获取泰拉...

在DNF手游中,一共存在三种的核心货币——点券,泰拉还有金币。点券是用来买商城道具的主要流动货币,金币则是用来打造装备的,而泰拉是有两种货币的共同点,所以它既能在商城购买各种道具,又能兑换金币。所以说…

java商城_java网上商城系统怎么样?优势又有哪些?

导读:大家都知道Java是一款非常实用的开发语言,而通过Java开发的商城吸引也因为其强大安全性能与使用性能等优势受到了很多企业商家的青睐,那么一款功能丰富的Java商城系统也自然成为...大家都知道Java是一款非常实用的开发语言,而…

php socket keepalive,linux keepalive探测对应用层socket api的影响

问题大部分人都知道tcp的keepalive. 假设读者知道keepalive会如何触发. 这篇文章想讨论keepalive触发后, 对socket使用者的影响.keepalive设置修改/etc/sysctl.confubuntu# vim /etc/sysctl.confubuntu# sysctl -pfs.file-max 131072net.ipv4.tcp_keepalive_time 10net.ipv4.…

qt 文字倾斜投影_帅呆!钢铁侠中的激光投影键盘终于量产了,炫酷又好用

看过电影《钢铁侠》的朋友,估计都会被钢铁侠的各种黑科技所折服,比如钢铁装甲、全息投影、人工智能贾维斯等等。不过这些黑科技想要实现还需要一段时间。但其中有一项黑科技已经被国产厂商实现了,那就是——激光投影键盘。早在去年&#xff0…

手机投电脑_把王者荣耀投屏到电脑上玩更爽哦——投屏神器幕享

今天给大家介绍一款投屏神器,它叫做幕享。直接摆观点——现今最好用的投屏工具,没有之一!它是全平台都有的软件哦,这意味着除了电脑,你还可以在安卓市场和Appstore下载到它。三个平台都有意味着什么呢,心细…

清华大学镜像_国内开源镜像站信息盘点

一、前言开源镜像站点是一个放置开源系统镜像文件的站点,免费提供镜像文件下载服务,可以刻盘也可以直接用虚拟光驱安装操作系统、开源软件、Linux源码网站。目前,各大高校都纷纷建立了自己的镜像站,一些有实力的大厂也开始为开源事…

labview圆环里实物动画图形_有趣的图形教案

有趣的图形教案作为一名优秀的教育工作者,通常会被要求编写教案,教案是保证教学取得成功、提高教学质量的基本条件。怎样写教案才更能起到其作用呢?以下是小编为大家整理的有趣的图形教案,希望对大家有所帮助。有趣的图形教案1活动…

安卓 图像清晰度识别_螺柱焊位置识别算法初稿

为了保证螺柱焊接时,螺柱焊接位置和螺柱所在凸台偏差太远带来的抱怨,打算采用图像识别的方法识别螺柱在所焊接凸台位置是否居中;在凸台上的的螺柱焊通过计算凸台圆弧的圆心和螺柱的圆心偏差来判断螺柱是否在凸台的中心,分以下几个…

电脑音频服务未运行怎么解决_电脑故障维修技巧教程:新手必看的修电脑技巧!...

日常生活工作中,我们的电脑总会出现各种各样的问题,如果掌握了一定的通用修电脑技巧,除了可以解决问题,说不定还能得到帮女神修电脑的机会,俗话说的好,电脑修的好,对象少不了!电脑故…

vue 保留小数点厚一位_2019黑龙江公务员考试行测资料分析:保留有效数字巧解对位数相乘...

在行测考试中,资料分析是很重要的一部分,同学们也都知道这一部分是绝对不能放弃的。资料分析在做题的时候无非就是找数据、列式,最后再计算,那么这个时候问题就来了:数据找得到,列式也能列得对,…

cad计算总长度插件_超实用的CAD插件大合集,视频教程手把手教学,工作效率翻倍...

超实用的CAD插件大合集,视频教程手把手教学,工作效率翻倍!今天被单位新来的实习生给上了一课,才知道原来CAD还有这么多好用便捷的插件。我厚着脸皮要来一份试了一下才体验到快速制图的快乐,这些全是平时制图能用得上的…

在linux操作系统Centos上安装服务器相关软件

如果您的服务器没有图形界面(GUI),您可以通过命令行(终端)来安装和配置Tomcat、JDK和MySQL等软件。以下是在没有图形界面GHome的 Linux 系统上安装这些软件的基本步骤: 对于CentOS Stream 9,您可以按照以下步骤在命令行上安装Tomcat、JDK 和 MySQL 数据库: 1. 安装JD…

rpc 服务器不可用_RPC和微服务

RPC全称Remote Procedure Call,即远程过程调用。其本质上其实就是主机A通过某种网络协议向支持相同协议的主机B发送一个任务执行命令,并且在某些情况下,还能支持任务执行结果的返回。几乎每一个RPC都有着自己的网络协议定义,如果要…

系统分析与控制_质量体系文件:测量系统分析控制程序

本公众号知识分享:体系管理、质量管理、书籍教程;国标行标、团标企标;课件教材、系统培训、资料下载、以及部分软件及教程等; 告诉我您的需求,小编随时恭候为您服务!下面让我们一起开启本章内容学习&#x…

python商城源码_自学Python才几天,就成功编写出俄罗斯方块游戏,附自学教程

人们常说,python不适合做游戏,但我偏爱玩游戏,做不了大的,做个小的也行啊。于是,我在自己毫无基础的条件下,用两天时间学python基础理论,再用已有的俄罗斯方块游戏源码和源文件,在我…

matlab 中曲线颜色,matlab曲线颜色样式设置

满意答案南渡江ndj2013.09.03采纳率:43% 等级:12已帮助:19801人你好 这是我总结的画图资料比如画一条蓝色的x号线plot(x,y,bg)画图:线形:-实线 -. 点划线 --长虚线 :短虚线符号 颜色 符号 线形b 蓝 . 点c 青 。 圈g 绿 标记k 黑 - 实线m …

小程序动态class_会后剧透!百度智能小程序的最新动态都在这儿了!

月活突破5亿,入驻智能小程序数量42万。这是百度智能小程序在万象-百度2020移动生态大会上交出的最新成绩单。当天,百度方面还以“生态进化,共创共荣”为主题,召开了智能小程序分论坛。分论坛上,百度特别邀请了百度副总…

matlab qtdecomp,Opencv图像识别从零到精通(25)------区域分裂与合并

区域分割一般认为有漫水填充,区域分裂与合并,分水岭,这篇是中间的区域分裂和合并。区域分裂合并算法的基本思想是先确定一个分裂合并的准则,即区域特征一致性的测度,当图像中某个区域的特征不一致时就将该区域分裂成4个相等的子区域,当相邻的…

去调频体制下的 rd算法_【技术文章】一次调频工作原理及控制 学习1+1

1、基本概念一次调频:PrimaryFrequencyControl。在电网实际运行中,当电量消耗与电量供给不匹配时,即可引起电网频率出现变化较小、变动周期较短的微小分量,这种频率扰动主要靠汽轮发电机组本身的调节系统直接自动调整汽轮机调门完…

蓝牙版本avrcp怎么选_500元内无线蓝牙耳机测评年轻人的第一款廉价蓝牙耳机怎么选?...

这是马克君的第 90 篇对比测评-建议佩戴耳机体验-?- 10款TWS耳机测评 -TWSTrue Wireless Stereo⇩真无线立体声自AirPods问世以来,真无线耳机的概念开始爆火?。虽然AirPods“真香”,但售价也是真滴贵,所以有没有便宜又好用的真无线蓝牙耳机…