热门标签 | 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);}


推荐阅读
  • 根据最新发布的《互联网人才趋势报告》,尽管大量IT从业者已转向Python开发,但随着人工智能和大数据领域的迅猛发展,仍存在巨大的人才缺口。本文将详细介绍如何使用Python编写一个简单的爬虫程序,并提供完整的代码示例。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 本次考试于2016年10月25日上午7:50至11:15举行,主要涉及数学专题,特别是斐波那契数列的性质及其在编程中的应用。本文将详细解析考试中的题目,并提供解题思路和代码实现。 ... [详细]
  • 脑机接口(BCI)技术正逐步将科幻变为现实,从帮助听障人士恢复听力到使瘫痪者重新站立,甚至可能将多年的学习过程压缩至瞬间。本文探讨了这一前沿技术的现状、挑战及其未来前景。 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 本文介绍了如何使用JQuery实现省市二级联动和表单验证。首先,通过change事件监听用户选择的省份,并动态加载对应的城市列表。其次,详细讲解了使用Validation插件进行表单验证的方法,包括内置规则、自定义规则及实时验证功能。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文详细探讨了HTTP 500内部服务器错误的成因、解决方案及其在Web开发中的影响。通过对具体案例的分析,帮助读者理解并解决此类问题。 ... [详细]
  • 本文探讨了如何在 PHP 的 Eloquent ORM 中实现数据表之间的关联查询,并通过具体示例详细解释了如何将关联数据嵌入到查询结果中。这不仅提高了数据查询的效率,还简化了代码逻辑。 ... [详细]
  • 自己用过的一些比较有用的css3新属性【HTML】
    web前端|html教程自己用过的一些比较用的css3新属性web前端-html教程css3刚推出不久,虽然大多数的css3属性在很多流行的浏览器中不支持,但我个人觉得还是要尽量开 ... [详细]
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社区 版权所有