概述

在前面的课程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特定引脚功能请看

Special Pin Functions

如果你不想用GPIO1(BCM_GPIO 18)输出PWM,你可以通过Software PWM Library输出PWM,关于Software PWM Library的介绍访问这里了解更多。

Software PWM Library

 

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 https://osoyoo.com/driver/pi3_start_learning_kit_lesson_6/breathing_led.py

3) 运行程序

sudo  python  ./breathing_led.py

4) 最终结果

执行程序后看到LED由暗变亮,再由亮变暗,就像在呼吸一样。