• Arduino从零开始(2)——控制舵机与步进电机


    0.前言

    本文主要介绍通过Arduino控制舵机,步进电机以及循环的使用

    目录

    0.前言

    1.介绍

    2.Arduino控制舵机:

    2.1方法一

    2.2方法二

    3.Arduino控制步进电机


    1.介绍

    对于Arduino控制舵机的方法是通过其输出PWM信号来实现控制的。这里所谓的PWM信号其本质上就是脉冲信号。而对于步进电机的控制,则是通过输出脉冲信号来实现控制的。这两者有怎样的区别,首先要理解什么是PWM信号——是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形。也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比。简而言之,对于角度的控制,舵机的核心是在脉冲的频率上,而步进电机则是在脉冲个数上。

    2.Arduino控制舵机:

    这里总共会介绍两种方法来控制舵机,方法一是简单的使用其自带的库来实现控制。方法二是我们以原理出发,直接通过脉冲来控制舵机。舵机的话就是普通实验用的。

    2.1方法一

    接线图:

    代码 :

    1. #include
    2. Servo myservo;
    3. void setup()
    4. {
    5. myservo.attach(2);//定义PWM输出的引脚
    6. }
    7. void loop()
    8. {
    9. myservo.write(90); //写出输出角度
    10. delay(1000);
    11. myservo.write(0);
    12. delay(1000);
    13. }

     

    效果如下:

     

    说明:

    1.以上代码是最简形式,通过使用Arduino所自带的Servo.h库来实现,效果为转90°延迟1s转回0°。唯一要注意的就是myservo.write中的值直接是角度值,一般的范围就是0~180°,也有360°的舵机可以使用。

    2.对于舵机的控制我们发现该库并没有对速度的控制。就步进电机而言是通过频率来控制速度,而舵机是拿频率来控制角度。故对于速度的控制可以采用微分化来实现,简而言之就是把目标角度分成多段行走,并控制每段的时间来实现。这里分段最小单位可以采取1°,代码如下:

    1. #include
    2. Servo myservo;
    3. void setup()
    4. {
    5. myservo.attach(2);
    6. }
    7. void loop()
    8. {
    9. for(int i=0;i<90;i++){
    10. myservo.write(i);
    11. delay(1);
    12. }
    13. delay(2000);
    14. for(int i=90;i>0;i--){
    15. myservo.write(i);
    16. delay(50);
    17. }
    18. delay(2000);
    19. }

    效果如下:

     对比之前,我们就能发现,由0到90°是快速,在由90到0°就变成慢速了。

    3.说明2中出现了for循环,for语句用于重复执行被花括号包围的语句块。一个增量计数器通常被用来递增和终止循环。for语句对于任何需要重复的操作是非常有用的。常常用于与数组联合使用以收集数据/引脚。for循环的头部有三个部分:

    for (初始化部分; 条件判断部分; 数据递增部分) {
    //语句块
    。。。
    }
    初始化部分被第一个执行,且只执行一次。每次通过这个循环,条件判断部分将被测试;如果为真,语句块和数据递增部分就会被执行,然后条件判断部分就会被再次测试,当条件测试为假时,结束循环。

    2.2方法二

    回归到PWM的定义上,是通过调节占空比的变化来调节角度。也就是其控制需要Arduino产生一定量的脉冲信号,以0.5ms到2.5ms的高电平来控制舵机的角度。对于180°的舵机而言,其对应关系如下:

    0.5ms=500us-------------0度
    1.0ms=1000us------------45度
    1.5ms=1500us------------90度
    2.0ms=2000us-----------135度
    2.5ms=2500us-----------180度

    因此我们可以通过for循环函数,控制普通数字引脚端口高低电平的变化,直接实现控制舵机。

    接线图与方法1一样,代码如下:

    1. void setup()
    2. {
    3. pinMode(2,OUTPUT);
    4. for(int i=0;i<=80;i++){
    5. digitalWrite(2,HIGH);
    6. delayMicroseconds(2500);//旋转180度
    7. digitalWrite(2,LOW);
    8. delay(100);
    9. }
    10. }
    11. void loop()
    12. {
    13. }

    效果如下:

    说明:

    1.这里for循环次数(脉冲输出的个数)也会直接影响舵机的旋转的角度。当循环次数不够时,角度也会走不到需要的位置,但次数过多到不会影响其最后的角度,次数合适即可。

    2.for循环中的第二个延时dely(100);这里可以直接完成对速度的控制。

    3.Arduino控制步进电机

    以带驱动器的57型步进电机为例:

    驱动器端接线如下:

     备注:这里Arduino采用的是nano,如果是uno也可一样的接。引脚上数字引脚与模拟引脚都无所谓,模拟引脚也能当数字引脚用。

    代码如下:

    1. void setup()
    2. {
    3. pinMode(A1,OUTPUT);
    4. pinMode(A2,OUTPUT);
    5. digitalWrite(A2,HIGH);//设定电机旋转方向
    6. for(int i=0;i<=80;i++){//走80个脉冲
    7. digitalWrite(A1,HIGH);
    8. delayMicroseconds(500);
    9. digitalWrite(A1,LOW);
    10. delayMicroseconds(500);
    11. }
    12. }
    13. void loop()
    14. {
    15. }

    另外关于步进电机的进阶使用,可以参考我另外的文章:

    Arduino 控制多轴步进电机,基于SPI通信

    Arduino 控制多轴步进电机,基于RS485串口通信

     

  • 相关阅读:
    计算机毕业设计:基于html制作大学生网上报到系统响应式模板项目源码
    【Qt】QML与C++的前后端交互与通信方法
    Linux学习-68-日志转储logrotate命令(logrotate配置文件)
    [译] kubernetes:kube-scheduler 调度器代码结构概述
    使用Jenkins进行持续集成与部署
    MySQL——事务和视图
    【毕业设计】基于java+SSH+jsp的酒水销售系统设计与实现(毕业论文+程序源码)——酒水销售系统
    网络运维Day01
    网页的快捷方式打开自动全屏--Chrome、Firefox 浏览器相关设置
    y128.第七章 服务网格与治理-Istio从入门到精通 -- Telemetry V2(十四)
  • 原文地址:https://blog.csdn.net/lylelo/article/details/127867445