文章目录
前言1.实验器材1.1树莓派运行库准备2.元件接线3.函数解释3.1关于softPwmWrite的使用问题,大大的疑惑4.代码样例4.1初始化针脚4.2颜色参数设置4.3完整代码及效果演示4.4 Linux-GCC编译器指令结语前言
又到了树莓派学习的时候!
关注本专栏,和我一起学习树莓派开发板30+经典实验!
C语言代码,0基础剖析!
还等什么😍心动不如行动!👉点我关注
本专栏代码仓库📝:Raspberry-practice
上一次的实验001-双色LED中,虽然我把博客展示了出来,写的好像有模有样的,实际上我对一些函数可谓是丝毫不懂。
但这次不一样了,我把一些函数的基本使用给整明白了!
1.实验器材
树莓派开发板40p软排线+T型转接板跳线一堆RGB小灯通过这次试验,我们可以基本了解一下让电脑性能提升200%的RGB的底层控制
1.1树莓派运行库准备
当树莓派需要与外部元件相接时,要用到一些写好的库。如树莓派wiringPi库
树莓派
wiringPi
库:下载/安装教程下载
softPwm.h
库:GitHub链接,安装教程见README
2.元件接线
RGBled模块的电路图如下,其与实物图是对应关系
以下是本次实验的接线图
其实这里我没搞懂这个5V是用来干什么的,因为不接好像也没有关系
让我无语的是,去问店家,客服回复是“原理需要自己学习”
看来还是得靠自己
大胆猜测一下,后续的实验需要更多接5V的设备,这个5V引线就好比我们每次编写C语言都需要用stdio.h
一样,是一个习惯。
同时解释一下面包板左右两条线的作用:
当你把GND用引线接到蓝色-线上,此时那一排都是GND当你把5V用引线接到红色+上,红色一排都是5V了
这就相当于串联线路
3.函数解释
这里需要用到两个函数:softPwmCreate
和softPwmWrite
上篇博客中我只给出了这两个函数的解释文档(偷懒),这篇博客让我们来真切认识一下这两个函数的作用
以下是函数原型,以及官方解释的翻译
int softPwmCreate (int pin, int initialValue, int pwmRange) ;
这将创建一个软件控制的PWM引脚。您可以使用任何GPIO引脚,引脚编号将与您使用的wiringPiSetup()
函数相同。
initialValue
是初始值,如果pwmRange
使用100,那么给定引脚的值可以是0(关闭)到100(完全打开)之间的任何值。返回值为0表示成功,-1代表失败。
如果还有其他情况,您应该检查全局errno
变量,看看哪里出了问题。
void softPwmWrite (int pin, int value) ;
更新给定引脚pin
上的PWM值。该值将被检查是否在范围pwmRange
内
未通过softPwmCreate初始化的管脚将被忽略
后续还有一个Note:
PWM输出的每个“周期”需要10毫秒,默认范围值为100,因此尝试每秒更改PWM值超过100次将是徒劳的
在
softPWM
模式下激活的每个引脚使用大约0.5%的CPU目前无法在程序运行时禁用引脚上的
softPWM
您需要保持程序运行以保持PWM输出!
3.1关于softPwmWrite的使用问题,大大的疑惑
这里我产生了一个巨大的疑惑,就是softPwmWrite
函数的第二个参数究竟应该如何使用
这个问题我在CSDN的问答区提问了,22.04.01的17:00目前还没有回复👉点我
可以看到下面这位大佬的程序中,是将第二个参数设置到超过了100
引用自博客/demo-lv/p/14017488.html
而参考资料中,提供的代码也是将pwm值设置超过了100
在查询过一些资料(是真的没有博客提到过这个问题),我找到了RGB颜色对照表
这个代码中提供的参数设置,其实是参照RGB表来设置的
也就是说,如果想达到混色的效果,你需要利用softPwmWrite
函数将红绿蓝针脚与RGB表中的数值对应进行输出。
但这不就和官方的pwm值应该在范围内,且超过100的pwm值都是无效的,冲突了吗?
这个问题先暂时放在这里,蹲一个大佬解释
4.代码样例
4.1初始化针脚
#include <wiringPi.h>#include <softPwm.h>#include <stdio.h>#define makerobo_Led_PinRed 0 // 红色LED 管脚#define makerobo_Led_PinGreen 1 // 绿色LED 管脚#define makerobo_Led_PinBlue 2 // 蓝色LED 管脚// LED 初始化void makerobo_led_Init(){//第三个参数是range,将pwm设置成100(全开)softPwmCreate(makerobo_Led_PinRed, 0, 100);softPwmCreate(makerobo_Led_PinGreen,0, 100);softPwmCreate(makerobo_Led_PinBlue, 0, 100);}
你可能会想,为什么这里要把红绿蓝的管脚设置成0、1、2,实际上这里和面包板的接线是对应的
可以看到,GPIO 0/1/2
分别对应的是17/18/27
,同我们第2点中接线图上的针脚位置对应
4.2颜色参数设置
初始化针脚之后,我们就来设置各个针脚的参数
// LED 颜色设置void makerobo_led_Color_Set(uchar r_val, uchar g_val, uchar b_val){//对应不同颜色针脚的设置,如果需要红色,就只给红色r_val传对应值//给不同颜色输入不同值,达成混色的效果!softPwmWrite(makerobo_Led_PinRed, r_val);softPwmWrite(makerobo_Led_PinGreen, g_val);softPwmWrite(makerobo_Led_PinBlue, b_val);}//函数使用如下makerobo_led_Color_Set(0xff,0x00,0x00); //红色delay(500); //延时500ms,使更改便于观察makerobo_led_Color_Set(0x00,0xff,0x00); //绿色delay(500);makerobo_led_Color_Set(0x00,0x00,0xff); //蓝色delay(500);
4.3完整代码及效果演示
下面给出完整代码,以及最终的效果、
#include <wiringPi.h>#include <softPwm.h>#include <stdio.h>#define uchar unsigned char#define makerobo_Led_PinRed 0 // 红色LED 管脚#define makerobo_Led_PinGreen 1 // 绿色LED 管脚#define makerobo_Led_PinBlue 2 // 蓝色LED 管脚// LED 初始化void makerobo_led_Init(){//第三个参数是range,将pwm设置成100(全开)softPwmCreate(makerobo_Led_PinRed, 0, 100);softPwmCreate(makerobo_Led_PinGreen,0, 100);softPwmCreate(makerobo_Led_PinBlue, 0, 100);}// LED 颜色设置void makerobo_led_Color_Set(uchar r_val, uchar g_val, uchar b_val){//对应不同颜色针脚的设置,如果需要红色,就只给红色r_val传对应值//给不同颜色输入不同值,达成混色的效果!softPwmWrite(makerobo_Led_PinRed, r_val);softPwmWrite(makerobo_Led_PinGreen, g_val);softPwmWrite(makerobo_Led_PinBlue, b_val);}int main(){//初始化连接失败时,将消息打印到屏幕if(wiringPiSetup() == -1){printf("setup wiringPi failed !");return 1; }makerobo_led_Init();int n=0;printf("请输入循环周期的次数>");scanf("%d",&n);//输入循环周期的次数while(n--){makerobo_led_Color_Set(0xff,0x00,0x00); //红色delay(500); //延时500ms,使更改便于观察makerobo_led_Color_Set(0x00,0xff,0x00); //绿色delay(500); makerobo_led_Color_Set(0x00,0x00,0xff); //蓝色delay(500);makerobo_led_Color_Set(0xff,0xff,0x00); //黄色delay(500); makerobo_led_Color_Set(0xff,0x00,0xff); //粉色delay(500);makerobo_led_Color_Set(0xff,0xff,0xff); //白色delay(500); makerobo_led_Color_Set(0x94,0x00,0xd3); //紫色delay(500);makerobo_led_Color_Set(0x76,0xee,0x00); //偏黄色delay(500);makerobo_led_Color_Set(0x00,0xc5,0xcd); //淡蓝色delay(500);}//最后循环结束时,关闭LED(如果不这么设置,LED灯会停留在最后一个颜色)makerobo_led_Color_Set(0x00,0x00,0x00);//参数都为0,相当于关灯delay(500);//如果不延时,效果无法展示出来return 0;}
使用树莓派Geany编译器,三板斧点起来
最后的结果如下图~~RGB小灯变色循环成功!
4.4 Linux-GCC编译器指令
Geany已经可以很好地执行我们的程序了,但它未免有点太easy了,点几下按钮就能搞定
我们来试试需要敲语句的GCC编译器
首先依旧是用cd
打开源文件的目录
cd 打开源文件存放的目录ls 列出当前文件路径下的所有文件
使用wiringPi库和softPWM库需要加上两个指令
wiringPi库对应:-lwiringPi
softPWM库对应:-lpthread
在linux的gcc中使用delay函数需要调用另外一个头文件<unistd.h>
gcc -Wall 02rgbled.c -o TEST -lwiringPi -lpthread
如果没有报错的话,那就是编译成功了,再次ls
可以看到多出来了一个TEST可执行文件
./TEST 执行TEST文件
可以看到程序正常运行了!
结语
第二个树莓派实验也做完啦!
虽然还有问题没有解决,但我还是很开心的
如果对你有帮助,还请点个大大的👍!有什么问题可以评论区提出来哦
通往大佬的路非常漫长……