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

Posted So istes immer

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了练习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')

参考的博客

以上是关于练习6 --- 控制led和舵机练习的主要内容,如果未能解决你的问题,请参考以下文章

练习5 --- 树莓派编程(开关控制LED)

spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段

linux脚本练习2

6月21号 Java流程控制 练习

Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)(代码片段

循环控制强化训练