linux脚本练习2(控制树莓派ACT LED的亮度变化)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漂流の少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值