第一课:什么是树莓派
第二课:基于树莓派的10个经典项目
第三课:购买您的第一个树莓派
第四课:如何安装树莓派系统
第五课:树莓派C语言编程手册
第六课:树莓派led控制
第七课:树莓派按键控制
第八课:树莓派PWM(脉宽调制)
第九课:树莓派数码管显示
第十课:树莓派如何读取温湿度传感器(dht11)数据
第十一课:树莓派控制电机
第十二课:树莓派搭建服务器
第十三课:树莓派搭建客户端
第十四课:树莓派+QT客户端
视频链接
学一种语言是从hello,world开始的;
学一种硬件编程是从点灯开始的;
学编程语言,大家都从hello,world开始,是因为一个简单的hello,world其实是“五脏俱全”的,包括头文件,主函数,编译,运行,输出;
而控制一个cpu,从点一个灯(led)开始,也是这个道理,你的程序让一个灯亮起来了,说明cpu工作了,板子没问题了,你能够通过程序控制cpu的GPIO口了。
对一些玩过单片机或者arm的开发者来说,可能觉得点一个灯太easy,所以我考虑这篇博客是简单一笔带过,给一段代码,还是站在一个初学者的角度写得浅显易懂呢?最后,我觉得还是要认真写,一来如果简单转发一下别人的博客,不符合我博客的风格,另一个重要原因是:其实我很不喜欢那种蔑视入门知识的人,他们是忘了他们自己是如何走过来的,所以我还是站在一个从来没有接触过树莓派,也没有接触过单片机或者开发板的菜鸟角度来写吧!
我们一般用第一种灯,因为可以显示RGB(红绿蓝)三种颜色,而第二种灯只有单色(要么是白色,或者红色,蓝色,绿色等,下面图片是白色的)
这个RGB小模块,不需要接电源,因为Led只需要很小的电流就可以驱动,也就是通过一个树莓派上的IO口就可以驱动它,所以不需要接电源(也就是我们说的正),树莓派有很多个地线,这里的GND都是,GND是ground的缩写。Led模块上的R,G,B分别代表3个led,表示红,绿,蓝。我们一般用杜邦线来连线。
大家在学习硬件编程的时候,会在各种文章和书籍或者视频上看到**“IO口”,“GPIO”**术语,其实很好理解:
IO——是input,output的首字母,表示cpu上引脚具备的两种功能,即你是想把这个引脚作为输入来使用呢?还是作为输出来使用,那么什么是输入,什么是输出呢?
输入和输出是针对cpu来说的,举个例子吧:
比如我们使用的笔记本,哪些是输入设备,哪些是输出设备呢?
很显然,键盘,鼠标是输入设备,显示器是输出设备,说到这个,大家很快就能回答出来,为什么呢,因为你觉得输入就是我们给到比较本的,键盘是用来输入字母和文字的,鼠标是用来点击一些按钮和网页的,这些属于输入概念;显示是输出设备,因为是笔记本里面的cpu把图片送到显示器显示的。所以呢:
输入设备是我们给到cpu的,输出设备是cpu给到我们的,这里的输入和输出是相对cpu来讲的,输入就是输入给cpu,输出是cpu输出给我们。
GPIO——是General Pin Input/Output的缩写,中间那个P也有人译作Purpose——用途,也有人译作port——端口。什么是通用呢,就是这个引脚是作为普通使用的,说明还有特殊用途,这个特殊用途我们后面学到pwm或者串口,i2c,spi的时候再讲。
led的编程时最简单了,就像helloworld一样。
但,这里也可以把问题拆分一下,你可以先写程序控制一个灯,一个灯实现了,再控制三个灯。
我们要控制一个IO口,需要下面的几步:
1)包含必要的头文件
#include
2) 设置编码模式
wiringPisetup();//设置wiringPi编码模式,c语言一般使用wiringPi编码模式,python一般使用BCM编码模式
//这些函数不知道什么意思的,可以参考我的另一篇博文:https://blog.csdn.net/qq_27320195/article/details/107167737
3)设置引脚功能
pinMode(27,OUTPUT); //设置wiringPi模式下的第27脚为输出功能
4) 循环控制
while (1)
{
digitalWrite(27,1);//亮
sleep(1);//延时1秒
digitalWrite(27,0);//灭
sleep(1);//延时1秒
}
最终代码:
pi@xiajiashan:~/pi-c-blog$ cat -n led.c
1 //第一步:包含头文件
2 #include <wiringPi.h>
3 int main()
4 {
5 //第二步:设置树莓派引脚编码模式
6 wiringPiSetup();
7 //第三步:定义引脚功能
8 pinMode(27,OUTPUT);//设置引脚为输出
9 //第四步:循环控制
10 while(1){
11 sleep(1);
12 digitalWrite(27,1);//让灯亮
13 sleep(1);
14 digitalWrite(27,0);//灯灭
15 }
16 return 0;
17 }
pi@xiajiashan:~/pi-c-blog$
编译运行很简单,但是一定要带上库-lwiringPi,就像这样:
这里有一个函数,我们调用的时候没有去判断它的返回值,这是一个不好的习惯,不然出错了,不知错在哪里。
就是wiringPiSetup()这个函数,正确的做法是这样:
6 //第二步:设置树莓派引脚编码模式
7 if(wiringPiSetup()<0)
8 {
9 perror(“树莓派启动失败…”);
10 exit(-1);
11 }
但是因为增加了perror和exit函数,所以编译的时候,会出现下面的问题:
pi@xiajiashan:~/pi-c-blog$ gcc led.c -lwiringPi
led.c: In function ‘main’:
led.c:9:6: warning: incompatible implicit declaration of built-in function ‘exit’
exit(-1);
^
pi@xiajiashan:~/pi-c-blog$
关于exit函数的工作原理,大家参考这篇博文:
https://blog.csdn.net/firefly_2002/article/details/7960595
解决这个问题的方法,就是在头文件中添加include
最终的代码如下:
pi@xiajiashan:~/pi-c-blog$ cat -n led.c
1 //第一步:包含头文件
2 #include <wiringPi.h>
3 #include <stdlib.h> //调用exit函数需要
4 int main()
5 {
6 //第二步:设置树莓派引脚编码模式
7 if(wiringPiSetup()<0)
8 {
9 perror("树莓派启动失败....");
10 exit(-1);
11 }
12 //第三步:定义引脚功能
13 pinMode(27,OUTPUT);//设置引脚为输出
14 //第四步:循环控制
15 while(1){
16 sleep(1);
17 digitalWrite(27,1);//让灯亮
18 sleep(1);
19 digitalWrite(27,0);//灯灭
20 }
21 return 0;
22 }
pi@xiajiashan:~/pi-c-blog$
上面我们实现的是红色灯的控制,如果要实现三个灯的交替亮灭,该怎么办呢?
就是R亮------>R灭------>G亮-------->G灭-------->B亮-------->B灭------>循环
因为硬件原理我已经讲得很详细了,所以接下来就是编码问题,我就直接贴代码了:
pi@xiajiashan:~/pi-c-blog$ cat rgb.c -n
1 //第一步:包含头文件
2 #include <wiringPi.h>
3 #include <stdlib.h> //调用exit函数需要
4 #define R 27
5 #define G 28
6 #define B 29
7
8 int main()
9 {
10 //第二步:设置树莓派引脚编码模式
11 if(wiringPiSetup()<0)
12 {
13 perror("树莓派启动失败....");
14 exit(-1);
15 }
16 //第三步:定义引脚功能
17 pinMode(R,OUTPUT);//设置R引脚为输出
18 pinMode(G,OUTPUT);//设置G引脚为输出
19 pinMode(B,OUTPUT);//设置B引脚为输出
20 //第四步:循环控制
21 while(1){
22 //R
23 digitalWrite(R,1);//让灯亮
24 sleep(1);
25 digitalWrite(R,0);//灯灭
26 sleep(1);
27 //G
28 digitalWrite(G,1);//让灯亮
29 sleep(1);
30 digitalWrite(G,0);//灯灭
31 sleep(1);
32 //B
33 digitalWrite(B,1);//让灯亮
34 sleep(1);
35 digitalWrite(B,0);//灯灭
36 sleep(1);
37 }
38 return 0;
39 }
pi@xiajiashan:~/pi-c-blog$
因为如何控制灯的硬件原理我已经讲了,七彩灯我这里只讲一下控制原理,详细的大家可以购买我的视频:
https://edu.csdn.net/course/play/28051/383653?spm=1002.2001.3001.4143
RGB三种颜色可以组合成8种颜色,R,G,B,RG-,RB-,-GB,RGB,—。---表示不亮了。
注意是组合,不是排列,排列abcd和abdc是不一样的,但是组合是一样的。
希望对您有帮助,如果有帮助就收藏吧
第一课:什么是树莓派
第二课:基于树莓派的10个经典项目
第三课:购买您的第一个树莓派
第四课:如何安装树莓派系统
第五课:树莓派C语言编程手册
第六课:树莓派led控制
第七课:树莓派按键控制
第八课:树莓派PWM(脉宽调制)
第九课:树莓派数码管显示
第十课:树莓派如何读取温湿度传感器(dht11)数据
第十一课:树莓派控制电机
第十二课:树莓派搭建服务器
第十三课:树莓派搭建客户端
第十四课:树莓派+QT客户端
视频链接