关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
这里所谓的LED指的是发光二极管。树莓派控制发光二极管是GPIO编程的入门级程度,相当于Hello World。
我尝试了两种控制LED的方式:闪烁和呼吸灯。
一、闪烁
闪烁的原理很简单,就是控制LED的开关,打开LED一段时间和关闭LED一段时间。反复操作就形成闪烁的现象。
接线也很简单,发光二极管的正极接在GPIO的输出引脚(这里我接在12号引脚),负极接在零极即可。
接线比较简单,可以不用面包板,用两条母对母的杜邦线也行。
接线之后,写脚本控制LED闪烁:
#coding:utf-8 #Python 2.7 from RPi import GPIO as g import time import sys def flash(port=12, step=1): g.setmode(g.BOARD) g.setup(port, g.OUT) #设置引脚输出模式 try: while(True): g.output(port, 1) #亮灯 time.sleep(step) #休息一下 g.output(port, 0) #灭灯 time.sleep(step) except KeyboardInterrupt: #按下Ctrl+C退出循环 g.cleanup() if __name__ == '__main__': flash()
保存文件名为led_flash.py,在终端找到对应的位置,输入python led_flash.py运行脚本。就可以看到效果:
因为写的是死循环,会一直闪烁下去。按Ctrl+C就可以退出。
二、呼吸灯
单单只是闪烁,满足不了我开发的欲望。查了一下,树莓派还可以实现呼吸灯的效果。参考了一段代码,修改如下:
#coding:utf-8 #Python 2.7 from RPi import GPIO as g import time def breathe(port=12, step=3): g.setmode(g.BOARD) g.setup(port, g.OUT) #设置引脚输出模式 #PWM模拟信号输出,这个大家可以自行搜索一下 pwm = g.PWM(port, 50) pwm.start(0) try: while(True): #从最低到最高 for i in range(0, 101, 2): pwm.ChangeDutyCycle(i) #把3秒分成100份,即每3秒完成一次最低到最亮的过程 time.sleep(step/100.) #从最高到最低 for i in range(100, -1, -2): pwm.ChangeDutyCycle(i) time.sleep(step/100.) except KeyboardInterrupt: #按下Ctrl+C退出循环 pwm.stop() g.cleanup() if __name__ == '__main__': breathe()
保存文件名为led_breathe.py,同样打开终端,找到该脚本的位置,执行命令python led_breathe.py。可以看到效果如下:
虽然LED可以由暗到明,再由亮到灭,不过这个亮度变换比较生硬,呈线性变化。画个图容易理解:
这种方式没有呼吸的感觉。呼吸应该有那种淡入淡出的感觉。我不由的想到三角函数sin和cos。这两个函数是周期性的,有淡入淡出的效果。
这两个函数效果都一样。它们的值是在[-1,1]之间变化,需要稍作调整,令其在[0,100]之间变化。
下图是 y=(sin(x/pi/7-0.5*pi)/2+0.5)*100 的图像,7是控制速度的,这里可以自行调整。
调整好函数之后,就修改代码:
#coding:utf-8 #Python 2.7 __author__ = u'杨仕航' from RPi import GPIO as g from math import sin, pi import time def breathe(port=12, step=5, speed=7): g.setmode(g.BOARD) g.setup(port, g.OUT) #设置引脚输出模式 #PWM模拟信号输出 pwm = g.PWM(port, 50) pwm.start(0) try: while(True): for i in range(speed*100): value = int((sin(i/pi/speed - 0.5*pi)/2 + 0.5)*100) pwm.ChangeDutyCycle(value) time.sleep(step/100.) except KeyboardInterrupt: #按下Ctrl+C退出循环 pwm.stop() g.cleanup() if __name__ == '__main__': breathe()
保存文件名为led_breathe_ex.py,同样执行一下,就可以看到呼吸的效果。
(由于手机拍不出效果,这里就不贴图了。有兴趣可以自己试一下 ^_^)