栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

pyboard使用心得记录-基于对sk6812的控制(欢迎补充)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

pyboard使用心得记录-基于对sk6812的控制(欢迎补充)

大家好,本人因项目需求使用了pyboard进行了一些开发,遇到一些问题,在这里总结一下,希望可以帮助到大家,由于涉及到一些我的个人理解,如果有问题和建议,可以在下面进行纠正和补充。

关于MicroPython的效率

pyboard的固件主要包含了MicroPython的环境,可以区别于C语言的编程,实现python编程和交互。这种模式就非常适合于在线控制和记录。但是MicroPyhon的存在使得MCU执行效率远低于C语言,下面举出实例:

我尝试使用GPIO的翻转电平实现pyboard对SK6812RGBW(WS2812) LED阵列进行控制,从led的手册可以了解一个码元周期为1.2us,再进行高低电平区分的话,MCU的翻转电平时间不能超过300us,这对于理论GPIO最高能达到84MHz的stm32f405来数还是不困难的,然而有意思的是当我用python仅进行高低电平翻转并用示波器检测时,翻转速度仅有77KHZ, 即使使用MicroPython中stm库对寄存器直接控制,测试代码如下:

from pyb import Pin,freq
import stm
freq()
led = Pin('Y9',Pin.OUT_PP)

while 1:
#stm.mem32[stm.GPIOA + stm.GPIO_BSRR] = 1 << 2
led.high()
led.low()
关于对sk6812的控制的实现

基于此,如果仍然想用pyboard实现us甚至ns级别的信号控制,还有两个方案:

1 . 如01Studio提供的LEDarray例程中的思路,使用SPI进行控制。硬件SPI的执行不会受到编译环境的影响,可以最高效率地实现信号输出;

由于我手头没有合适接口的LEDarray阵列进行对例程进行测试,我就直接使用示波器来检测信号输出结果。比较匪夷所思的是代码(ws2812.py)中使用的SPI是硬件SPI,而在main.py中定义的管脚是Y11,而Y11并非mosi引脚,而结果也确实没有在Y11中记录到有效的时序信号,不知道是什么问题。但是可以通过示波器记录到Y9的SCK信号。当我将例程中的引脚设置为Y8或者X8的时候,记录到的理想的信号,可惜的是我的硬件设计中Y8X8都另有他用,我只能尝试其他方案。

2 . 使用MicroPyhon中已经包装好的python可以调用的C函数去执行信号输出

实际上,上述使用Y11管脚初始化SPI的时候,控制台就会报出警告说Y11非SPI管脚,建议使用MicroPyhon中提供的SoftSPI代替SPI函数,据了解类似这样的库函数实际上都是C编写的,执行效率会远高于我们用python自行编写的SoftSPI函数,参考 https://docs.micropython.org/en/latest/library/machine.SPI.html#machine.SoftSPI 。当我使用SoftSPI代替01Studio的ws2812.py中的SPI后,成功在Y11中记录到了可以使用的信号。这里@一下01Studio的技术人员是不是例程中有些笔误,当然也有可能是我测试有些细节存在问题导致的。

上述的方法已经可以解决ws2812的控制,并且由于SoftSPI的存在,我在我的硬件上使用其他多余的管脚实现了对LEDarray的控制,但是高频刷新的时候会存在一些抖动,这可能是由于SoftSPI存在一定程度的不稳定性(在示波器中可以观察到),更有可能是我设计LEDarray的时候忘记添加退耦电容()。不过不管使用硬件SPI还是软件SPI,都存在另一个问题,就是太占用管脚了,我只用一个MOSI,但是需要初始化3个管脚,让我本来就留着不多的管脚雪上加霜。

好在在外网和大佬交流后了解,MicroPyhon中专门针对ws2812类似的neopixel提供了module,在pyboard中就叫neopixel.py。兜兜转转,还是官方手册没有仔细看,哭爆。参考:https://docs.micropython.org/en/latest/library/neopixel.html

关于固件更新(hex模式)

为了能节省一些硬件资源,我尝试使用官方提供的代码进行控制,然而当时直接以下测试代码(官方提供的neopixel.py针中第一个导入包的命令)时,会报错:

from machine import bitstream

Traceback (most recent call last):
File " ", line 1, in  
ImportError: can't import name bitstream

这种machine出错就很明显了,是固件太老了。(心累)
接下来需要更新固件。01Studio的教程中有使用Dfuse demo软件进行烧写的过程,写的很详细,不再赘述。在这里有两个点需要说,

1 . 关于驱动
让我很心累的一点,Dfuse demo如国外大部分软件一样,识别com口的时候会按照名称进行识别,有时候你电脑系统语言,时区或者可以用但是不匹配的驱动名称,会使软件识别不到MCU的com。这就涉及到驱动的问题了,本科做比赛的时候见师兄刷新固件都要找一台win7 英文电脑去装,现在可算是明白了,好像是win10/11会自动为USB安装驱动,并且会排斥一些没有签名的驱动(大概就是没有给微软钱所以不被认可的驱动),导致更新驱动的时候总是失败,要么就是没有找到合适的驱动,要么就是该驱动是32位的没法装在64位电脑上,要么就是提示“现在的驱动是最合适的”,反正就是装不上,以至于所有我的片子,不管boot是什么状态,连到我电脑上统一都叫 USB composite device,头大的一批。(01Studio的教程中那个程序框看起来好像是win7或者visia吧,才看起来那么顺利–偷笑)。网上有人说win10/11需要开启安全模式才能把驱动成功安装,我电脑上好多其他硬件的环境,不敢随便乱改,就这样吧,想下别的办法。如果在这方面有类似经历且解决的小伙伴可以提供一下经验。

2 . HEX文件烧录
综上,Dfuse demo在我不更改驱动的情况下是不能用了,但是固件还得更新。好在MicroPyhon除了DFU方式更新外,还可以使用hex文件进行烧录。01Studio教程中没有提到过这一点,在这里简述流程:

首先获取最新的固件,参考网站:https://micropython.org/download/pybv11/ (建议01Studio将该网站写入教程,现在教程中刷固件只让用户用文件里提供的固件,而没有说可以在哪里找到更新的固件)

在网页中可以看到release的固件有两种格式,.dfu和.hex,在这里我们选择.hex。使用Dfuse demo没有问题的可以选.dfu获取最新固件。

烧录hex文件到pyboard的软件叫STM32CubeProgrammer,可以在ST官网下载:https://www.st.com/en/development-tools/stm32cubeprog.html。

下载后安装打开,连接pyboard(同样boot需要拉高电平进入固件烧录模式),点击右上角选择USB(终于不限制名称了), 点击connect,成功连接在右上角会显示。然后选择左边openfile 标签,选择hex文件打开(图片中已经打开),接着点击download等待即可。固件更新成功后会有弹窗提示。流程参考附图。

固件更新好后,使用neopixel.py不再出错,成功完成对sk6812实现控制。学习到很多。

以上就是目前使用pyboard基于对sk6812的控制的使用心得记录,如果对各位有帮助,我会很开心,如果有问题的话欢迎评论交流学习。谢谢大家。

致谢:文中所使用的硬件购自01Studio,其中涉及到一些教程和例程,可以前往其官方论坛获取:https://bbs.01studio.cc/

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1010070.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号