【树莓派】树莓派控制舵机 (二维云台舵机)
树莓派控制舵机 (二维云台舵机)
简单驱动舵机转动
舵机三根线
黑色或棕色 接gnd
红色 接vcc(5v)但这个舵机是6v 懒得在单独供电 直接树莓派5v供电
黄色 信号线
上面的舵机 接板载编码 11口 即GPIO17
下面的舵机 接板载编码 12口 即GPIO18
原理
先setup() 初始化将所用gpio口设为输出模式
初始化pwm 主要靠调节pwm占空比来控制舵机
占空比范围0-100
写个控制函数就ok了
代码
import RPi.GPIO as GPIO
import time
servo1_pin = 11 #上面的舵机
servo2_pin = 12 #下面的舵机
def setup():
GPIO.setmode(GPIO.BOARD)
GPIO.setup(servo1_pin, GPIO.OUT)
GPIO.setup(servo2_pin, GPIO.OUT)
# 初始化PWM
global servo1_pwm, servo2_pwm
servo1_pwm = GPIO.PWM(servo1_pin, 40)
servo2_pwm = GPIO.PWM(servo2_pin, 40)
servo1_pwm.start(0)
servo2_pwm.start(0)
def set_servo_angle(servo, angle):
duty_cycle = angle / 18.0 + 2.5 # 计算占空比
servo.ChangeDutyCycle(duty_cycle) # 设置占空比
def main():
setup()
try:
while True:
# 控制舵机1
set_servo_angle(servo1_pwm, 0)
set_servo_angle(servo2_pwm, 0)
time.sleep(1)
set_servo_angle(servo1_pwm, 100)
set_servo_angle(servo2_pwm, 100)
time.sleep(1)
except KeyboardInterrupt:
servo1_pwm.stop()
servo2_pwm.stop()
GPIO.cleanup()
if __name__ == '__main__':
main()
四个独立按键控制舵机云台运动
原理
只用到了 右边四个
右1按键按下 上面舵机向后转动
右2按键按下 上面舵机向前转动
右3按键按下 下面舵机向左转动
右4按键按下 上面舵机向右转动
key_pins = [23, 21, 29,31] # 4个按键开关的GPIO引脚
四个按键分别接板载编码23 21 29 31即
代码
import RPi.GPIO as GPIO
import time
servo1_pin = 11
servo2_pin = 12
key_pins = [23, 21, 29,31] # 4个按键开关的GPIO引脚
def setup():
GPIO.setwarnings(False) # 防止警告信息干扰程序运行。
GPIO.setmode(GPIO.BOARD)
GPIO.setup(servo1_pin, GPIO.OUT)
GPIO.setup(servo2_pin, GPIO.OUT)
for key_pin in key_pins:
GPIO.setup(key_pin, GPIO.IN ,pull_up_down=GPIO.PUD_UP)
# 初始化PWM
global servo1_pwm, servo2_pwm
servo1_pwm = GPIO.PWM(servo1_pin, 40)
servo2_pwm = GPIO.PWM(servo2_pin, 40)
servo1_pwm.start(0)
servo2_pwm.start(0)
def set_servo_angle(servo, angle):
duty_cycle = angle / 18.0 + 0.5 # 计算占空比
servo.ChangeDutyCycle(duty_cycle) # 设置占空比
def main():
up_servo = 0
down_servo = 0
setup()
try:
while True:
if GPIO.input(key_pins[0]) == GPIO.LOW:
up_servo += 5
elif GPIO.input(key_pins[1]) == GPIO.LOW:
up_servo -= 5
elif GPIO.input(key_pins[2]) == GPIO.LOW:
down_servo += 5
elif GPIO.input(key_pins[3]) == GPIO.LOW:
down_servo -= 5
if up_servo > 100:up_servo = 100
if up_servo < 0: up_servo = 0
if down_servo > 100: down_servo = 100
if down_servo < 0: down_servo = 0
set_servo_angle(servo1_pwm, up_servo)
set_servo_angle(servo2_pwm, down_servo)
time.sleep(0.1)
except KeyboardInterrupt:
servo1_pwm.stop()
servo2_pwm.stop()
GPIO.cleanup()
if __name__ == '__main__':
main()
演示视频
树莓派驱动舵机(二维云台)