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,一经查实,立即删除!

相关文章

php箱子,webshell箱子php版本.rar

压缩包 : webshell箱子php版本.rar 列表api.phpconfig.phpindex.php安装说明.txtadmin/config.phpadmin/exit.phpadmin/help.phpadmin/index.phpadmin/login.phpadmin/root.phpadmin/shell.phpdata/1141056911#!.datimages/0.gifimages/1.gifimages/10.gifimages/2.gifimages/3…

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

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

php抓取页面生成html,PHP smiple html dom抓取页面内容

之前做页面抓取,数据采集等功能的时候,第一个想到的就是用正则表达式去匹配页面内容。但是对于像我这种,正则只懂皮毛的人来说,写正则是真的很恶心的一件事。去网上找,也不一定能改成自己需要的正则。今天给大家推荐一…

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源码网站。目前,各大高校都纷纷建立了自己的镜像站,一些有实力的大厂也开始为开源事…

php ci上传图片,CodeIgniter上传图片成功的全部过程分享

/*注意,这里是userfile,$this->upload->do_upload(),这里do_upload默认上传文件的表单名为userfile;当然也可以使用do_upload($filename),这里的$filename一定要和form_upload()里面的字符串一致.我在这里范了糊涂,最后看了手册才明白,希望大家注意哦!*/controller代码: …

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

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

python原理书籍_python书籍推荐:《深入浅出深度学习:原理剖析与Python实践》

在过去的这十年,深度学习已经席卷了整个科技界和工业界,2016年谷歌阿尔法狗打败围棋世界冠军李世石,更是使其成为备受瞩目的技术焦点。今日,小编就为大家推荐一本能让初学者和“老司机”同样感到非常有用的机器学习图书——《深入…

java kcp,重新认识KCP - osc_rreaoxa0的个人空间 - OSCHINA - 中文开源技术交流社区

什么是KCPKCP是一种网络传输协议(A Fast and Reliable ARQ Protocol),可以视它为TCP的代替品,但是它运行于用户空间,它不管底层的发送与接收,只是个纯算法实现可靠传输,它的特点是牺牲带宽来降低延迟。因为TCP协议的大…

python科学计算第三版-python科学计算pdf下载

python科学计算第二版是一本Python语言基础教程,由张若愚编著,小编从网上收集而来,为各位免费提供下载和阅读;本书将使用Python各种扩展库完成数值计算、界面制作、三维可视化、图像处理、提高运算速度等任务。 ​python科学计算第…

pakeage php国内镜像,Packagist/Composer中国全量镜像 | 严佳冬

有两种方式启用本镜像服务:1.将配置信息添加到 Composer 的配置文件 config.json 中(系统全局配置)。2.将配置信息添加到单个项目的 composer.json 文件中(单个项目配置)。1:修改 composer 的全局配置文件(推荐方式)打开命令行窗口(windows用户)或控制台…

分割函数python_python strip() 函数和 split() 函数的详解及实例

一直以来都分不清楚strip和split的功能,实际上strip是删除的意思;而split则是分割的意思。因此也表示了这两个功能是完全不一样的,strip可以删除字符串的某些字符,而split则是根据规定的字符将字符串进行分割。下面就详细说一下这…

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

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

matlab库存点仿真教程,基于MATLABSimulink库存系统建模与仿真.doc

基于MATLABSimulink库存系统建模与仿真基于MATLABSimulink库存系统建模与仿真摘要:库存系统是管理系统中最普遍的一种,在库存系统中要通过不同的需求情况,确定何时订货和定多少货为宜。本文通过对经济批量订货库存系统的分析,建立…

python 执行文件内容_python执行文件

{"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云文件存储NAS是一个可共享访问&#xf…

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

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

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

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