17. RGB LED

RGB LED 是一种常见的多彩发光二极管(LED),通过组合红色(Red)、绿色(Green)和蓝色(Blue)三种 基本颜色的不同亮度,可以显示几乎所有的颜色。

如下图是野火三色RGB灯模块,其它内容可以参考其规格手册:

../_images/show-peripheral-RGB.png

鲁班猫扩展板板载1个RGB LED接口:

../_images/show-board-RGB.png
../_images/show-circuit-RGB-01.png
../_images/show-circuit-RGB-02.png

以鲁班猫1为例,扩展板的GPIO23、GPIO24对应鲁班猫1的GPIO_C2、GPIO_C3:

../_images/show-circuit-RGB-03.png

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灯颜色为红色:

../_images/show-operation-runcode-01.png

设置第二个RGB灯颜色为绿色:

1
sudo ./ws2812_app 2 00FF00
../_images/show-operation-runcode-02.png

关闭第二个RGB:

1
./ws2812_app 2 000000
../_images/show-operation-runcode-03.png

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
../_images/show-dtbo14.png

开启插件后,重启开发板生效。测试前需要根据实际情况修改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