实例4:树莓派GPIO控制舵机转动

这篇具有很好参考价值的文章主要介绍了实例4:树莓派GPIO控制舵机转动。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实例4:树莓派GPIO控制舵机转动

实验目的

  1. 通过背景知识学习,了解舵机的外观及基本运动方式。
  2. 了解四足机器人mini pupper腿部单个舵机的组成结构。
  3. 通过GPIO对舵机进行转动控制,熟悉PWM。
  4. 了解mini pupper舵机组的整体调零。

实验要求

使用Python语言编程,在编程中使用PWM方法,通过树莓派GPIO控制外部舵机来回摆动,角度范围为0°~180°,周期为四秒。

实验知识

1. 什么是舵机?

舵机(servomotor)是一种简化版本的伺服电机,是位置伺服的驱动器,能够通过输入PWM信号控制旋转角度,具备轻量、小型、简化和性价比高的特点。
舵机适用于那些需要角度不断变化并可以保持的简单控制系统,它能实现较为精确的电机控制,在航模、遥控玩具、机器狗等品类上运用良好。
树莓派控制舵机,mangdang实例库,单片机,嵌入式硬件,舵机,PWM,树莓派

图片1:一般舵机的外观

2. 舵机的运动方式

舵机的运动方式是绕轴摆动,“舵机”一词也和它的运动方式有关,舵机常用来摆动调整方向,就像海洋上的水手的舵一样,航模和船模常常用舵机的摆动来调整一些零部件的角度。

图片2:舵机的运动动图

3. 舵机的组成结构

舵机一般是由保护外壳、内部集成控制芯片、小型直流电机、减速器齿轮组、位置检测单元构成的。

当主控给舵机发出转动信号时,控制芯片驱动电机开始转动,通过减速器将动力传达到输出轴上的摆臂,由位置检测单元反馈转动结果信号给主控进行反馈调节。
一般来说,位置检测单元可以是可变电阻,当舵机转动时,可变电阻随之改变,由此可得转动的角度信息。舵机包含了电机、传感器和控制器,是一个集成度高的、完整的伺服电机系统。
树莓派控制舵机,mangdang实例库,单片机,嵌入式硬件,舵机,PWM,树莓派

图片3:舵机的内部结构拍摄

4. mini pupper定制舵机的部分硬件参数

芒砀科技MANGDANG针对mini pupper的运动需求,在原型舵机的基础上优化改进了机械结构,定制了mini pupper专用舵机,这使得mini pupper的控制更加精确、动力更加澎湃。
树莓派控制舵机,mangdang实例库,单片机,嵌入式硬件,舵机,PWM,树莓派
图片3:定制舵机的外观

参考链接:mini pupper定制电机规格书 课程附件 MiniPupper-Servo-Spec.pdf

5.mini pupper舵机的控制方法

对于舵机的控制,首先要了解其基本硬件参数以及舵机对信号通讯的要求。
如图所示,mini pupper一代舵机允许PWM的直接使用,也就是说,舵机可以直接连接到树莓派上的GPIO_PWM端口使用而不需要考虑通讯协议,这对机器人入门开发者来说较为友好。
树莓派控制舵机,mangdang实例库,单片机,嵌入式硬件,舵机,PWM,树莓派
图片4:舵机端口的连线

mini pupper一代舵机部分参数表
name value
端口1(黄) PWM Signal
端口2(红) Vcc 4.8v~6v
端口3 (棕) GND
信号周期 20ms
信号频率 50HZ
脉冲长度范围 500us-2500us to 0°~180°
脉冲长度对应占空比 2.5% - 12.5%
信号高电平范围 2V-5V
信号低电平范围 0.0V-0.45V
中间位对应脉冲 1500 μsec

需要注意的是:
占空比=脉宽/周期
脉宽500us-2500us对应的占空比为2.5% - 12.5%

6. RPi的GPIO库中PWM的用法

