0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

【试用体验】晶心ADP-Corvette-T1编程驱动WS2812B炫彩LED

电子发烧友论坛 2022-06-27 09:35 次阅读

昨天我在 DFRobot Beetle ESP32-C3开发板开发板上,成功用 Adafruit NeoPixel 扩展库,驱动了ws2812B炫彩点阵。具体可见文章:Arduino编程控制WS2812B炫彩LED,既然ADP-Corvette-T1开发板也能用Arduino,那应该可以把类似的程序,按照ADP-Corvette-T1开发板的Arduino支持,使用Adafruit NeoPixel 扩展库来驱动WS2812B。


说干就干,先在Adafruit NeoPixel 扩展库的Arduino开发环境中,安装Adafruit NeoPixel 扩展库,方法如下:

9b4e4066-f4aa-11ec-a2f4-dac502259ad0.png

安装完成后,开发板选择ADP-Corvette-T1,然后点击编译。
没想到,杯具的事情发生了,错误提示:Adafruit NeoPixel 扩展库不支持该开发板。
不甘心,这么通用的WS2812B,一定要办法驱动起来。

仔细看了 ADP-Corvette-T1 的官方资料,了解到如下信息

9b6a4b6c-f4aa-11ec-a2f4-dac502259ad0.png

在开发板上,提供了SPI数据传输接口,而WS2812B真是使用SPI来驱动的。

详细查看板子的定义:

9b7d3e70-f4aa-11ec-a2f4-dac502259ad0.png

IO11可复用为SPI/MOSI,刚好可以用作WS2812B的数据控制。

参考开头提供的文章,最终具体的连线如下:

9b9482f6-f4aa-11ec-a2f4-dac502259ad0.png

具体的实物连线如下:

9baec314-f4aa-11ec-a2f4-dac502259ad0.jpg

直接使用SPI底层设备来驱动,需要使用到Arduino官方的SPI库,其官方网址为:SPI - Arduino Reference

而在此之前,我还分享过另外一篇控制WS2812B的文章:Debian-StarFive下的SPI驱动WS2812B炫彩灯珠,在该篇文章中,就详细的说明了,想要控制,应该如何发送数据。


在上面的这篇分享中,控制的是单颗LED灯珠。在ADP-Corvette-T1开发板上,这次我们要控制8*8点阵共64颗LED灯珠。

通过对Arduino官方的SPI库资料的学习,最终完成了演示代码,实现了流水灯的效果。


在该演示代码中,同时包括:
1. 串口调试输出
2. 板载LED控制
3. SPI控制WS2812B

代码展示:

9bc2c558-f4aa-11ec-a2f4-dac502259ad0.png

上述代码的具体说明:


1. 全局定义:


1). 使用SPI.h,确定使用SPI库
2). 定义灯珠、引脚信息
3). 定义要发送的数据信息;关于其具体的定义,可以查看 Debian-StarFive下的SPI驱动WS2812B炫彩灯珠
4). 定义当前要点亮的灯珠
5). 定义lgiht_n函数,表示通过SPI发送控制数据,当前灯珠发送点亮数据,其他的发送熄灭数据;具体颜色,根据i值取余取前面定义的颜色。

2. 启动设置部分:setup()


1). 设置串口速度
2). 设置D13为输出,用于控制板载的LED3(在板子背面)
3). 定义SPI的传送参数;具体的参数说明,后面详细的说。

3. 循环部分:loop()


1). 串口输出当前要点亮的LED灯珠
2). 根据当前要点亮的灯珠序号取2的余,来亮灭LED3
3). 点亮指定的LED灯珠
4). 延时
5). 指向下一刻灯珠;如果达到最大,则从头开始。

在上面的代码中,SPI参数设置部分,尤为重要。
要设置SPI参数,有两种办法:


