树莓派控制舵机云台

舵机控制与PWM输出

学习记录

手上有一套电赛时候买的舵机云台。扭矩15KG。型号为LD-1501MG。

舵机

两个LD-1501MG舵机角度范围都是180度。
控制的PWM波周期为20ms。
角度与正脉冲宽度映射如下所示。
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;

工作电压6-7.4V,实际使用中,空转时5V可驱动。

代码

直接上代码。

/*************************************************************************
    > File Name: sopwm.c
    > Author: admin
    > Mail: 
    > Created Time: 2020年01月03日 星期五 18时43分25秒
    > Modified Time:2020年01月03日 星期五 21时34分38秒
 ************************************************************************/

#include <wiringPi.h>
#
### 树莓派控制舵机云台的代码实现 #### 单一舵机控制示例 以下是一个简单的Python代码片段,展示如何使用`RPi.GPIO`库来控制单个舵机的旋转。这段代码可以让舵机从一个角度平滑过渡到另一个角度。 ```python import RPi.GPIO as GPIO import time # 定义GPIO引脚 servo_pin = 18 # 使用BCM编号模式下的第18号引脚作为输出口 GPIO.setmode(GPIO.BCM) GPIO.setup(servo_pin, GPIO.OUT) # 初始化PWM对象 pwm = GPIO.PWM(servo_pin, 50) # 设置频率为50Hz pwm.start(0) def set_servo_angle(angle): """ 将给定的角度转换成占空比并应用 """ duty_cycle = angle / 18 + 2 pwm.ChangeDutyCycle(duty_cycle) time.sleep(0.3) pwm.ChangeDutyCycle(0) try: for i in range(0, 181, 10): # 从0° 到 180° 每次增加10° set_servo_angle(i) for i in range(180, -1, -10): # 从180° 返回至0° 每次减少10° set_servo_angle(i) finally: pwm.stop() GPIO.cleanup() ``` 以上代码展示了基本的操作流程:初始化GPIO引脚、创建PWM实例、定义角度设置函数以及循环调用这些方法以达到平稳移动的效果[^3]。 --- #### 双轴云台控制(水平+垂直) 对于双轴云台控制系统,我们需要同时操控两个舵机——一个负责左右摇摆(水平方向),另一个负责上下倾斜(垂直方向)。这里给出了一种可能的设计思路: ```python import threading from gpiozero import Servo import cv2 import numpy as np import face_recognition class CloudPlatformController: def __init__(self, pan_gpio=17, tilt_gpio=18): self.pan_servo = Servo(pan_gpio) # 左右转动伺服电机 self.tilt_servo = Servo(tilt_gpio) # 上下转动伺服电机 # 默认初始位置 self.current_pan_position = 0 self.current_tilt_position = 0 def move_to(self, target_x, target_y): error_x = target_x - 0.5 # 计算X轴误差 error_y = target_y - 0.5 # 计算Y轴误差 kp = 0.5 # 比例增益系数 new_pan_pos = max(-1, min(1, self.current_pan_position + kp * error_x)) new_tilt_pos = max(-1, min(1, self.current_tilt_position + kp * error_y)) self.pan_servo.value = new_pan_pos self.tilt_servo.value = new_tilt_pos self.current_pan_position = new_pan_pos self.current_tilt_position = new_tilt_pos def track_faces(controller): cap = cv2.VideoCapture(0) while True: ret, frame = cap.read() rgb_frame = frame[:, :, ::-1] face_locations = face_recognition.face_locations(rgb_frame) if len(face_locations) > 0: top, right, bottom, left = face_locations[0] height, width, _ = frame.shape center_x = (left + right) / (2 * width) center_y = (top + bottom) / (2 * height) controller.move_to(center_x, center_y) key = cv2.waitKey(1) & 0xFF if key == ord('q'): break cap.release() if __name__ == "__main__": cloud_platform_controller = CloudPlatformController() try: t = threading.Thread(target=track_faces, args=(cloud_platform_controller,)) t.daemon = True t.start() while True: pass except KeyboardInterrupt: exit(0) ``` 在这个例子中,我们引入了OpenCV和face_recognition库用于捕获视频帧并对其中的人脸进行定位;随后依据人脸中心坐标计算偏差量并通过比例调节律调整两路舵机的姿态直至锁定目标为止[^4]。 --- #### 键盘控制舵机云台 如果希望借助键盘按键触发相应动作,则可以参考如下做法: ```python from pynput.keyboard import Key, Listener from gpiozero import AngularServo pan_servo = AngularServo(17, min_pulse_width=0.0006, max_pulse_width=0.0023) tilt_servo = AngularServo(18, min_pulse_width=0.0006, max_pulse_width=0.0023) current_angles = {'pan': 0, 'tilt': 0} def on_press(key): global current_angles step_size = 10 if hasattr(key, 'char') and key.char.isdigit(): value = int(key.char) if value == 4: # Left Arrow current_angles['pan'] -= step_size elif value == 6: # Right Arrow current_angles['pan'] += step_size elif value == 8: # Up Arrow current_angles['tilt'] += step_size elif value == 2: # Down Arrow current_angles['tilt'] -= step_size pan_servo.angle = current_angles['pan'] tilt_servo.angle = current_angles['tilt'] with Listener(on_press=on_press) as listener: listener.join() ``` 在此处采用了第三方模块 `pynput` 来监听用户的击键事件,并据此更新对应舵机的目标方位角数值[^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值