使用树莓派控制舵机教程

本文介绍了如何使用Python在树莓派上通过GPIO库控制MG90S舵机,包括硬件连接、代码实现和舵机工作原理。通过设置占空比来调整舵机转动角度,调零确保物理位置与控制角度一致。同时提到了使用外部参数传入舵机引脚和角度进行控制,并建议在控制指令间留出间隔,以防止损坏设备。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 代码部分:
from time import sleep
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)#以BCM模式使用引脚
GPIO.setwarnings(False)# 去除GPIO警告


def setServoAngle(servo, angle):#此函数将角度转换为占空比
    pwm = GPIO.PWM(servo, 50)#设置pwm波为50Hz,也就是20ms一周期
    pwm.start(8)#启动pwm
    dutyCycle = angle / 18. + 3.#此公式由舵机调零推算得出(+3是偏移量)(占空比=%2.5+(目标角度/180°)*(%12.5-%2.5))
    pwm.ChangeDutyCycle(dutyCycle)#调整pwm占空比
    sleep(0.3)
    pwm.stop()#关闭pwm


if __name__ == '__main__':
    import sys

    servo = int(sys.argv[1])#外部输入参数
    GPIO.setup(servo, GPIO.OUT)#设置指定的引脚为输出模式
    setServoAngle(servo, int(sys.argv[2]))
    GPIO.cleanup()#清除引脚占用
  • 使用方法:
  1. vim建立.py文件后按下“i”进入insert模式,使用shift+insert黏贴代码,按ESC退出insert模式,输入“:wq”保存文件;
  2. 输入
python3 文件名 舵机引脚 舵机角度
  • 注意:控制舵机转动时,发送的控制舵机旋转的两条命令之间要有一定间隔,因为舵机执行转动命令转到固定角度需要一定的时间。
  • 有时执行时需要以sudo执行

  • PS:已经安装tree,只要输入tree即可方便的看到当前文件目录的结构

  • 硬件连接部分:

舵机为MG90S型号,由三根线控制,棕色为负,红色为正,橙色是信号线

此舵机可以由树莓派直接供电,不需要外接电源

棕色GND

红色VCC

橙色GPIO

舵机接线后一定要检查连接是否正确再上电!!!否则可能会烧坏树莓派!可以在舵机和树莓派之间接一10k电阻。保护树莓派。

  • 此引脚图为网口对着自己时

  • 舵机调零:

舵机旋转角度是绝对位置,每一个位置对应固定的角度(类似于tab缩进,光标在屏幕上有固定的位置,当按下tab键时,光标跳到固定位置而不是固定缩进多少格),mg90s的旋转角度为0°~180°。

舵机调零是指当代码控制舵机在某一位置时(例如0度),舵机臂有可能不在0°位置,此时要通过改变舵机臂的固定位置,使舵机臂物理上处于0°位置。

舵机内部的控制电路,电位计(可变电阻器)和电机均被连接到电路板上,如内部结构图的右边部分。控制电路通过电位计可监控舵机的当前角度。

如果轴的位置与控制信号相符,那么电机就会关闭。如果控制电路发现这个角度不正确,它就会控制马达转动,直到它达到指定的角度。舵机角度根据制造商的不同而有所不同。比如,一个180度的舵机,它可以在0度至180度之间运动。由于限位装置被安装在主输出装置上,超出这个范围机械结构就不能再转动了。

舵机的输出功率与它所需要转动的距离成正比。如果输出轴需要转动很长的距离,马达就会全速运转,如果它只需要短距离转动,马达就会以较慢的速度运行,这叫做速度比例控制。

控制线用于传输角度控制信号。这个角度是由控制信号脉冲的持续时间决定的,这叫做脉冲编码调制(PCM)。舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围,总间隔为2ms。脉冲的宽度将决定马达转动的距离。例如:1.5毫秒的脉冲,电机将转向90度的位置(通常称为中立位置,对于180°舵机来说,就是90°位置)。如果脉冲宽度小于1.5毫秒,那么电机轴向朝向0度方向。如果脉冲宽度大于1.5毫秒,轴向就朝向180度方向。以180度舵机为例,对应的控制关系是这样的:

0.5ms———— 0度;

1.0ms———— 45度;

1.5ms———— 90度;

2.0ms———– 135度;

2.5ms———– 180度;

  • 占空比是指在一个脉冲循环内,通电时间相对于总时间所占的比例。占空比(Duty Ratio)在电信领域中有如下含义:例如:脉冲宽度1μs,信号周期4μs的脉冲序列占空比为0.25。

舵机代码中是以占空比来进行舵机旋转角度的控制,而占空比和角度的变化是线性,所以可以得到计算公式为:

占空比 = (0.5ms/20ms) + (旋转角度/180°)((2.5ms/20ms) - (0.5ms/20ms))

20ms是一个脉冲循环的周期,由设置的pwm波的频率为50Hz计算得到。

### 舵机控制代码实现 以下是基于 Python 的树莓派 PWM 控制舵机的代码示例。该代码利用 `RPi.GPIO` 库生成 PWM 信号,从而精确控制舵机的角度。 ```python import RPi.GPIO as GPIO import time # 设置GPIO模式 GPIO.setmode(GPIO.BCM) # 定义舵机连接的GPIO引脚 servo_pin = 18 # 初始化GPIO引脚为输出模式 GPIO.setup(servo_pin, GPIO.OUT) # 创建PWM实例,频率设置为50Hz (常见SG90舵机的工作频率)[^3] pwm = GPIO.PWM(servo_pin, 50) # 启动PWM,默认角度设为0度对应的占空比 pwm.start(2.5) # 对应于0度的位置 try: while True: # 将舵机旋转到0度位置(对应2.5%的占空比) pwm.ChangeDutyCycle(2.5) time.sleep(1) # 将舵机旋转到90度位置(对应7.5%的占空比) pwm.ChangeDutyCycle(7.5) time.sleep(1) # 将舵机旋转到180度位置(对应12.5%的占空比) pwm.ChangeDutyCycle(12.5) time.sleep(1) except KeyboardInterrupt: pwm.stop() GPIO.cleanup() ``` 上述代码展示了如何通过调整 PWM 占空比来控制 SG90 舵机的不同角度[^1]。具体来说: - **占空比范围**:对于常见的 SG90 舵机,其工作范围通常是从 0° 到 180°,分别对应约 2.5% 和 12.5% 的占空比。 - **时间延迟**:为了确保舵机能平稳移动至目标位置,每次更改占空比后需加入适当的时间延时 (`time.sleep`)。 如果使用 Arduino 平台,则可以通过专门的库简化操作。下面是一个简单的 Arduino 示例代码用于控制单个舵机: ```cpp #include <Servo.h> // 声明一个Servo对象 Servo myServo; void setup() { // 将舵机附加到指定引脚 myServo.attach(9); // 连接到数字端子9 } void loop() { // 移动舵机到0度位置 myServo.write(0); delay(1000); // 移动舵机到90度位置 myServo.write(90); delay(1000); // 移动舵机到180度位置 myServo.write(180); delay(1000); } ``` 此代码片段中引入了 `<Servo.h>` 库,它提供了方便的方法如 `.write()` 来设定舵机的目标角度[^4]。 #### 注意事项 - 不同型号的舵机可能具有不同的工作电压、电流需求以及响应特性,请查阅产品规格书确认适用参数。 - 如果需要同时驱动多个舵机,建议考虑专用的多通道舵机控制器或扩展板以减轻主控芯片负担。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

__Witheart__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值