zoukankan      html  css  js  c++  java
  • 「雕爷学编程」Arduino动手做(40)——旋转编码器模块

    37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试做实验,不管成功与否,都会记录下来---小小的进步或是搞不定的问题,希望能够抛砖引玉。 

    【Arduino】168种传感器模块系列实验(资料+代码+图形编程+仿真编程)

    实验四十:360度旋转增量编码器模块(KY-040)

    EC11旋转编码器

    也叫开关编码器、旋转编码器,EC11系列编码器有直插编码器、贴片式编码器、沉板式编码器、侧插式编码器,EC11A为直插式编码器。因广泛用于车载DVD、车载导航、汽车影音上,也经常被人称为汽车编码器。EC11编码器在各类仪器设备中用于频率、音量、速度、温度、电压、菜单选择、光线强弱等参数的控制。此款编码器有做20脉冲20定位点、15脉冲30定位点两种。调节轴有金属柄和塑胶柄,轴长区间9-30mm,调节轴有全柄、半柄、螺纹柄等类型供您选择。EC11系列编码器主要用于汽车电子、多媒体音响、仪器仪表、家用电器、智能家居、计算机周边、医疗器械等领域。主要用于频率调节、亮度调节、温度调节、音量调节的参数控制等。

    技术参数
    使用温度范围:-30℃ to+80℃
    保存温度范围: -40℃ to+85℃
    额定电压:DC 5V(最高12V)
    全回转角度:360度(无止档点)
    回转寿命:30000+200 Cycles
    接触电阻:≤100mΩ
    绝缘阻抗:100MΩ 以上
    振荡:≤10mS 按压(开关SW)
    寿命:20,000±200次.(0.5行程)
              15,000±200次.(1.5行程)

    工作原理
    增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表明位移的巨细。编码器是把角位移或直线位移转换成电信号的一种设备。依照读出办法编码器能够分为机械式和非机械式两种:机械式选用电刷输出,一电刷触摸导电区或绝缘区来表明代码的状况是“1”仍是“0”;非机械式的承受灵敏元件是光敏元件或磁敏元件,选用光敏元件时以透光区和不透光区来表明代码的状况是“1”仍是“0”。旋转增量式编码器以转变时输出脉冲,通过计数设备来晓得其方位,当编码器不动或停电时,依托计数设备的内部回忆来记住方位。这样,当停电后,编码器不能有任何的移动,当来电作业时,编码器输出脉冲进程中,也不能有搅扰而丢掉脉冲,否则,计数设备回忆的零点就会偏移,并且这种偏移的量是无从晓得的,只要过错的出产成果呈现后才晓得。

    目前常用的增量式编码器全部为机械式编码器,好用且成本低,高端的一般为非机械光电式的。

    旋转编码器
    可通过旋转可以计数正方向和反方向转动过程中输出脉冲的次数,旋转计数不像电位计,这种转动计数是没有限制的。配合旋转编码器上的按键,可以复位到初始状态,即从 0 开始计数。增量编码器是一种将旋转位移转换为一连串数字脉冲信号的旋转式传感器。这些脉冲用来控制角位移。在 Eltra 编码器中角位移的转换采用了光电扫描原理。读数系统以由交替的透光窗口和不透光窗口构成的径向分度盘(码盘)的旋转为依据,同时被一个红外光源垂直照射,光把码盘的图像投射到接收器表面上。接收器覆盖着一层衍射光栅,它具有和码盘相同的窗口宽度。接收器的工作是感受光盘转动所产生的变化,然后将光变化转换成相应的电变化。再使低电平信号上升到较高电平,并产生没有任何干扰的方形脉冲,这就必须用电子电路来处理。读数系统通常采用差分方式,即将两个波形一样但相位差为180°的不同信号进行比较,以便提高输出信号的质量和稳定性。读数是再两个信号的差别基础上形成的,从而消除了干扰。

    光电编码器
    是一种将位移或角度的模拟信号转换成相应的电脉冲或数字量角度/角速度检测元件,具有精度高、体积小、工作可靠、接口数字化等优点。光电编码器一般由透镜、光栅盘(码盘)、光敏元件和放大整形电路组成。工作时,光栅盘与电机同速旋转,同时一个带有辨向狭缝(或狭缝群)的扇形薄片与圆盘平行放置,当光线通过这两个做相对运动的光栅盘时,光敏元件接受到的光通量也时大时小地连续变化,经放大整形电路处理后变成脉冲信号。通过测量捕捉到的脉冲数目和频率即可测出工作轴的转角和转速。而电机的当前转速通过每秒光电编码器输出脉冲的个数可以计算出来。

    旋转编码器模块 
    工作电压:5V
    一圈脉冲数:20
    旋转编码器可通过旋转可以计数正方向和反方向转动过程中输出脉冲的次数,旋转计数不像电位计,这种转动计数是没有限制的。配合旋转编码器上的按键,可以复位到初始状态,即从0开始计数。

    我手头的旋转编码器模块有5个引脚,分别是VCC, GND, SW, CLK, DT。其中VCC和GND用来接电源和地,按缩写SW应该是Switch(开关)、CLK是Clock(时钟)、DT是Data(数据)。两个引脚那一端为普通的按键,也就是圆柄按下去的那个按键,当做普通按键使用即可。右边三个引脚中间的为GND,两边为两路脉冲信号CLK和DT。旋转编码器的操作是旋转和按压转轴,在按下转轴的时候SW引脚的电平会变化,旋转的时候每转动一步CLK和DT的电平是有规律的变化。

    引脚接线
    Arduino Uno              旋转传感器模块 
    D2                              CLK(Clock 时钟)
    D3                              DT (Data 数据)
    D4                              SW   (按钮开关)   
    5V                              +VCC   
    GND                           GND  

    /*
    
    【Arduino】168种传感器模块系列实验(资料+代码+图形编程+仿真编程)
    
    实验四十:360度旋转增量编码器模块(KY-040)
    
    
    
    */
    
    int CLK = 2;
    
    int DT = 3;
    
    int SW = 4;
    
    const int interrupt0 = 0;
    
    int count = 0;
    
    int lastCLK = 0;
    
    void setup()
    
    {
    
      pinMode(SW, INPUT);
    
      digitalWrite(SW, HIGH);
    
      pinMode(CLK, INPUT);
    
      pinMode(DT, INPUT);
    
      attachInterrupt(interrupt0, ClockChanged, CHANGE);
    
      Serial.begin(9600);
    
    }
    
    void loop()
    
    {
    
      if (!digitalRead(SW) && count != 0)
    
      {
    
      count = 0;
    
      Serial.print("count:");
    
      Serial.println(count);
    
      }
    
    }
    
    void ClockChanged()
    
    {
    
      int clkValue = digitalRead(CLK);
    
      int dtValue = digitalRead(DT);
    
      if (lastCLK != clkValue)
    
      {
    
      lastCLK = clkValue;
    
      count += (clkValue != dtValue ? 1 : -1);
    
      Serial.print("count:");
    
      Serial.println(count);
    
      }
    
    }
    

      

    模块电原理图

    /*
    
    【Arduino】168种传感器模块系列实验(资料+代码+图形编程+仿真编程)
    
    实验四十:360度旋转增量编码器模块(KY-040)之二
    
    输出数字换屏
    
    */
    
     
    
    const int clkPin = 2; 
    
    const int dtPin = 3; 
    
    const int swPin = 4 ; 
    
    int encoderVal = 0;
    
     
    
    void setup()
    
    {
    
      
    
      pinMode(clkPin, INPUT);
    
      pinMode(dtPin, INPUT);
    
      pinMode(swPin, INPUT);
    
      digitalWrite(swPin, HIGH);
    
      Serial.begin(9600); 
    
    }
    
     
    
    void loop()
    
    {
    
      int change = getEncoderTurn();
    
      encoderVal = encoderVal + change;
    
      if (digitalRead(swPin) == LOW) 
    
      {
    
        encoderVal = 0;
    
      }
    
      Serial.println(encoderVal);
    
    }
    
    int getEncoderTurn(void)
    
    {
    
      static int oldA = HIGH; 
    
      static int oldB = HIGH;
    
      int result = 0;
    
      int newA = digitalRead(clkPin);
    
      int newB = digitalRead(dtPin);
    
      if (newA != oldA || newB != oldB) 
    
      {
    
     
    
        if (oldA == HIGH && newA == LOW)
    
        {
    
          result = (oldB * 2 - 1);
    
        }
    
      }
    
      oldA = newA;
    
      oldB = newB;
    
      return result;
    
      delay(500);
    
    }
    

      

  • 相关阅读:
    python瓦登尔湖词频统计
    css规范思维导图(仅限于自己)
    html规范思维导图(仅限于自己)
    vue-cli配置跨域代理
    vue中的scoped分析以及在element-UI和vux中的应用
    yarn和npm的对比,以及项目中使用方式
    Promise对异步编程的贡献以及基本API了解
    跨域限制原因及常见跨域方法
    js中的逗号运算符
    JS中的浅拷贝与深拷贝
  • 原文地址:https://www.cnblogs.com/eagler8/p/11641051.html
Copyright © 2011-2022 走看看