17. RGB LED¶
RGB LED 是一种常见的多彩发光二极管(LED),通过组合红色(Red)、绿色(Green)和蓝色(Blue)三种 基本颜色的不同亮度,可以显示几乎所有的颜色。
如下图是野火三色RGB灯模块,其它内容可以参考其规格手册:
鲁班猫扩展板板载1个RGB LED接口:
以鲁班猫1为例,扩展板的GPIO23、GPIO24对应鲁班猫1的GPIO_C2、GPIO_C3:
17.1. GPIO翻转驱动¶
接线对照表如下:
野火三色RGB灯模块 |
鲁班猫扩展板RGB灯接口 |
---|---|
5V |
5V |
GND |
GND |
IN |
DAT |
因为灯珠的时序为纳秒级,对于使用IO翻转的方式来说,在应用层不能满足时序的要求,因此须在驱动层通过写寄存器的方式来翻转IO电平。 RK356x和RK3588系列所使用的WS2812驱动源码均为同一个:lubancat_rk_code_storage/expansion_board/ws2812/gpio/driver/ws2812_drv.c
可参考《嵌入式Linux驱动开发实战指南—基于LubanCat RK系列板卡》文档,自行编译驱动文件, 编译前,需在驱动源码ws2812_drv.c中根据目标芯片打开对应宏体:
1 2 3 4 5 6 7 8 9 | /* ws2812_drv.c */
...
/* 根据目标芯片,打开对应宏定义 */
//#define RK356x
//#define RK3588
...
|
编译源码使用的Makefile在:lubancat_rk_code_storage/expansion_board/ws2812/gpio/driver/Makefile, 编译前,需要根据实际情况修改内核路径和交叉编译工具链:
1 2 3 4 5 6 7 | KERNEL_DIR=../lubancat_sdk/kernel
ARCH=arm64
CROSS_COMPILE=aarch64-none-linux-gnu-
export ARCH CROSS_COMPILE
...
|
将编译好的.ko文件拷贝到板卡,输入如下命令安装驱动:
1 | sudo insmod ws2812_drv.ko
|
17.1.1. c代码测试¶
C测试代码为:lubancat_rk_code_storage/expansion_board/ws2812/gpio/ws2812_app.c
本例以鲁班猫1为例,测试前需要将ws2812_app.c的data引脚修改为实际的引脚:
1 2 3 4 5 6 7 8 | /* ws2812_app.c */
...
#define WS2812_DATA_GPIOCHIP 3
#define WS2812_DATA_GPIONUM 19
...
|
将ws2812_app.c传到板卡,执行如下命令编译和运行程序:
1 2 3 4 5 6 7 | # 编译程序
sudo gcc -o ws2812_app ws2812_app.c
# 运行程序
# 第一个参数为要控制的RGB灯序号,若只接了一个RGB灯,填1即可。若接RGB灯带,按实际需求填即可。
# 第二个参数为要设置颜色的十六进制码值
sudo ./ws2812_app 1 FF0000
|
例如执行上面命令的效果为设置第一个RGB灯颜色为红色:
设置第二个RGB灯颜色为绿色:
1 | sudo ./ws2812_app 2 00FF00
|
关闭第二个RGB:
1 | ./ws2812_app 2 000000
|
17.2. SPI驱动¶
利用GPIO翻转来驱动WS2812,精度会受CPU频率、任务调度、中断干扰等因素的影响,容易出现控制不稳定的情况。 因此使用SPI的方式驱动会更稳定,且易于扩展到多平台。
接线对照表如下:
野火三色RGB灯模块 |
鲁班猫扩展板SPI接口 |
---|---|
5V |
5V |
GND |
GND |
IN |
DI |
17.2.1. c代码测试¶
C测试代码为:lubancat_rk_code_storage/expansion_board/ws2812/spi/main.c
以鲁班猫1为例,执行如下命令修改/boot/uEnv/uEnv.txt,开启SPI插件:
1 | sudo vi /boot/uEnv/uEnv.txt
|
开启插件后,重启开发板生效。测试前需要根据实际情况修改main.c中的SPI接口:
1 2 3 4 5 6 7 8 9 | /*
filename : main.c
*/
...
#define SPI_BUS "/dev/spidev3.0"
...
|
将main.c所在的整个文件夹传到板卡,执行以下命令编译和运行程序:
1 2 3 4 5 6 | # 编译程序
make
# 运行程序
# 第一个参数为要设置颜色的十六进制码值
sudo ./main FF0000
|