180°和360°伺服电机速度控制,转向控制Arduino代码与库(亲测可用)

本文详细介绍了如何使用Arduino控制180°和360°伺服电机的速度和转向,包括write()和writeMicroseconds()函数的使用,以及伺服电机的PWM脉宽控制。通过示例代码展示了如何实现精确的停机和速度控制,同时提到了VarSpeedServo库的使用,帮助读者理解如何进行伺服电机的高级控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面的话:如果你只想要我代码,建议你复制粘贴第一个和最后一个,试试。如果你想学习以后如何解决类似问题而不是仅仅的抄代码,建议你读完我啰嗦的话。希望对你有所帮助。你可以抄袭我代码,但请添加出处/引文。

(PS:我的每篇帖子都是用来记录我成长的,相当于公开的日记,很多原创内容不一定是我创造的算法,很多技术本来就存在的,我只不过是把它们学懂了然后用大白话整理在这里了,但是我可以百分百保证我的帖子没有抄袭谁的文章,若有雷同,纯属巧合。我写博客的初衷是记录成长,后来渐渐地有小伙伴私聊称赞我,我就觉得我曾经也是举目四望无援助的萌新,很多技术都是大佬懒得分享,萌新又没几个会的,所以我就想做点承上启下造福萌新的事情。然后写了很多帖子,甚至逼迫自己至少一个月产一篇。那段时间忙碌又快乐着。渐渐地开始做Youtube的搬运工。直到我的萌新福利贴刷到了博客前一万排名,当时很多酸溜溜的小伙伴表示不服,凭什么你这么垃圾都能排前一万?这个,我觉得这个应该和帖子数量和点击率有关系。越来越多的人不再讨论技术而是无脑喷我,然后那段时间我就深刻的反思,觉得是浮躁了。然后就关闭了帖子,全部设置成私密了。今天有技术萌新小伙伴找到我,希望我分享更多关于树莓派的东西,对之前的事情也表示理解。嗯,感谢还在支持我写帖子的你们!今后我们大家一起努力,如果我哪写的不对,请批评指正,谢谢大家!)

一.转向控制:我想用360度伺服电机当小车的驱动电机,Arduino的例子里有个sweep可用来参考,然后根据本论坛博客上的建议,写了如下代码。功能是驱动小车前进(轮子转一圈360度)精确到让停就停的0.5毫米行程误差。

除了大神们会考虑使用传统的PWM控制(自己写代码发射PWM信号)之外,我们常用的Arduino自带的函数,有两种。一种是write()函数,另一种是writeMicroseconds();函数。这两种,前者是通过设定舵机旋转角度控制移动距离,后者是通过设置延时脉宽(PWM)微妙数来控制位移。设定也很简单:

PS:我说的都是默认值,我写的代码肯定都对,运行正常,但是真实值需要你查芯片手册设定,毕竟你的电机与我的不一样,如果你直接用我的代码运行你的电机,在停止电机的命令的时候电机可能不会停止,会小幅度运转。

servo.write(x): 若选择X值的范围是【0-180】,x是角度值,90是中间位置,0是全速前进,180是反向全速前进。

                        若选择X值的范围是【0-360】,x是角度值,180是中间位置,360是全速前进,-360是反向全速前进

servo.writeMicroseconds(X): 若选择X值的范围是【1000-2000】,x是脉冲微妙数,1500是中间位置,1000是全速前进,2000是反向全速前进。

至于真实值,需要你去查当前使用的伺服电机的芯片手册,比如我的伺服电机(型号:Parallax continuous servo motor)描述如下:

那么X值的范围就应该是【1300-1700】。它的PWM脉冲控制原理如下图所示

即便是如此查芯片手册进行精确设定,也不能保证伺服电机就100%按我们所想的来运动。这个芯片手册在结尾也说了:

都1525微秒了还小幅度转动呢,66666。还a little faster呢,哎。。。官方也是一脸无奈的摆摆手“怪我喽?”。光转向控制(PWM)还不够啊,我们太需要速度控制了。在本文的最后一个代码示例中我自己调除了真实误差10us(比如停车是1490(1500))。

下文所示例子是我用write(degree)函数写的控制两个伺服舵机当小车驱动电机的例子:

//arduino的<servo.h>库提供两个函数控制舵机。write()和writeMicroseconds();
  //这两个函数都可以控制360/180这两种舵机。
  
  /********************这是write()函数的例子***********/
#include <Servo.h> 
  
  Servo servoLeft;
  Servo servoRight;
  int i=0;
  int j=0; 
  void setup() 
  { 
   
    servoLeft.attach(12);//P12是左舵机,P13是右舵机。双轮在前为正
    servoRight.attach(13);
    //servoLeft.write(x);  // 左舵机:x=90舵机不动,x=0舵机全速后退,x=180舵机全速前进
    //servoRight.write(x);  // 右舵机:x=180舵机全速后退,x=90舵机不动,x=0舵机全速前进
  
  } 
  
  void loop() {
    /***************成功了,下文for语句可实现左右舵机同时前进一圈(360°)**************/
      for( i=90 , j=90;i<=180 , j>=0;i += 1 , j -= 1){
      servoLeft.write(i);  // 左舵机前进(90-180)
      servoRight.write(j);  // 右舵机前进(90-0)
      delay(15);
      }
    //如果想前进2圈,就把上文的for语句复制一遍就好了
   
     /*******************90°看起来是一种很优秀的左转啊***************************/
    //servoLeft.write(90);  // 左舵机停
    //servoRight.write(90);  // 右舵机停
    /***************成功了,下文for语句可实现左右舵机同时后退一圈(360°)**************/
      for( i=90 , j=90;i<=180 , j>=0;i += 1 , j -= 1){
      servoLeft.write(j);  // 左舵机后退(90-0)
      servoRight.write(i);  // 右舵机后退(90-180)
      delay(15);
      }
   
      
 
  }

         运行一下不仔细看的话还煞有其事,实际上有两个问题:1、明明write 90 却不能停车,舵机会小幅度颤动(优秀的左转666666.)。2.速度控制实现不了,不能慢一点。

看到这里有的人可能想到了另一种解决方案:延时启动舵机,运动起来就像突突突突的拖拉机,一顿一顿的感觉


                
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值