1). SPI.setclockDivider():相对于系统时钟设置SPI时钟分频器。
关于分频器的基本知识,我在定时器使用基础:使用系统时基定时器和基本定时器闪烁LED 分享中,有讲过。
因为 ADP-Corvette-T1开发板 的最高频率为 96MHz,我们找一个接近 6.4MHz的分频。


分频器可以使用的系统定义为:
SPI_CLOCK_DIv2,SPI_CLOCK_DIV4,SPI_CLOCK_DIV8, SPI_CLOCK_DIV16,SPI_CLOCK_DIV32,SPI_CLOCK_DIV64,SPI_CLOCK_DIV128
在其中,16分之一接近6.4MHz,所以这里可以使用SPI_CLOCK_DIV16。
在该方式下,其他的参数使用默认值即可。

2). SPI.beginTransaction()
通过传入 SPISettings()获取的定义参数来初始化SPI设备;
SPISettings()具体定义为:SPISettings(speedMaximum,dataOrder,dataMode)
其中:
speedMaximum:表示时钟
dataOrder:表示数据发送优先顺序,MSBFIRST表示高位优先,LSBFIRST表示低位优先。
dataMode:表示SPI的四种操作模式:
2.1) 模式0:默认值,时钟通常为低电平(CPOL = 0),数据在从低电平到高电平(前沿)(CPHA = 0)的转换时采样。
2.2)模式1:时钟通常为低电平(CPOL = 0),数据在从高电平到低电平(后沿)(CPHA = 1)的转换时采样。
2.3)模式2:时钟通常为高电平(CPOL = 1),数据在从高电平到低电平(前沿)(CPHA = 0)的转换时采样。
2.4)模式3:时钟通常为高电平(CPOL = 1),数据在从低电平到高电平(后沿)(CPHA = 1)的转换时采样。

演示代码中,具体传入的为:SPISettings(6400000, MSBFIRST, SPI_MODE0),表示时钟为6.4MHz对应值,高位优先,操作模式为默认值。

编写好代码后,编译下载,就能运行起来:

9be252ec-f4aa-11ec-a2f4-dac502259ad0.png

打开串口,Ardunio的串口工监视器,就能看到串口输出的信息,会显示当前要点亮的灯珠;
把板子翻过来,可以看到背后的LED3在狂闪,因为代码中设置的delay为100毫秒,1秒得有10次。
再看WS2812B炫彩8*8点阵,灯珠按顺序点亮并熄灭。
具体效果,如视频所示。

如在前两篇分享的控制WS2812B的文章中所说,你可以根据自己的需要,让这块WS2812B炫彩8*8点阵呈现出更复杂的效果,行动起来吧!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • led
    led
    +关注

    关注

    242

    文章

    23272

    浏览量

    660788
  • 驱动
    +关注

    关注

    12

    文章

    1840

    浏览量

    85287
