练习6 --- 控制led和舵机练习

1.题目一

要求:通过PWM控制LED的亮度变化
不按按钮,程序一直处在这样一个循环:LED开始从最暗到最亮,再从最亮到最暗
按下按钮,启动一个ISR(中断服务程序),结束程序

等效电路图

图中的BS270是一个N沟道的耗尽型MOS管,该管特性如下(S源极,G栅极,D漏极):
vGS = 0,只要加上正向电压vDS,就有电流 iD
vGS > 0,沟道电阻变小,电流 iD增大
vGS < 0,沟道电阻变大,电流 iD减小,vGS负到一定程度,iD趋近于0,管子截止

hw6_1.py

# coding=utf-8
import RPi.GPIO as GPIO
from time import sleep

led_pin = 18            # led通过接引脚GPIO18输出PWM信号
button_pin = 27         # 按钮的一个引脚接GPIO27

GPIO.setwarnings(False)                          # GPIO被占用了也不报警告
GPIO.setmode(GPIO.BCM)                           # GPIO使用BCM编码方式
GPIO.setup(led_pin, GPIO.OUT, initial=GPIO.LOW)  # 将GPIO18设置为输出模式,初始状态为低电平
GPIO.setup(button_pin, GPIO.IN)                  # 将GPIO27设置为输入模式

if __name__ == '__main__':
    print('Fading the LED in/out until the button is pressed')
    pwm = GPIO.PWM(led_pin, 50)                 # 创建PWM对象,并指定初始频率为50HZ
    pwm.start(0)                                # 启动PWM,并指定初始占空比为0

    while True:
        for i in range(101):                    # 占空比从0%到100%,灯由暗到明
            pwm.ChangeDutyCycle(i)
            sleep(0.02)
        for i in range(101):
            pwm.ChangeDutyCycle(100-i)          # 占空比从100%到0%,灯由明到暗
            sleep(0.02)
        if GPIO.input(button_pin) == 1:         # 检测到GPIO27为高电平
            print('Button was pressed -- start graceful end.')
            break;

    print('LED Off: Program has finished gracefully!')

2.题目二

要求:通过PWM控制舵机,让舵机 从-90度转到90度,按下按钮就中断程序,舵机停下来的时候是0度(这里的PWM0为了和上题区分,就用GPIO12,而不用GPIO18)

这里我为了好算,直接把-90度~90度看成0~180度

hw6_2.py 

# coding=utf-8
import RPi.GPIO as GPIO
from time import sleep

servo_pin = 12      # 舵机的信号线接GPIO12
button_pin = 27     # 按钮的一端接GPIO27

GPIO.setwarnings(False)                          # GPIO被占用了也不报警告
GPIO.setmode(GPIO.BCM)                           # GPIO使用BCM编码方式
GPIO.setup(servo_pin, GPIO.OUT, initial=GPIO.LOW)# 将GPIO12设置为输出模式,初始状态为低电平
GPIO.setup(button_pin, GPIO.IN)                  # 将GPIO27设置为输入模式

# 旋转角度转换到PWM占空比
# 一个周期20ms, 0.5ms-2.5ms对应舵机旋转角度0-180度
# 2.5%占空比对应0度,12.5%占空比对应180度
def angleToDutyCycle(angle):
    return 2.5 + angle / 180.0 * 10

if __name__ == '__main__':
    print('Sweeping the servo until the button is pressed')
    pwm = GPIO.PWM(servo_pin, 50)               # 创建PWM对象,并指定初始频率为50HZ
    pwm.start(angleToDutyCycle(90))             # 启动PWM,并指定舵机初始状态是转到90度
    sleep(1)

    while True:
        for i in range(181):                    # 从0度转到180度 
            pwm.ChangeDutyCycle(angleToDutyCycle(i))
            sleep(0.02)
        for i in range(181):                    # 从180度转到0度
            pwm.ChangeDutyCycle(angleToDutyCycle(180-i))
            sleep(0.02)
        if GPIO.input(button_pin) == 1:         # 检测到GPIO27为高电平,也就是说按下了按钮
            print('Button was pressed -- finishing sweep.')
            break

    pwm.ChangeDutyCycle(angleToDutyCycle(90))   # 舵机旋转角度恢复到90度
    print('Program has finished gracefully! - servo centred')

参考的博客

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
我们提供的程序和上位机每个动作组里规定只能储存255个动作,超过这个限制的动作不会运行。 如果想要增加动作请按照以下步骤执行。 1、将要编写的动作分成多个动作组编写,如当一个动作组编了255个动作时,保存文件,然后在新的动作组里开始继续编写,如此类推。 2、打开程序源码,在App.C源码里找到如下代码处 这里的意思是当我们把编写好的动作下到100号动作组里,然后按控制板上的按键1就会执行这个动作,这个100参数我们可以进行修改,如果修改了记得下载的时候需要把动作下载到修改后的动作组里,这样按按键时才会执行。 3、当我们完成了上一步的修改后,我们还需要在另外一个地方进行修改,如下图 我们在此处增加了一个判断当100号(如果我们上一步修改了100这个数值,此处也要修改)动作组执行完后,继续执行101号动作组,这个101也可以进行修改,同样的我们需要把动作组下到101号里,如果进行修改了就下到修改后的动作组里。到这里大家应该明白了增加动作的方法,按照这个方法我们可以再往下添加动作,如 规律大家应该看明白了就是前面执行的动作组是下一个将要执行动作组的判断条件,客户修改的时候一定要注意。 4、到此我们就完成了对动作的增加操作,最后我们还需要对程序进行编译 我们点击上图中的红框图标,等编译完 如果编译完没有错误就表明程序可以运行了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

漂流の少年

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

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

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

打赏作者

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

抵扣说明:

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

余额充值