概述
在前面的课程LED的亮度无法改变,在本课中我将做一些突破,完成一件有趣的事情,那就是改变LED的亮度,在亮与暗之间变化,就像呼吸一样。
所用物料
1 * Raspberry Pi
1 * Breadboard
1 * LED
1 * Resistor (200Ω)
Jumper wires
1 * T-Extension Board
1 * 40-Pin Cable
工作原理
我们利用PWM控制LED亮度,PWM全名叫脉冲宽度调制(Pulse Width Modulation),利用微处理器的数字输出产生方波,通过调节方波脉冲宽度模拟0-3.3V电压信号,把这个模拟的电压信号作用与LED上,就能实现LED亮度调节。关于PWM更多介绍请问访问这里。
还没有画(o(╯□╰)o)
软件
对于C语言用户
1 ) 在/home/pi下新建一个.c源文件,文件名随意
cd ~
sudo nano breathing_led.c
2)向新建的源文件中写入代码
#include <wiringPi.h> #include <stdio.h> #include <stdlib.h> //pin 1(BCM GPIO 18) is PWM port #define LEDPIN 1
更前面的课程一样首先包含程序需要的库文件,然后定义LED所接到的GPIO管脚。唯一不同是多了一个stdlib.h头文件,这是标准的C语言库文件,后面的程序中会用到这个库文件里的一个函数exit(),所以需要将其包含进来。
在本课中我们是用Raspberry Pi GPIO1(BCM_GPIO 18)作为PWM波输出口,因为这个端口本身就具备输出PWM功能,关于Raspberry Pi特定引脚功能请看
如果你不想用GPIO1(BCM_GPIO 18)输出PWM,你可以通过
int main(){ int bright; if(wiringPiSetup()==-1){ printf("setup wiringPi failed!\n"); printf("please check your setup\n"); exit(1); } pinMode(LEDPIN,PWM_OUTPUT); printf("\n"); printf("\n"); printf("********************************|\n"); printf("| Breath LED |\n"); printf("| ------------------------ |\n"); printf("| |\n"); printf("| LED_R1 connect to GPIO1 |\n"); printf("| |\n"); printf("| |\n"); printf("| OSOYOO|\n"); printf("********************************|\n"); for(;;){ printf("|*****************|\n"); printf("| breatf off |\n"); printf("|*****************|\n"); for(bright=0;bright<1024;++bright){ pwmWrite(LEDPIN,bright); delay(2); } printf("|*****************|\n"); printf("| breath on |\n"); printf("|*****************|\n"); for(bright=1023;bright>=0;--bright){ pwmWrite(LEDPIN,bright); delay(2); } } return 0; }
在主函数中有些代码跟前面的课程中是一样的,这里我们只介绍跟前面课程中不一样的部分。在主函数中如果wiringPiSetup()函数的返回值是-1,说明wiringPi初始化失败,调用exit()函数退出程序,关于exit()函数的详细描述可以在linux命令行运行man exit查看。
用pinMode()函数将LEDPIN引脚设置成PWM输出模式。在主循环中通过pwmWrit()函数改变LED亮度。
完整的源代码可以运行下面的命令获取
sudo wget http:osoyoo.com/driver/pi3_start_learning_kit_lesson_6/breathing_led.c
3) 编译
在命令行运行下面命令编译程序
gcc -Wall -o breathing_led breathing_led.c -lwiringPi
4) 执行程序
sudo ./breathing_led
注意:由于使用了PWM功能,在运行程序的时候一定要以root用户权限运行,否则Pi会死机的!
5 )最终结果
执行程序后看到LED由暗变亮,再由亮变暗,就像在呼吸一样。
对于python用户(以远程登录为例)
1) 在/home/pi新建一个.py的python脚本文件,文件名随意,你开心就好(^_^)
cd ~
sudo nano breathing_led.py
2) 编码
跟之前一样先导入程序中使用到的软件模块,再定义LED接到那个GPIO口上
import RPi.GPIO as GPIO import time #set BCM_GPIO 18(GPIO1) as LED pin LEDPIN = 18
这个自定义函数跟之前课程中一样
#print message at the begining ---custom function def print_message(): print ('|**********************************|') print ('| Breath LED |') print ('| ---------------------------- |') print ('| LED Connect to GPIO1 |') print ('| ---------------------------- |') print ('| |') print ('| OSOYOO|') print ('|**********************************|\n') print ('Program is running...') print ('Please press Ctrl+C to end the program...') pass
在setup函数中将LEDPIN引脚设置为PWM输出模式,初始电平为低电平(0V),并将PWM波频率为100Hz,
#setup function for some setup---custom function def setup(): global p GPIO.setwarnings(False) #set the gpio modes to BCM numbering GPIO.setmode(GPIO.BCM) #set all LedPin's mode to output,and initial level to HIGH(3.3V) GPIO.setup(LEDPIN,GPIO.OUT,initial=GPIO.LOW) #set LEDPIN as PWM output,and frequency=100Hz p = GPIO.PWM(LEDPIN,100) #set p begin with ualue 0 p.start(0) pass
在main函数中通过两个for循环分别将占空比从0每次递增4,递增到100,再从100每次递减4,递减到0,从而改变LED亮度
ef main(): #print info print_message() while True: print("|****************************|") print("| Increase duty cycle |") print("|****************************|") #increase duty cycle from 0 to 100 for dc in range(0,101,4): #chang duty cycle to dc p.ChangeDutyCycle(dc) time.sleep(0.1) pass print("|****************************|") print("| Decrease duty cycle |") print("|****************************|") #decrease duty cycle from 100 to 0 for dc in range(100,-1,-4): #change duty cycle to dc p.ChangeDutyCycle(dc) time.sleep(0.1) pass pass pass
完整的程序源码,在终端运行下面命令获取
sudo wget http://osoyoo.com/driver/pi3_start_learning_kit_lesson_6/breathing_led.py
3) 运行程序
sudo python ./breathing_led.py
4) 最终结果
执行程序后看到LED由暗变亮,再由亮变暗,就像在呼吸一样。
DownLoad Url osoyoo.com