import RPi.GPIO as GPIO	#	引入GPIO库
GPIO.setmode(GPIO.BOARD) #初始化GPIO引脚编码方式,需放在代码正式开始处
GPIO.setup(12, GPIO.OUT) #初始化GPIO引脚设置,需放在代码正式开始处
p = GPIO.PWM(channel, frequency)	#	创建pwm实例 channel为引脚号 frequency为频率
p.start(dc)	#	开始pwm	dc为初始占空比(0.0 <= dc <= 100.0)
p.stop() # 停止pwm
p.ChangeFrequency(freq)   # 改变频率(Hz)freq
p.ChangeDutyCycle(dc)  # 改变占空比(0.0 <= dc <= 100.0)
GPIO.cleanup() # 清理GPIO引脚

参考链接:RPi GPIO库中PWM()函数的详细资料

实验步骤

1. 编写Python程序 servo_PWM_GPIO.py

#!/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引脚

2. 运行程序servo_PWM_GPIO.py并观察效果

在servo_PWM_GPIO.py的目录下执行以下命令:

sudo python servo_PWM_GPIO.py

此时应观察到舵机在树莓派的控制下来回摆动,角度范围为0°~180°,周期为四秒。

3. 尝试运行Python程序 servo_PWM_GPIO_2.py[可选]

如果你希望尝试手动输入一个角度值来转动舵机,你可以试试servo_PWM_GPIO_2.py

#!/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引脚

4.尝试整机调零[可选]

为了确保控制精度,mini pupper上的舵机组通常在使用前先进行一次调零。
试试在命令行中运行舵机调零脚本 run_set_neatral.sh

sudo ./run_set_neatral.sh
#!/usr/bin/env sh

# step 1 stop robot service
systemctl stop robot

# step 2 set neatral position

echo 1500000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle
echo "pwm 0 setting pwm off parameter --> 90 degree "

echo 1500000 > /sys/class/pwm/pwmchip0/pwm1/duty_cycle
echo "pwm 1 setting pwm off parameter --> 90 degree"

echo 500000 > /sys/class/pwm/pwmchip0/pwm2/duty_cycle
echo "pwm 2 setting pwm off parameter --> 0 degree"

echo 2500000 > /sys/class/pwm/pwmchip0/pwm3/duty_cycle
echo "pwm 3 setting pwm off parameter --> 180 degree"

sleep 1

echo "Done ! "

如果希望了解校准的详细信息,你可以查看mini pupper的官方文档:校准

确保 Mini Pupper 已预先组装好,使用GUI校准工具来优化腿部的位置。
对于每条腿,移动杆,使所有腿都成 45 度角。 腿的角度会随着滑动条在屏幕上的位置而变化。
如果它不动,则说明您执行的步骤不正确。
您可以使用 iPhone 的倾斜传感器app、尺子或量角器来测量角度。

实验总结

经过本知识点的学习和实验操作,你应该能达到以下水平:

知识点 内容 了解 熟悉 掌握
舵机 舵机的外观及基本运动方式
舵机 单个舵机的组成结构
PWM PWM方法对舵机进行转动控制
调零与校准 mini pupper舵机组的调零与校准

版权信息:教材尚未完善,此处预留版权信息处理方式
mini pupper相关内容可访问:https://github.com/mangdangroboticsclub文章来源地址https://www.toymoban.com/news/detail-785172.html

