实例4:树莓派GPIO控制舵机转动
实例4:树莓派GPIO控制舵机转动
实验目的
- 通过背景知识学习,了解舵机的外观及基本运动方式。
- 了解四足机器人mini pupper腿部单个舵机的组成结构。
- 通过GPIO对舵机进行转动控制,熟悉PWM。
- 了解mini pupper舵机组的整体调零。
实验要求
使用Python语言编程,在编程中使用PWM方法,通过树莓派GPIO控制外部舵机来回摆动,角度范围为0°~180°,周期为四秒。
实验知识
1. 什么是舵机?
舵机(servomotor)是一种简化版本的伺服电机,是位置伺服的驱动器,能够通过输入PWM信号控制旋转角度,具备轻量、小型、简化和性价比高的特点。
舵机适用于那些需要角度不断变化并可以保持的简单控制系统,它能实现较为精确的电机控制,在航模、遥控玩具、机器狗等品类上运用良好。

图片1:一般舵机的外观
2. 舵机的运动方式
舵机的运动方式是绕轴摆动,“舵机”一词也和它的运动方式有关,舵机常用来摆动调整方向,就像海洋上的水手的舵一样,航模和船模常常用舵机的摆动来调整一些零部件的角度。
图片2:舵机的运动动图
3. 舵机的组成结构
舵机一般是由保护外壳、内部集成控制芯片、小型直流电机、减速器齿轮组、位置检测单元构成的。
当主控给舵机发出转动信号时,控制芯片驱动电机开始转动,通过减速器将动力传达到输出轴上的摆臂,由位置检测单元反馈转动结果信号给主控进行反馈调节。
一般来说,位置检测单元可以是可变电阻,当舵机转动时,可变电阻随之改变,由此可得转动的角度信息。舵机包含了电机、传感器和控制器,是一个集成度高的、完整的伺服电机系统。

图片3:舵机的内部结构拍摄
4. mini pupper定制舵机的部分硬件参数
芒砀科技MANGDANG针对mini pupper的运动需求,在原型舵机的基础上优化改进了机械结构,定制了mini pupper专用舵机,这使得mini pupper的控制更加精确、动力更加澎湃。

图片3:定制舵机的外观
参考链接:mini pupper定制电机规格书 课程附件 MiniPupper-Servo-Spec.pdf
5.mini pupper舵机的控制方法
对于舵机的控制,首先要了解其基本硬件参数以及舵机对信号通讯的要求。
如图所示,mini pupper一代舵机允许PWM的直接使用,也就是说,舵机可以直接连接到树莓派上的GPIO_PWM端口使用而不需要考虑通讯协议,这对机器人入门开发者来说较为友好。

