1.题目
翻译翻译
1.新建hw2目录,脚本格式类似hw2.sh
2.写一个shell脚本和一个python脚本来控制树莓派的ACT LED(在第二章 “interacting with the onboard leds”一栏下面有所描述)。你想要通过调整 PWM 方波信号的3种占空比来改变 LED 灯的亮度。执行你的脚本,不要和shell交互。
2.理论基础
在linux系统中,树莓派的ACT LED被叫做led0,PWR LED(电源灯)被叫做led1
ACT LED可以见下图
ACT LED 不同是闪烁模式代表不同的状态,比ACT LED 不规则闪烁,说明系统已经开始启动
我们可以到 /sys/class/leds/ 中去设置ACT LED的属性和行为
而 PWM(Pulse Width Modulation),脉冲宽度调制的缩写,就是通过改变矩形脉冲的占空比来改变输出电压的一种方法。
pwm占空比就是一个脉冲周期内高电平的所整个周期占的比例。
3.分析
我们可以将ACT LED设置为GPIO模式,再通过对GPIO的编程来实现PWM,从而控制ACT LED的亮度。
问题是:如何知道ACT LED对应的GPIO引脚编号?
苦寻无果,最后在一个论坛上看到一个帖子,曙光乍现。
Raspberry Pi 3B led0/act-led Control Via Software... - Raspberry Pi Forums
解决办法就是:配置ACT LED去覆盖一个GPIO引脚
我们可以在树莓派中找到 /boot/overlays/README 这个文件好好看看。
从这个文件我们可以得到以下信息
①关于overlays设置的加载都是由/boot/config.txt这个文件完成
②关于ACT LED的一段信息如下
Name: act-led
Info: Pi 3B, 3B+, 3A+ and 4B use a GPIO expander to drive the LEDs which can
only be accessed from the VPU. There is a special driver for this with a
separate DT node, which has the unfortunate consequence of breaking the
act_led_gpio and act_led_activelow dtparams.
This overlay changes the GPIO controller back to the standard one and
restores the dtparams.
Load: dtoverlay=act-led,<param>=<val>
Params: activelow Set to "on" to invert the sense of the LED
(default "off")
gpio Set which GPIO to use for the activity LED
(in case you want to connect it to an external
device)
REQUIRED
③所以,只要在/boot/config.txt中加一行dtoverlay=act-led,gpio=xxx(BCM编码格式)即可
4.代码实现
shell脚本 hw2.sh
#! /bin/bash
sudo sh -c 'echo "dtoverlay=act-led,gpio=21" >> /boot/config.txt'
python脚本 hw2.py
import RPi.GPIO as GPIO # 引入GPIO模块
import time
if __name__ == '__main__':
LedPin = 21
freq = 50 # PWM频率变量,初始值为100
dc0 = 0 # PWM占空比
dc1 = 30
dc2 = 70
dc3 = 100
GPIO.setmode(GPIO.BCM) # 使用BCM编号方式
GPIO.setup(LedPin, GPIO.OUT) # 将GPIO19设置为输出模式
pwm = GPIO.PWM(LedPin, freq) # 创建PWM对象,并指定初始频率
pwm.start(dc0) # 启动PWM,并指定初始占空比
try:
while True:
pwm.ChangeDutyCycle(dc1) # 改变PWM占空比
time.sleep(1)
pwm.ChangeDutyCycle(dc2) # 改变PWM占空比
time.sleep(1)
pwm.ChangeDutyCycle(dc3) # 改变PWM占空比
time.sleep(1)
finally:
pwm.stop() # 停止PWM
GPIO.cleanup() # 清理释放GPIO资源,将GPIO复位
先给文件执行权限
chmod u+x hw2.py
chmod u+x hw2.sh
再分别执行
./hw2.sh
python hw2.py