热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

树莓派3b+控制舵机、伺服电机的驱动代码。

舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度舵机为例,那么对应的控制关系是这样的:0.5ms------------

舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度舵机为例,那么对应的控制关系是这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
请看下形象描述吧:


  舵机的工作电压和电流:

每一款舵机都有自己的参数,如TR213舵机的工作电压是4.8-7.2V,TR205舵机的工作电压是4.8-6V,电压不能超过这个范围,否则会很容易烧坏舵机,在不清楚舵机工作电压范围的情况下,建议使用5V给舵机供电。

舵机的工作电流是根据舵机的实际情况而定的,如TR213舵机,在空载的时候电流几乎为0,而在正常负载的情况下,电流在0.5A左右,视实际情况而定。六足机器人需要18个TR213金属舵机,需要提高的电流大概在8A左右,如果电源功率不够会影响舵机的性能,最常见的现象是,当一个舵机负载的时候,其他舵机会出现混乱,无规律的乱摆。

    舵机的接线如下图:

市场上90%的舵机中间那根线都是正级。

 

基础知识介绍的差不多了,具体可以去百度看看舵机手册。

 

下面我们来说说在树莓派中,如何用wiringPi库去驱动舵机随心所欲的转。为什么要用wiringPi库呢,因为博主不怎么喜欢写Python,博主喜欢写c/c++代码。废话不多说,开始。

    第一:首先,我已经知道了舵机的pwm周期为20ms,然后是这样的

0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;

也就是说给它1.5ms的高电平,19.5ms的低电平转向0度位置。这里需要注意,是0度位置,不是舵机转0度,当然如果舵机怎么正好处于0度位置,当然也不转。这里可能就有人要问了,那啥位置算是0度位置呢?根据我对舵机的理解(180度的舵机),就是你向一个方向用手转动舵机,到一个你无法转动的地方,这个位置不是0度位置,就是180度位置。然后你用下面的代码运行一下就知道了。

        while(1)//turn to 0

        {

                digitalWrite(15,HIGH);

                delayMicroseconds(500);

                digitalWrite(15,LOW);

                delayMicroseconds(19500);

        }

我这里就这样来模仿pwm的。这个代码一运行,舵机就自动到了0度位置。

    同理,想转到45度位置,90度位置,135度位置,180度位置的代码如下:

 while(1) //turn to 45

        {

                digitalWrite(15,HIGH);

                delayMicroseconds(1000);

                digitalWrite(15,LOW);

                delayMicroseconds(19000);

        }

 while(1) //turn to 90

        {

                digitalWrite(15,HIGH);

                delayMicroseconds(1500);

                digitalWrite(15,LOW);

                delayMicroseconds(18500);

        }

 while(1) //turn to 135

        {

                digitalWrite(15,HIGH);

                delayMicroseconds(2000);

                digitalWrite(15,LOW);

                delayMicroseconds(18000);

        }

 while(1) //turn to 180

        {

                digitalWrite(15,HIGH);

                delayMicroseconds(2500);

                digitalWrite(15,LOW);

                delayMicroseconds(17500);

        }

 

 

这里可能有人要说为啥不用delay()函数呢,因为delay函数精确到毫秒,当我传1.5给它的时候,和传1给它的时候,你会发现舵机都是转向45度位置,因为delay(int x),当1.5传过去的时候精度丢失了。(我一开始就犯了这个错误,尴尬啊)

 

    到这里我想你应该已经知道怎么旋转45度,90度,等等了吧。然后你可能发现舵机旋转的太快,可能不受自己的控制了。这里我就要给你提供一种思路,怎么去解决这个问题。

当然,本人能力有限,写的难免有错误,希望指正。

下面我给一个很不错的链接,想深入研究的可以去看看(他用的是单片机)

http://www.njliaohua.com/lhd_5xtsq7jr1e0088t3wpu3_1.html

    我是这样认为的。0.5ms转向0度,1ms转向45度,那个这其中是不是经历了0.5ms,而且转了45度,所以我就用0.5=500us,500us/45度。然后得出约为11.11us/度。

接下来我的代码是这样写的。

       intangle=0;

       scanf(“%d”,&angle);//从键盘输入要转的角度。

while(1)

        {

               x=11.11*i;

                digitalWrite(15,HIGH);

                delayMicroseconds(500+x);

                digitalWrite(15,LOW);

                delayMicroseconds(19500-x);

              if(i==angle)

                        break;

                i++;

        }

 

