树莓派4B-GPIO控制舵机转动
硬件需求:
- 树莓派
- 舵机
- 杜邦线
舵机
什么是舵机?
舵机(servomotor)是一种简化版本的伺服电机,是位置伺服的驱动器,能够通过输入PWM信号控制旋转角度,具备轻量、小型、简化和性价比高的特点。
舵机适用于那些需要角度不断变化并可以保持的简单控制系统,它能实现较为精确的电机控制,在航模、遥控玩具、机器狗等品类上运用良好。
舵机的运动方式
舵机的运动方式是绕轴摆动,“舵机”一词也和它的运动方式有关,舵机常用来摆动调整方向,就像海洋上的水手的舵一样,航模和船模常常用舵机的摆动来调整一些零部件的角度。
舵机的部分参数表
GPIO接线方式
pwm - pin32 (PWM Signal)
Vcc - pin2 (4.8v ~6v)
ground - pin14 (0v)
"""
使用该代码可以查询树莓派的GPIO参数
如果出现报错需要先安装wiringpi
"""
pi@raspberrypi:~ $ gpio readall
代码
舵机自己正反转180度:
#!/usr/bin/python
# coding:utf-8
# servo_PWM_GPIO.py
# 树莓派GPIO控制外部舵机来回摆动,角度范围为0~180°,周期为4秒。
try:
import RPi.GPIO as GPIO
except RuntimeError:
print("Error importing RPi.GPIO! This is probably because you need superuser privileges. "
" You can achieve this by using 'sudo' to run your script")
import time
def servo_map(before_value, before_range_min, before_range_max, after_range_min, after_range_max):
"""
功能:将某个范围的值映射为另一个范围的值
参数:原范围某值,原范围最小值,原范围最大值,变换后范围最小值,变换后范围最大值
返回:变换后范围对应某值
"""
percent = (before_value - before_range_min) / (before_range_max - before_range_min)
after_value = after_range_min + percent * (after_range_max - after_range_min)
return after_value
GPIO.setmode(GPIO.BOARD) # 初始化GPIO引脚编码方式
servo_SIG = 32
servo_VCC = 4
servo_GND = 6
servo_freq = 50
servo_time = 0.01
servo_width_min = 2.5
servo_width_max = 12.5
# servo_degree_div =servo_width_max - servo_width_min)/180
GPIO.setup(servo_SIG, GPIO.OUT)
# 如果你需要忽视引脚复用警告,请调用GPIO.setwarnings(False)
# GPIO.setwarnings(False)
servo = GPIO.PWM(servo_SIG, servo_freq) # 信号引脚=servo_SIG 频率=servo_freq in HZ
servo.start(0)
servo.ChangeDutyCycle((servo_width_min+servo_width_max)/2) # 回归舵机中位
print('预设置完成,两秒后开始摆动')
time.sleep(2)
try: # try和except为固定搭配,用于捕捉执行过程中,用户是否按下ctrl+C终止程序
while 1:
for dc in range(1, 181, 1):
dc_trans = servo_map(dc, 0, 180, servo_width_min, servo_width_max)
servo.ChangeDutyCycle(dc_trans)
# print(dc_trans)
time.sleep(servo_time)
time.sleep(0.2)
for dc in range(180, -1, -1):
dc_trans = servo_map(dc, 0, 180, servo_width_min, servo_width_max)
servo.ChangeDutyCycle(dc_trans)
# print(dc_trans)
time.sleep(servo_time)
time.sleep(0.2)
except KeyboardInterrupt:
pass
servo.stop() # 停止pwm
GPIO.cleanup() # 清理GPIO引脚
可以控制舵机角度:
#!/usr/bin/python
# coding:utf-8
# servo_PWM_GPIO_2.py
# 输入一个角度值,舵机将转动到对应的角度
try:
import RPi.GPIO as GPIO
except RuntimeError:
print("Error importing RPi.GPIO! This is probably because you need superuser privileges. "
" You can achieve this by using 'sudo' to run your script")
import time
def servo_map(before_value, before_range_min, before_range_max, after_range_min, after_range_max):
"""
功能:将某个范围的值映射为另一个范围的值
参数:原范围某值,原范围最小值,原范围最大值,变换后范围最小值,变换后范围最大值
返回:变换后范围对应某值
"""
percent = (before_value - before_range_min) / (before_range_max - before_range_min)
after_value = after_range_min + percent * (after_range_max - after_range_min)
return after_value
GPIO.setmode(GPIO.BOARD) # 初始化GPIO引脚编码方式
servo_SIG = 32
servo_VCC = 4
servo_GND = 6
servo_freq = 50
servo_time = 0.01
servo_width_min = 2.5
servo_width_max = 12.5
# servo_degree_div =servo_width_max - servo_width_min)/180
GPIO.setup(servo_SIG, GPIO.OUT)
# 如果你需要忽视引脚复用警告,请调用GPIO.setwarnings(False)
# GPIO.setwarnings(False)
servo = GPIO.PWM(servo_SIG, servo_freq) # 信号引脚=servo_SIG 频率=servo_freq in HZ
servo.start(0)
servo.ChangeDutyCycle((servo_width_min+servo_width_max)/2) # 回归舵机中位
print('预设置完成,两秒后开始等待输入')
time.sleep(2)
# 为舵机指定位置
try: # try和except为固定搭配,用于捕捉执行过程中,用户是否按下ctrl+C终止程序
while 1:
position = input("请输入0°-180°的角度值:\n")
if position.isdigit()==1:
dc = int(position)
if (dc>=0) and (dc<=180):
dc_trans=servo_map(dc, 0, 180,servo_width_min,servo_width_max)
servo.ChangeDutyCycle(dc_trans)
print("已转动到%d°处"%dc)
else:
print("Error Input:Exceed Range")
else:
print("Error Input:Not Int Input")
except KeyboardInterrupt:
pass
servo.stop() # 停止pwm
GPIO.cleanup() # 清理GPIO引脚
结果展示
最后,祝各位学业有成,生活顺心!
标签:树莓,servo,舵机,min,width,range,GPIO,4B From: https://www.cnblogs.com/itduan/p/17516223.html