到了这里,关于实例4:树莓派GPIO控制舵机转动的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【概念理解】单片机控制舵机之PWM波参数的设置

    我们要知道,SG90舵机接收的PWM信号的参数:f=50Hz,T=1/f,所以周期为20ms。 当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。 换句话说,我们要用单片机产生一个 周期(20ms) 的PWM波,然后获得对应这些时长(分别是 0.5ms 、 1ms 、 1.5ms 、 2ms 、 2.5ms )的 高电

    2024年02月10日
    浏览(28)
  • C51单片机定时器2实现SG90舵机控制

    谈起舵机最初的了解应用于航模,偶然的机会在网上看到有牛人使用多个舵机做人形机器人的关节,感觉这小东西很有趣,蒙发了买来学习学习的想法,这已经是多年前的事了,后来由于某些原因,这个想法直到今年才落地。小东西到手后,把玩了解后,本人把学习过程记录

    2023年04月24日
    浏览(41)
  • 【STM32单片机】STM32控制SG90舵机的PWM部分参数的设置解答

    我们要知道,SG90舵机接收的PWM信号的参数:f=50Hz,T=1/f,所以周期为20ms。 当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。 换句话说,我们要用单片机产生一个 周期(20ms) 的PWM波,然后获得对应这些时长(分别是 0.5ms 、 1ms 、 1.5ms 、 2ms 、 2.5ms )的 高电

    2024年02月13日
    浏览(40)
  • Arduino通过两个按键开关控制舵机转动(含代码)

    两个开关控制舵机转动 在 Arduino 上控制舵机需要使用到一个 Servo 库,可以通过该库来轻松实现对舵机的控制。下面是两个开关通过 Arduino 控制舵机的步骤: 1.连接硬件:将舵机的 VCC 引脚连接到 Arduino 板子的 5V 引脚,GND 引脚连接到 GND 引脚。将舵机的控制引脚(通常是橙色

    2024年02月12日
    浏览(49)
  • 用正点原子STM32F103ZET6精英板控制舵机转动实验保姆教程

    正点原子精英板一块 Jlink4线SWD下载线一根 精英板usb供电/下载线一根(负责给开发板供电) SG90舵机一个(三线:其中红线接5V电压,棕线接GED,橙黄色为信号线接开发板PB5引脚,舵机所给为3pin杜邦线母头,可用单根杜邦线(一头子一头母)将舵机线飞开接到精英板上)。 以

    2023年04月15日
    浏览(47)
  • 单片机——SG90舵机工作原理

    前言: 舵机控制的另一个专业名字叫伺服控制。 经过百度,伺服”—词源于希腊语“奴隶”的意思。人们想把“伺服机构”当个得心应手的驯服工具,服从控制信号的要求而动作。在讯号来到之前,转子静止不动;讯号来到之后,转子立即转动;当讯号消失,转子能即时自

    2023年04月08日
    浏览(28)
  • 基于PID的树莓派控制二自由度舵机人脸追踪云台设计

    一、舵机控制概述 脉冲宽度与舵机转角: 在脉冲信号频率50Hz的条件下输入的脉冲信号宽度和舵机转角的对应关系图以如图1.所示,该转角的计算公式如下。树莓派端通过占空比信号对舵机进行角度控制,将该占空比信号通过树莓派端传输给PCA9685芯片来控制舵机,实现追踪人

    2024年02月13日
    浏览(27)
  • 32单片机基础:GPIO输出

    目录 简介: GPIO输出的八种模式 STM32的GPIO工作方式 GPIO支持4种输入模式: GPIO支持4种输出模式: 浮空输入模式 上拉输入模式 下拉输入模式 模拟输入模式: 开漏输出模式:(PMOS无效,就是开漏输出,) 开漏复用输出模式 (P-MOS和N-MOS都有效) 推挽输出模式 推挽复用输出模

    2024年02月21日
    浏览(33)
  • 32单片机基础:GPIO输入

    按键介绍: 两种方式,我们一般用下接的方式。 第一个图:注意点。当按键按下,PA0接地,被置为低电平, 但是一旦按键松手,PA0悬空,引脚电压不确定。所以无论怎么读引脚也不知道知否被按下,所以为了解决这个问题,所以必须要求PA0是上拉输入的模式,这样引脚悬空

    2024年02月22日
    浏览(29)
  • 51单片机驱动SG90舵机抖动或者无反应问题解决方案

    1、自制的51单片机最小系统板。    2、加入了一个7805CV稳压模块,使用12V直流供电,随便找了个电源适配器。输出12V,1A 3、问题:确保程序无误,接线无误,上电之后舵机有轻微咔咔声,无法正确运行。或者有时候反复重新执行。根据观察判断是单片机运行几条指令之后就

    2024年02月14日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包