练习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和舵机练习的主要内容,如果未能解决你的问题,请参考以下文章
spring练习,在Eclipse搭建的Spring开发环境中,使用set注入方式,实现对象的依赖关系,通过ClassPathXmlApplicationContext实体类获取Bean对象(代码片段
Python练习册 第 0013 题: 用 Python 写一个爬图片的程序,爬 这个链接里的日本妹子图片 :-),(http://tieba.baidu.com/p/2166231880)(代码片段