这样一来速度确实是降了下来,但是每次舵机都要先转向0度位置,然后才能转向我们输入的个角度位置,这其中道理我想你们应该懂吧。

    到这里你应该可以降低舵机的速度了吧,我就给你这么多思路,下面的路,让你自己走吧。

这里我给个demo吧。

#include#include
void init();int main(){        init();        int angle=0;        scanf("%d",&angle);
int i=0;        float x=0;
        k=180;//180次循环的时间够了        while(k--){                x=11.11*i;digitalWrite(15,HIGH);delayMicroseconds(500+x);digitalWrite(15,LOW);  delayMicroseconds(19500-x);                if(i==angle)                        break;                i++;}                return0;}

void init(){        wiringPiSetup();        pinMode(15,OUTPUT);}


推荐阅读
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 本题来自WC2014,题目编号为BZOJ3435、洛谷P3920和UOJ55。该问题描述了一棵不断生长的带权树及其节点上小精灵之间的友谊关系,要求实时计算每次新增节点后树上所有可能的朋友对数。 ... [详细]
  • yikesnews第11期:微软Office两个0day和一个提权0day
    点击阅读原文可点击链接根据法国大选被黑客干扰,发送了带漏洞的文档Trumps_Attack_on_Syria_English.docx而此漏洞与ESET&FireEy ... [详细]
  • Python 内存管理机制详解
    本文深入探讨了Python的内存管理机制,涵盖了垃圾回收、引用计数和内存池机制。通过具体示例和专业解释,帮助读者理解Python如何高效地管理和释放内存资源。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 利用Selenium与ChromeDriver实现豆瓣网页全屏截图
    本文介绍了一种使用Selenium和ChromeDriver结合Python代码,轻松实现对豆瓣网站进行完整页面截图的方法。该方法不仅简单易行,而且解决了新版Selenium不再支持PhantomJS的问题。 ... [详细]
  • 本文探讨了为何相同的HTTP请求在两台不同操作系统(Windows与Ubuntu)的机器上会分别返回200 OK和429 Too Many Requests的状态码。我们将分析代码、环境差异及可能的影响因素。 ... [详细]
  • 在高并发需求的C++项目中,我们最初选择了JsonCpp进行JSON解析和序列化。然而,在处理大数据量时,JsonCpp频繁抛出异常,尤其是在多线程环境下问题更为突出。通过分析发现,旧版本的JsonCpp存在多线程安全性和性能瓶颈。经过评估,我们最终选择了RapidJSON作为替代方案,并实现了显著的性能提升。 ... [详细]
  • CSS高级技巧:动态高亮当前页面导航
    本文介绍了如何使用CSS实现网站导航栏中当前页面的高亮显示,提升用户体验。通过为每个页面的body元素添加特定ID,并结合导航项的类名,可以轻松实现这一功能。 ... [详细]
  • 本文详细介绍了如何下载并安装 Python,包括选择合适的版本、执行安装程序以及设置环境变量的步骤。此外,还提供了测试安装是否成功的简单方法。 ... [详细]
  • 本文详细介绍了 Python 中的条件语句和循环结构。主要内容包括:1. 分支语句(if...elif...else);2. 循环语句(for, while 及嵌套循环);3. 控制循环的语句(break, continue, else)。通过具体示例,帮助读者更好地理解和应用这些语句。 ... [详细]
  • 本文探讨了如何在Classic ASP中实现与PHP的hash_hmac('SHA256', $message, pack('H*', $secret))函数等效的哈希生成方法。通过分析不同实现方式及其产生的差异,提供了一种使用Microsoft .NET Framework的解决方案。 ... [详细]
  • 本文介绍了如何通过Java代码计算一个整数的位数,并展示了多个基础编程示例,包括求和、平均分计算、条件判断等。 ... [详细]
  • 解决Spring Boot项目创建失败的问题
    在尝试创建新的Spring Boot项目时遇到了一些问题,具体表现为在项目创建过程中的两个关键步骤出现错误。本文将详细探讨这些问题及其解决方案。 ... [详细]
  • JMeter接口关联与数据提取:正则表达式和JSON Extractor的使用
    在使用JMeter进行接口测试时,常常需要从前一个接口的响应中提取数据并应用于后续请求。本文将详细介绍如何利用正则表达式提取器(Regular Expression Extractor)和JSON Extractor来实现这一需求。 ... [详细]
author-avatar
撒大时代撒的照写真
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有