图片4:舵机端口的连线
mini pupper一代舵机部分参数表
| name | value |
|---|---|
| 端口1(黄) | PWM Signal |
| 端口2(红) | Vcc |
| 端口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 timedef 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_valueGPIO.setmode(GPIO.BOARD) # 初始化GPIO引脚编码方式
servo_SIG = 32
servo_VCC = 4
servo_GND = 6
servo_frec = 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_frec) # 信号引脚=servo_SIG 频率=servo_frec in HZ
servo.start(0)
servo.ChangeDutyCycle(servo_width_min) # 回归-90°
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 timedef 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_valueGPIO.setmode(GPIO.BOARD) # 初始化GPIO引脚编码方式
servo_SIG = 32
servo_VCC = 4
servo_GND = 6
servo_frec = 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_frec) # 信号引脚=servo_SIG 频率=servo_frec in HZ
servo.start(0)
servo.ChangeDutyCycle(servo_width_min) # 回归-90°
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:passservo.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 positionecho 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 1echo "Done ! "
如果希望了解校准的详细信息,你可以查看mini pupper的官方文档:校准
确保 Mini Pupper 已预先组装好,使用GUI校准工具来优化腿部的位置。
对于每条腿,移动杆,使所有腿都成 45 度角。 腿的角度会随着滑动条在屏幕上的位置而变化。
如果它不动,则说明您执行的步骤不正确。
您可以使用 iPhone 的倾斜传感器app、尺子或量角器来测量角度。
实验总结
经过本知识点的学习和实验操作,你应该能达到以下水平:
| 知识点 | 内容 | 了解 | 熟悉 | 掌握 |
|---|---|---|---|---|
| 舵机 | 舵机的外观及基本运动方式 | ✔ | ||
| 舵机 | 单个舵机的组成结构 | ✔ | ||
| PWM | PWM方法对舵机进行转动控制 | ✔ | ||
| 调零与校准 | mini pupper舵机组的调零与校准 | ✔ |
版权信息:教材尚未完善,此处预留版权信息处理方式
mini pupper相关内容可访问:https://github.com/mangdangroboticsclub
相关文章:
实例4:树莓派GPIO控制舵机转动
实例4:树莓派GPIO控制舵机转动 实验目的 通过背景知识学习,了解舵机的外观及基本运动方式。了解四足机器人mini pupper腿部单个舵机的组成结构。通过GPIO对舵机进行转动控制,熟悉PWM。了解mini pupper舵机组的整体调零。 实验要求 使用Py…...
【音视频处理】为什么MP3不是无损音乐?音频参数详解,码率、采样率、音频帧、位深度、声道、编码格式的关系
大家好,欢迎来到停止重构的频道。上期我们讨论了视频的相关概念,本期我们讨论音频的相关概念。包括采样率、码率、单双声道、音频帧、编码格式等概念。这里先抛出一个关于无损音频的问题。为什么48KHz采样率的.mp3不是无损音乐 ,而48KHz采样率…...
Linux 环境变量
Linux 环境变量能帮你提升 Linux shell 体验。很多程序和脚本都通过环境变量来获取系统信息、存储临时数据和配置信息。在 Linux 系统上有很多地方可以设置环境变量,了解去哪里设置相应的环境变量很重要。 认识环境变量 bash shell 用环境变量(environme…...
从功能测试(点点点)到进阶自动化测试,实现薪资翻倍我只用了3个月时间
前言 从事测试工作已3年有余了,今天想聊一下自己刚入门时和现在的今昔对比,虽然现在也没什么成就,只能说笑谈一下自己的测试生涯,各位看官就当是茶余饭后的吐槽吧,另外也想写一写自己的职场感想,希望对刚开…...
aspnetcore 原生 DI 实现基于 key 的服务获取
你可能想通过一个字符串或者其他的类型来获取一个具体的服务实现,那么在 aspnetcore 原生的 MSDI 中,如何实现呢?本文将介绍如何通过自定义工厂来实现。我们现在恰好有基于 Json 和 MessagePack 的两种序列化器有一个接口是这样的publicinter…...
华为OD机试 -最大子矩阵和(Python) | 机试题+算法思路+考点+代码解析 【2023】
最大子矩阵和 题目 给定一个二维整数矩阵 要在这个矩阵中 选出一个子矩阵 使得这个子矩阵内所有的数字和尽量大 我们把这个子矩阵成为“和最大子矩阵” 子矩阵的选取原则,是原矩阵中一段相互连续的矩形区域 输入 输入的第一行包含两个整数N,M (1 <= N,M <= 10) 表示…...
C2驾照科一学习资料(1)
目录 记1分 记3分 记6分 记9分 记12分 你有不伤别人的教养 却缺少一种不被人伤的气场 若没人护你周全 就请善良中带点锋芒为自己保驾护航 这个世界你若好到毫无保留 对方就会坏到肆无忌惮 记1分 《道路交通安全违法行为记分管理办法》规定,机动车驾驶人有下列…...
4576: 移动数组元素
描述给定一个n个元素的一维数组,将下标从0到p的元素全部平移到数组尾部。输入第一行有两个正整数n和p(2<n<100,0<p<n)。第二行有n个整数,表示数组的各个元素。输出在一行中按顺序输出移动后的各个数组元素…...
字符串中<br>处理
需求: 后端返回的字符串中带有br换行符,前端需要处理行内及行尾的换行符。具体需求可分为以下两个: 若是字符串末尾有换行符,需要去掉。若是字符串内有换行符,有两种需求:①将换行符转换成逗号或其它符号&…...
大数据技术原理与应用介绍
大数据技术原理与应用 概述 大数据不仅仅是数据的“大量化”,而是包含“快速化”、“多样化”和“价值化”等多重属性。 两大核心技术:分布式存储和分布式处理 大数据计算模式 批处理计算流计算图计算查询分析计算 大数据具有数据量大、数据类型繁…...
【Python】序列与列表(列表元素的增删改查,求之,列表推导式、列表的拷贝)
一、序列序列的概念:按照某种顺序排列的数据类型就叫做序列,比如字符串,列表,元组,集合序列的共同点是都有下标,支持index()方法和count(),也支持切片处理(等同于字符串序列的切片处理)l1 [0, …...
update导致死锁
update delete 操作,如果走的索引,对索引和主键索引加行锁 如果没有走索引,锁整张表。 不开启事务,mysql本身也会加锁 一般MYSQL在执行CREATE,ALTER,INSERT等命令时会自动加锁 在对数据进行更新操作时 如果update没用到索引&…...
Java 集合 --- 如何遍历Map
Java 集合 --- 如何遍历MapMap的基本操作如何遍历MapType of HashMapMap没有继承Collection接口AbstractMap和AbstractCollection是平级关系 Map的基本操作 package map; import java.util.*; /*** This program demonstrates the use of a map with key type String and val…...
C#从值类型、引用类型到装箱和拆箱
上一篇文章讲了C#的值类型和引用类型,这里再来看看值类型和引用类型最直接的使用场景:装箱和拆箱。 一、基本概念 装箱:值类型转化为引用类型的过程。从托管堆中为新生成的引用类型对象分配内存,再把值类型的实例字段拷贝到托管堆上新对象的…...
Java中的逻辑运算符/移位运算符简单总结
前段时间刷到了力扣关于位运算的题,这里浅浅记录一下! 1. 逻辑位运算 1.1 与 & &:按位与进行二进制计算,规则是同为1则为1,不同为0,具体如下: 0&00, 0&10, 1&00, 1&…...
活动预告 | GAIDC 全球人工智能开发者先锋大会
大会主题——“向光而行的 AI 开发者” 2023 全球人工智能开发者先锋大会(GAIDC) 由世界人工智能大会组委会、上海市经济和信息化委员会、上海市人才工作领导小组办公室及中国(上海)自由贸易试验区临港新片区管理委员会指导&…...
【Linux系统】认识操作系统和操作系统如何进行管理以及进程相关状态
进程概念1 认识冯诺依曼体系结构1.1 冯诺依曼体系结构存储器的作用2 操作系统(Operator System,OS)2.1 OS如何进行管理3 进程3.1 OS管理进程:先描述再组织3.2 描述进程-PCB3.3 查看进程3.4 通过系统调用获取进程标识符3.5 通过系统调用创建子进程——for…...
【0基础学爬虫】爬虫基础之HTTP协议的基本原理介绍
大数据时代,各行各业对数据采集的需求日益增多,网络爬虫的运用也更为广泛,越来越多的人开始学习网络爬虫这项技术,K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章,为实现从易到难全方位覆盖,特设【0基础学…...
SpringBoot 整合定时任务
注解概览 EnableScheduling 在配置类上使用,开启计划任务的支持(类上) Scheduled 来申明这是一个任务,包括cron,fixDelay,fixRate等类型(方法上,需先开启计划任务的支持) pom依赖 <parent…...
我的零分周赛:CSDN周赛第30期,成绩“0”分,天然气定单、小艺读书、买苹果、圆桌
CSDN周赛第30期,成绩“0”分,天然气定单、小艺读书、买苹果🍎、圆桌。 (本文获得CSDN质量评分【91】)【学习的细节是欢悦的历程】Python 官网:https://www.python.org/ Free:大咖免费“圣经”教程《 python 完全自学教…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
企业如何增强终端安全?
在数字化转型加速的今天,企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机,到工厂里的物联网设备、智能传感器,这些终端构成了企业与外部世界连接的 “神经末梢”。然而,随着远程办公的常态化和设备接入的爆炸式…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
OD 算法题 B卷【正整数到Excel编号之间的转换】
文章目录 正整数到Excel编号之间的转换 正整数到Excel编号之间的转换 excel的列编号是这样的:a b c … z aa ab ac… az ba bb bc…yz za zb zc …zz aaa aab aac…; 分别代表以下的编号1 2 3 … 26 27 28 29… 52 53 54 55… 676 677 678 679 … 702 703 704 705;…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
Docker、Wsl 打包迁移环境
电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本: 2.2.4.0 内核版本: 5.15.153.1-2 WSLg 版本: 1.0.61 MSRDC 版本: 1.2.5326 Direct3D 版本: 1.611.1-81528511 DXCore 版本: 10.0.2609…...
