距离上次更新本文已经过去了 731 天,文章部分内容可能已经过时,请注意甄别

前言

今晚上没啥事(其实作业没写完),就开始折腾树莓派

我当初买的是树莓派4B(4GB) 版本的套件,东西还是非常全的,店家还送了全套学习资料 + 指导视频,加上一本还算不错的书。

本篇博客,让我们一起来完成第一个实验:双色 LED

学习资料来源于:湖南创乐博智能科技有限公司

本博客仅供参考,请勿转载!


1. 实验器材

  • 装好系统的树莓派开发板 + 电源适配器
  • 面包板 + T 型转接板
  • 40p 软排线
  • 双色 LED
  • 若干跳线

2. 实验原理

将引脚 S(绿色)和中间管脚(红色)链接到面包板的接口上,对树莓派进行编程控制,使 LED 的颜色由红变绿。并利用 PWM 混合成其他颜色。

IMG_20220328_191824

对应接线表格

树莓派 T 型转接板双色 LED
GPI01GPI018S
GPI00GPI017R
GNDGNDGND

实际接线图如下(手机画质也太渣了)

接线图

3. 控制代码

当树莓派需要与外部元件相接时,要用到一些写好的库。如树莓派 wiringPi 库

树莓派 wiringPi 库:wiringPi 是一个很棒的树莓派 IO 控制库,使用 C 语言开发,提供了丰富的接口:GPIO 控制,中断,多线程,等等

还有 softPwm.h 库:GitHub 链接


本次双色 LED 实验需要用到的就是这两个库,以及 C 语言自带的库函数 stdio.h

代码如下:

c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#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 管脚

// LED 初始化
void makerobo_led_Init(void)
{
softPwmCreate(makerobo_Led_PinRed, 0, 100);
softPwmCreate(makerobo_Led_PinGreen,0, 100);
}
// 设置LED 亮度PWM调节范围是0x00-0xff
void makerobo_led_ColorSet(uchar r_val, uchar g_val)
{
softPwmWrite(makerobo_Led_PinRed, r_val);
softPwmWrite(makerobo_Led_PinGreen, g_val);
}

int main()
{
//初始化连接失败时,将消息打印到屏幕
if(wiringPiSetup() == -1){
printf("setup wiringPi failed !");
return 1;
}

makerobo_led_Init(); // LED 初始化

while(1){
makerobo_led_ColorSet(0xff,0x00); //红色
delay(500); //延时500ms
makerobo_led_ColorSet(0x00,0xff); //绿色
delay(500);
makerobo_led_ColorSet(0xff,0x45);
delay(500);
makerobo_led_ColorSet(0xff,0xff);
delay(500);
makerobo_led_ColorSet(0x7c,0xfc);
delay(500);
}
return 0;
}

在 wiringPi 库中,可以看到两个函数的使用说明

  • Create 函数相当于初始化针脚
  • Write 函数会更改该管脚的 pwm 值,以达到控制 LED 亮度的目的

光影魔术手拼图

3.1 显示器的 PWM 调光和 DC 调光

如果你有了解过显示器的选购知识,估计听说过显示器的 PWM 调光和 DC 调光。

使用 DC 调光的显示器,屏幕背光将常亮;使用 PWM 调光的显示器,屏幕背光将高速开关来点亮屏幕。只要 PWM 高于一定值,人眼就分辨不出该屏幕的闪烁。当一块显示器使用高频PWM 调光时,我们认为它与 DC 调光没有太大的区别。

但总的来说,使用 DC 调光技术的显示器更加 “护眼”,而使用低频PWM调光的显示器就是极度辣眼睛(这也是有些屏幕在摄像头中会屏闪的原因)

目前主流手机都上了 OLED 屏幕,该屏幕材质普遍使用的是 PWM 调光。部分手机厂家在屏幕设置中推出了 “类 DC 调光选项”,其原理就是用高频 PWM 来模拟 DC 调光

如果你想了解这方面的知识,可以看看这个视频👉链接

好像 bb 了一些和这个实验没啥关系的内容,赶快回到正题!

胡言乱语

3.2 编译代码

树莓派中有两种方式编译运行我们的代码

3.2.1 直接使用 Geany 编译器内部选项

image-20220328195052690

效果图

3.2.2 使用 linux 语言

树莓派的系统是基于 linux 的,我们可以使用 linux 中的 gcc 语言来编译这个.c 文件

在本专栏之前的博客中,有介绍过这种方式👉链接

image-20220328195157357

输入指令,你会发现系统报错显示 delay 函数未定义

c
1
undefined reference to `delay`

image-20220328195615327

这是因为 delay 函数并不是一个 C 语言的库函数我,我们可以在前面自己整一个 delay 函数的原型

第一次使用 Geany 编译的时候并没有报错,这是因为在 Geany 里面已经用生成命令引用了 wiringPi 库

c
1
2
在Geany的build(生成)-->set build commands(设置生成命令)中输入以下指令
gcc -Wall -c "%f" -lwiringPi
c
1
2
3
4
5
6
7
8
// 延时z毫秒的delay函数
void delay(unsigned int z)
{
unsigned int i,j;
for(i=z;i>0;i--)
for(j=110;j>0;j--)
;//利用无意义的for循环来进行延时
}

我们在 linux 控制台中用 cd 打开文件路径后,输入如下指令

c
1
2
1. gcc 01DuoColorLED.c -o GPIO -lwiringPi
2. -lwiringPi选项,链接WiringPi库。

第一条指令是编译程序,生成可执行文件 GPIO

image-20220328201441317

使用./GPIO 指令来执行此文件

  • 需要注意的是,用这种方法运行程序不太方便终止,你可以去掉 main 函数中的 while 循环,让变色只执行一次。

所以在进行此类开发时,建议直接使用 Geany 编译器,因为它会生成一个前台控制面板,我们可以直接用 ctrl+c 停止程序

image-20220328201858065

奇怪的是,当我运行第一个 Geany 编译器生成的可执行文件时,LED 会正常变色。

但是运行第二个在 linux 控制台生成的 GPIO 文件时,却不能变色。不知道是什么原因

image-20220328201959677

而当我重新用 Geany 编译器编译这份加了 delay 函数定义的代码时,发现这个 delay 函数还是不太行啊!这灯都闪的飞快,真的有 500ms 吗

Screenshot_2022_0328_203447

不过这也不算什么大问题,咱们可以通过调整 delay 函数的定义,和调用参数来控制

image-20220328203812971

4. 如何在使用面包板的同时使用散热小风扇

原本不使用面包板的时候,小风扇可以插在板载针脚的 2、3位

2529cca3105dbf6da1e2efb14ed481c1

但是现在使用了面包板,这整个针脚都被占用了,风扇往哪里插呢?

很简单,使用两根跳线,将风扇与面包板上的 5v 和 GND 链接就行了!

  • 红线接 5V
  • 黑线接 GND

IMG_20220331_205035


结语

不管如何,这次实验算是完美完成啦!

这也是我在树莓派上做的第一个实验

如果你想和我一起学习树莓派,那就关注本专栏吧!

欢迎 star 本专栏代码仓库:GITEE 链接

image-20220328202537677