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


推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • GetWindowLong函数
    今天在看一个代码里头写了GetWindowLong(hwnd,0),我当时就有点费解,靠,上网搜索函数原型说明,死活找不到第 ... [详细]
  • 本文介绍了求解gcdexgcd斐蜀定理的迭代法和递归法,并解释了exgcd的概念和应用。exgcd是指对于不完全为0的非负整数a和b,gcd(a,b)表示a和b的最大公约数,必然存在整数对x和y,使得gcd(a,b)=ax+by。此外,本文还给出了相应的代码示例。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Java实战之电影在线观看系统的实现
    本文介绍了Java实战之电影在线观看系统的实现过程。首先对项目进行了简述,然后展示了系统的效果图。接着介绍了系统的核心代码,包括后台用户管理控制器、电影管理控制器和前台电影控制器。最后对项目的环境配置和使用的技术进行了说明,包括JSP、Spring、SpringMVC、MyBatis、html、css、JavaScript、JQuery、Ajax、layui和maven等。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文介绍了一些好用的搜索引擎的替代品,包括网盘搜索工具、百度网盘搜索引擎等。同时还介绍了一些笑话大全、GIF笑话图片、动态图等资源的搜索引擎。此外,还推荐了一些迅雷快传搜索和360云盘资源搜索的网盘搜索引擎。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 树莓派语音控制的配置方法和步骤
    本文介绍了在树莓派上实现语音控制的配置方法和步骤。首先感谢博主Eoman的帮助,文章参考了他的内容。树莓派的配置需要通过sudo raspi-config进行,然后使用Eoman的控制方法,即安装wiringPi库并编写控制引脚的脚本。具体的安装步骤和脚本编写方法在文章中详细介绍。 ... [详细]
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社区 版权所有