• ArduinoUNO实战-第二十一章-通过调整电位器来改变9克舵机的角度


    一、参考

    二、目标

    通过调整电位器来改变舵机旋转的角度

    有些电脑的USB的驱动能力不足,不能驱动起来舵机,请使用DC9V的电源适配器给arduino供电

    三、理论学习

    舵机是一种位置「角度」伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。目前在高档遥控玩具、航模、机器人中已经得到普遍使用。舵机是一种俗称,其实是一种伺服马达。本篇通过官方驱动库来实现舵机控制。

    • 标配9g舵机引脚,黄色为信号线,红色为电源,棕色为地线
    • 舵机是一种位置伺服的驱动器,具有闭环控制系统的机电结构,由小型直流电机、变速齿轮组、可调电位器、控制板等部件组成由于可以方便地控制舵机旋转的角度(舵角,但是舵角一般不超过180°),因此舵机在要求角度不断变化的控制系统中得到了广泛的应用
    • 舵机在工作中,控制器发出脉冲宽度调制(PWM)信号给舵机,获得只留偏置电压。舵机内部有一个基准电路,产生周期是20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出到电机驱动芯片,驱动芯片根据电压差的正负控制电机的正反转。
    • 小型舵机的工作电压一般为4.8V或6V,转速不是很快,如果加入更改角度控制脉宽太快时,舵机可能反应不过来。

    结构组成

    舵机实际上是一种位置伺服的驱动器,主要是由外壳、电路板、无核心马达、齿轮与位置检测器所构成。

    工作原理

    舵机内部有一个基准电路,产生周期为20ms、宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。经过电路板IC方向判断,再驱动无核心马达开始转动,透过减速齿轮将动力传至摆臂,同时由位置检测器送回信号,判断是否已经到位。

    舵机转动的角度是通过调节PWM「脉冲宽度调制」信号的占空比来实现的。标准的PWM信号的周期固定为20ms,理论上脉宽分布应该在1ms到2ms之间,实际上可由0.5ms到2.5ms之间,脉宽与转角0°—180°相对应。不同厂家不同型号的舵机也会有所差异。

    外部接线

    舵机一般都外接三根线,分别用棕、红、橙三种颜色进行区分,由于品牌不同,颜色也会有所差异,棕色为接地线,红色为电源正极线,橙色为信号线。

    由于Arduino的驱动能力有限,当需要控制多个舵机时,需要外接电源以及使用专用的舵机控制板。
    在这里插入图片描述

    库函数

    用Arduino控制舵机一般有两种方法:

    • 通过Arduino的普通数字引脚产生占空比不同的方波,模拟产生PWM信号进行舵机控制。
    • 直接利用Arduino自带的Servo库进行控制。

    Servo库常用函数:

    • Attach(接口)—设定舵机接口。
    • Write(角度)—用于设定舵机旋转的角度,可设定范围0°—180°。
    • Read()—用于读取舵机角度的语句,可理解为读取最后一条write()命令中的值。

    四、接线图

    在这里插入图片描述
    在这里插入图片描述
    旋转电位器,舵机跟着旋转

    五、代码

    /*
    #include 
    
    #define PWM_pin 9
    
    int pulsewidth = 0;\
    void setup()
    {
      pinMode(PWM_pin,OUTPUT);
    }
    
    void loop() 
    {
      // 旋转到90°
      pulse(90);
    }
    
    void pulse(int angle)
    {
      pulsewidth=int ((angle*11)+500);
      digitalWrite(PWM_pin,HIGH);
      delayMicroseconds(pulsewidth);
      digitalWrite(PWM_pin,LOW);
      delay(20-pulsewidth/1000);
    }
    */
    
    #include    //引入lib
    Servo myservo;       //创建一个伺服电机对象
    #define potpin A5    //设定连接可变电阻的模拟引脚
    int val;             //创建变,储存从模拟端口读取的(0到102)
    void setup()
    {
      myservo.attach(9);  //9号引脚输出电机控制信号  注:仅能使用9、10号引脚
     }
     void loop()
     {
       val = analogRead(potpin);
       //读取来自可变电阻的模拟值(0到1023之间)
       val = map(val,0,1023,0,179);  //利用"map"函数缩放该,得到伺服电机需要的角度(0到180之间)
       myservo.write(val);         //设置伺服电机的位置
       delay(15);              //等待电机旋转到目标角度
      }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    舵机在0°和180°间不断转动效果

    在这里插入图片描述

  • 相关阅读:
    第 2 章 线性表 ( 具有实用意义的线性链表(带头结点)实现)
    Java基础之-OOP面向对象
    MongoDB第一话 -- Docker安装MongoDB以及Springboot集成MongoDB
    深度学习参数初始化(一)Xavier初始化 含代码
    C语言之指针、结构体、动态内存分配
    MyBatis入门
    【2023秋招面经】经纬恒润前端面经总结
    记一次kafka消息积压的排查
    【编码魔法师系列_构建型1.1】简单工厂模式(Static Factory)
    图文并茂,Github 首发的这份阿里并发笔记(全彩),700 页称神
  • 原文地址:https://blog.csdn.net/Blueeyedboy521/article/details/127460250