收藏 人收藏

    评论

    相关推荐

    基于瑞萨FPB-RA4E2智能床头灯项目——2串口蓝牙通讯

    ;lt;= 1; b <<= 1; pR++; pG++; pB++; } } void WS2812B_Task(void) { uint8_
    发表于 11-22 22:13

    基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED

    (FSP_SUCCESS== err); sci_spi_extended_cfg_tsci_spi_extended_cfg_t1; WS2812B
    发表于 11-22 21:34

    论如何使用WS2812以及类似灯珠

    ​  WS2812 LED灯珠,这是一种非常流行的可寻址RGB LED。每个WS2812 LED内部集成了控制电路,因此可以通过一个数据输入
    的头像 发表于 09-30 15:11 444次阅读
    论如何使用<b class='flag-5'>WS2812</b>以及类似灯珠

    在AvaotaA1全志T527开发板上驱动WS2812 RGB LCD

    对应 R,G,B 三种颜色)数据,剩余的数据经过内部整形处理电路整形放大后通过 DO 端口开始转发输出给下一个级联的 LED 。因此,每经过一个 LED ,数据减少 24bit。 WS28
    发表于 07-22 10:45

    WS2812是否可以反转UART的输出?

    是否可以反转 UART 的输出。输出 1 而不是 0,输出 0 而不是 1。 问题背景:按照以下方案使用 UART 控制 WS2812: (1)XX XXX XX(0). 具有 7
    发表于 07-15 07:37

    ESP32-S3控制WS2812灯带显示异常如何解决?

    neopixel #import ws2812 import time GBIO_IN = Pin(40,Pin.OUT)# 控制信号输入引脚 LED_NUM = 15 # LED灯的数量
    发表于 06-05 06:17

    【Vision Board创客营连载体验】利用 OpenMV 实现 AprilTag 跟踪以及通过串口通讯控制 Arduino 驱动 LED 灯带

    作为下位机接收坐标信息并将信息转化为 LED 矩阵坐标,再通过 FastLED 库实现对 WS2812b 灯带的 LED 操控。 开发现况 由于手头上的 WS2812b 灯带连接触点
    发表于 05-31 00:01

    STM32F030 MDA+PWM驱动ws2812b,起始的50US的低电平是怎么产生?

    STM32F030 MDA+PWM 驱动 ws2812b,起始的50US的低电平怎么产生? 现在dma+pwm,倒是可以产生一个800K hz的驱动数据,但是WS2812要求有50US
    发表于 04-12 07:23

    STM32F051C8 PA0不能以DMA的方式输出PWM,没有正确波形输出是哪里出了问题?

    实现功能:用STM32F051C8的PA0驱动WS2812B 彩色LED灯条; 实现方法和工具:1.使用Cubemx 生成代码;2.配置PA0,PA0为PWM输出; 配置方式:打开Cu
    发表于 03-13 06:20

    麦爵士madrix麦觉仕幻彩灯条灯带的基本认识以及测点编程调试方法解析

    第一,幻的分类幻(灯带,点光源,线条灯)可以分为3大类,第一种是单线SPI/TTL协议,最常见就是VVC(正极)-DAT(数据线)-GND。海外最知名的型号是WS2812B相比来说,外置型更稳
    的头像 发表于 02-27 20:58 5081次阅读
    麦爵士madrix麦觉仕幻彩灯条灯带的基本认识以及测点<b class='flag-5'>编程</b>调试方法解析

    迪文屏控制WS2812氛围灯

    ——来自迪文开发者论坛本期为大家推送迪文开发者论坛获奖开源案例——迪文屏控制WS2812氛围灯。工程师通过COF智能屏的OS核精准控制WS2812幻彩灯带每一颗灯珠颜色,实现酷的灯带颜色切换的动态效果。演示视频完整开发资料
    的头像 发表于 01-26 08:12 1051次阅读
    迪文屏控制<b class='flag-5'>WS2812</b>氛围灯

    PSoC4设备运行WS2812 RGB+IC LED,发出的数据并不对称是为什么?

    这个 WS2812 LED。 有没有使用过这种部件的人,我可能会仔细检查我的代码和设置,看看我出了什么问题。我的代码很简单,只驱动一个LED(像素)。 当我运行
    发表于 01-23 08:34

    智能外控集成LED光源WS2812B-V5/W产品手册

      WS2812B-V5/W是一个集控制电路与发光电路于一体的智能外控LED光源。其外型与一个5050LED灯珠相同,每个元件即为一个像素点。像素点内部包含了智能数字接口数据锁存信号整形放大
    发表于 01-12 15:36 1次下载

    WS2812B-Mini-V3/W智能外控集成LED光源资料规格书

    电子发烧友网站提供《WS2812B-Mini-V3/W智能外控集成LED光源资料规格书.pdf》资料免费下载
    发表于 01-07 10:32 2次下载

    WS2812E-V3智能外控集成LED光源中文资料

    电子发烧友网站提供《WS2812E-V3智能外控集成LED光源中文资料.pdf》资料免费下载
    发表于 12-29 11:11 3次下载