一、双舵机实现云台运动
(1)舵机的运动原理
通常情况下,伺服电机(舵机)是由一个标准的直流系统和一个内部反馈控制装置(一个减速齿轮和电位计)来组成的。伺服电机(舵机)的主要作用是将齿轮轴旋转到一个预定义的方向上。伺服电机(舵机)有3个输入引脚,GND、VCC和Signal。脉冲宽度调制技术(PWM)被应用于舵机的控制,轴的方向由脉冲的持续时间决定。需要记住的是,舵机转动的方向不是由占空比决定的,而是由脉冲长度 t 决定的。有的舵机使用的PWM频率为 fPWM=50HZ,其对应于的PWM周期 T=20 ms。脉冲长度 t 和转动方向之间的关系是线性的,但也取决于电机和齿轮的配合。下面是一个脉冲长度和转动方向的关系图。
想进一步了解伺服电机的同学:点这里
本文选用的舵机为MG90S,数字电机,下面是一些基本参数:
• 产品类型:MG90S舵机
• 产品扭矩:2.0kg/cm(4.8V),2.8kg/cm(6V)
• 产品速度:0.11秒/60°(4.8V),0.09秒/60°(6V)
• 转动角度:180°
• 工作电压:4.8 ~ 6V
• 齿轮形式:金属齿轮
• 死区设定:5us (微秒)
• 产品重量:12.2g
• 产品尺寸:22.8mm × 12.2mm × 28.5mm
(2)代码实现
在将舵机装进云台支架里时,一定要注意舵机转轴的初始角度,然后要注意竖直方向上的云台运动时是否会卡住,造成舵机损坏。然后2是代表2%,也就是min_angle,12%是max_angle。
下面的是一个舵机角度的测试代码,可以通过这个测试代码,获得转动角度和占空比:
import RPi.GPIO as GPIO
import time
P_SERVO = 16
fPWM = 50 #hz
a = 10
b = 2
def setup():
global pwm
GPIO.setmode(GPIO.BOARD)
GPIO.setup(P_SERVO,GPIO.OUT)
pwm = GPIO.PWM(P_SERVO,fPWM)
pwm.start(0)
def setDirection(direction):
duty = a / 180 * direction + b
pwm.ChangeDutyCycle(duty)
print("direction =%f , duty = %f "%(direction,duty))
time.sleep(1)
print('starting')
setup()
for direction in range(0,181,10):
setDirection(direction)
direction = 0
setDirection(0)
GPIO.cleanup()
print("done")
接下来就是舵机代码的编写了。steering.py
写代码时要注意舵机的消抖。舵机有一个死区,消抖就是取消发射脉冲,将占空比设置为0。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 云台舵机的代码
import RPi.GPIO as GPIO
import time
import atexit
# ONE servo class
class Steering:
max_delay = 0.2
min_delay = 0.04
def __init__(self,channel,init_position,min_angle,max_angle,speed):
self.channel = channel
self.init_position = init_position
self.position = init_position
self.min_angle = min_angle
self.max_angle = max_angle
self.speed = speed
atexit.register(GPIO.cleanup)
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False