查看: 426|回复: 2

旋转编码器的使用

[复制链接]
  • TA的每日心情
    无聊
    2019-5-24 13:13
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2019-5-13 12:03 | 显示全部楼层 |阅读模式
    旋转编码器是一个精确旋转测定和点击合二为一的器件,用它来控制舵机比用电位器要精确得多,同时使用它也实现菜单的选择和修改设置项的值也比使用多个按键的方式方便很多。

    20190512171830670.jpg

    在网上面很容易就找到这些便宜的器件,直接在TB上搜 旋转编码器 即可。
    我买的旋转编码器模块有5个引脚,分别是GND, VCC(+), SW, DT, CLK。其中VCC和GND用来接电源和地,按缩写SW应该是Switch(开关)、CLK是Clock(时钟)、DT是Data(数据)。这个编码器的详细介绍可以看网上的资料,网上面还有不少的例子介绍这个编码器的使用,但在我看来这些例子都是用来讲述原理的,我还是觉得把这些代码封装成一个类来使用更为简单清晰,以下是我封装好再写的两个例子。

    常规的使用:

    kittenblock中小学创客名师推荐的图形化编程软件

    #include "flexmisc.h"
     
    //---------------------------------------------------------------------------------
    /*
    旋转编码器例子1,常规轮询使用
    TFlexRotaryEncoder re(CLK, DT, SW);分别对应相应旋转编码器所连接的Arduino针脚;
    如不方便在声明时确定对应的参数,也可以在实例化后使用bind来做后绑定。
    编写:flexitime
    2019-5-12
    */
    //---------------------------------------------------------------------------------
     
    TFlexRotaryEncoder re(2, 3, 4);
     
    void reRotateEvent(int direct){
      Serial.print("Position: ");
      Serial.println(re.getCount());
      if (direct == 1){ Serial.println("Turn Right");}
      if (direct == -1){ Serial.println("Turn Left");};
    }
     
    void reButtonClickEvent(){
      Serial.print("Click ");
      Serial.println(re.getCount());  
    }
     
    void setup() {
      Serial.begin (9600);
      //绑定旋转响应事件,不绑定表示不响应该事件。
      re.attachRotateEvent(reRotateEvent);
      //绑定按键响应事件,不绑定表示不响应该事件。
      re.attachButtonClickEvent(reButtonClickEvent);
      //设置当按下按键时将计数器归 0,默认是不归0;
      re.setClickResetCount(true);
    }
     
    void loop() { 
      //检查旋转编码器的状态。
      re.checkState();
    }
    

    以下这个是利用硬件中断,适应高响应要求的:

    kittenblock中小学创客名师推荐的图形化编程软件

    #include "flexmisc.h"
     
    //---------------------------------------------------------------------------------
    /*
    旋转编码器例子2,使用中断方式调用,当系统处于高负载,无法太好响应轮询时使用
    TFlexRotaryEncoder re(CLK, DT, SW);分别对应相应旋转编码器所连接的Arduino针脚;
    如不方便在声明时确定对应的参数,也可以在实例化后使用bind来做后绑定。
    编写:flexitime
    2019-5-12
    */
    //---------------------------------------------------------------------------------
    //旋转编码器的CLK接在Arduino的2脚上,2脚对应的是Arduino中断0
    TFlexRotaryEncoder re(2, 3, 4);
     
    void reRotateEvent(int direct){
      Serial.print("Position: ");
      Serial.println(re.getCount());
      if (direct == 1){ Serial.println("Turn Right");}
      if (direct == -1){ Serial.println("Turn Left");};
    }
     
    void Int0Event(){
      // 注意,在中断调用时无法响应按键事件
      re.checkState();
    }
     
    void setup() {
      Serial.begin (9600);
     
      //绑定旋转响应事件,不绑定表示不响应该事件。
      re.attachRotateEvent(reRotateEvent);
      
      //设置中断0的处理函数,电平变化触发,但此中断无法响应按键事件
      attachInterrupt(0, Int0Event, CHANGE);
      
    }
     
    void loop() { 
      //检测按键事件
      if (re.isClick()){Serial.println("click");};
      
      //假设系统响应很慢~~
      delay(100);
    }
    

    至于 flexmisc.h这个库,我稍晚上传后再补充。


  • TA的每日心情
    开心
    2019-4-4 09:00
  • 签到天数: 5 天

    [LV.2]偶尔看看I

    发表于 2019-5-14 22:54 | 显示全部楼层

    flexmisc.h
    在哪里有啊??
  • TA的每日心情
    无聊
    2019-5-24 13:13
  • 签到天数: 2 天

    [LV.1]初来乍到

     楼主| 发表于 2019-5-23 22:10 | 显示全部楼层
    到的我博客里看看:https://blog.csdn.net/flexitime/article/details/90142596
    您需要登录后才可以回帖 登录 | 立即注册  

    本版积分规则

    热门推荐

    设计了一款智能加湿器,出现了一些控制上的问题
    设计了一款智能加湿器,出
    最近在学习blinker,就想着把手头的加湿器改装成智能加湿器,用了一块WiFiduino、一个
    关于Open Nul问题,
    关于Open Nul问题,
    如图所示,驱动安装的时候,没有出现错误(比如安装过程中没有出现系统找不到指定文件
    Arduino模拟USB键盘
    Arduino模拟USB键盘
    [md] ### 模拟键盘输入信息 本示例将演示使用Arduino Leonardo模拟USB键盘输出信息。
    小白求助
    小白求助
    小白刚接触arduino编程基础较差,发现可以使用图形编程软件,想问一下图片上的是什么
    光敏电阻检测环境光实验
    光敏电阻检测环境光实验
    本文节选自《Arduino程序设计基础》 一些简单的电子元件就可以做传感器使用,例如我
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表