这次介绍的是我买的37款传感器套件中的旋转编码器。首先是实物图。
Arduino使用旋转编码器 - gc_2299 - gc_2299的博客
通过查阅资料,旋转编码器既可以左右旋转,又能当成按钮按下。首先测试一下按下的功能,该功能对应的输出引脚是SW。
测试代码如下: 
int Led =4; //定义LED 接口int coderPin = 10; void setup(){  pinMode(Led, OUTPUT);   pinMode(coderPin, INPUT);  digitalWrite(coderPin,HIGH);  Serial.begin(9600);}void loop(){    val = digitalRead(coderPin);   if (val==HIGH)   {    digitalWrite(Led, HIGH);  }  else  {    digitalWrite(Led,LOW );  }}

测试的实物连接图如下,测试的视频在连接图之后:

Arduino使用旋转编码器 - gc_2299 - gc_2299的博客
这里需要注意的是SW引脚默认输出的是HIGH信号,按下后输出LOW信号。setup函数的digitalWrite(coderPin,HIGH);
这句代码很重要,没有加这句之前,从引脚10获得的值经常变化,不开始摸不着头绪,后来看到参考文献2中的介绍,初始化
时需要将coderPin上拉,果然加了这句话之后,从引脚10获得的值就稳定了,没有再擅自变动。
然后是另外两个引脚CLK和DT,通过百度查阅资料时,看到的大部分文章中都附了下面的图形,给出的介绍说是旋转编码
器中A和B两个通道中的信号图,但是我买的旋转编码器上没有标A和B啊!!!只有CLK和DT两个引脚。

只有自己写测试代码看这两个引脚的输出了。测试代码如下:

int Led =4; //定义LED 接口int coderPin = 10; int dtPin=11;int clkPin=12;int val=0;void setup(){  pinMode(Led, OUTPUT);   pinMode(coderPin, INPUT);  digitalWrite(coderPin,HIGH);  pinMode(dtPin, INPUT);  pinMode(clkPin, INPUT);  Serial.begin(9600);}void loop(){    val = digitalRead(coderPin);   Serial.print(val);  val = digitalRead(dtPin); 

  Serial.print(",");  Serial.print(val);

  val = digitalRead(clkPin);   Serial.print(",");  Serial.println(val);}

读出来的数据放到matlab里面做成图,图形如下左上角是DT引脚的输出点图,右上角是CLK引脚的输出点图,左下角是DT引脚和CLK引脚数据和到一起的点图,右下角是DT引脚输出值与CLK引脚输出值的和的图。好像也看不出来什么东西。

Arduino使用旋转编码器 - gc_2299 - gc_2299的博客

通过看DT引脚和CLK引脚的输出值,转动的时候这两个引脚的值在变化,但是如果没有转动,则这两个引脚的值始终为1.所以上图中大部分点都分布在值为1的水平线上。

然后再试参考文献2中使用中断的代码:
//定义引脚连接int CLK = 2;int DT = 11;const int interrupt0 = 0;

void setup(){  pinMode(CLK, INPUT);  pinMode(DT, INPUT);  attachInterrupt(interrupt0, ClockChanged, CHANGE);//设置中断0的处理函数,电平变化触发  Serial.begin(9600);}

void loop(){}

//中断处理函数void ClockChanged(){  int clkValue = digitalRead(CLK);//读取CLK引脚的电平  int dtValue = digitalRead(DT);//读取DT引脚的电平   Serial.print(clkValue);  Serial.print(",");  Serial.println(dtValue);}

这时候只有在转动旋转编码器的时候才会有数据向串口输出,将输出的数据整理为图形如下,下图是顺时针时获取到的数据图形,红色的是CLK引脚的输出值,蓝色的是DT引脚的输出,可以看到这两个引脚的输出大部分时候都是相反的,CLK为0时,对应位置的DT输出大部分为1:

Arduino使用旋转编码器 - gc_2299 - gc_2299的博客

下图是逆时针时获取到的数据图形,红色的是CLK引脚的输出值,蓝色的是DT引脚的输出,可以看到逆时针转动的时候CLK输出为1的时候比顺时针的时候多,DT输出为0的时候也比较密集。

Arduino使用旋转编码器 - gc_2299 - gc_2299的博客

看上述的图形好像也总结不出来什么规律,还得参考别人的文章来看是怎么计数。还得看刚才那个AB通道信号图。CW的时候在A通道从LOW到HIGH时,此时B通道为HIGH,而CCW的时候,如果A通道从LOW到HIGH,B通道为LOW。大部分的文章都是根据这个规律来区分是正转还是反转。这个AB通道应该就是对应的CLK和DT。

通过测试,参考文献4中的代码不是很稳定,在我计算机上测试时POSITION跳动比较大:
Arduino使用旋转编码器 - gc_2299 - gc_2299的博客

参考文献4中的代码的值比较均匀,但是手动转一下就会增加两个值,程序可能还是需要改进。

Arduino使用旋转编码器 - gc_2299 - gc_2299的博客
分析原因,应该是旋转编码器转动一下,就会产生多次中断事件,所以才造成上述代码测试时的值跳动或者多次变动。得去找方法判断是不是转动了。
重新运行本文的第三段代码,查找其中的规律,逆时针时如下图所示,总是以0,1开头,1,0结尾:
Arduino使用旋转编码器 - gc_2299 - gc_2299的博客
顺时针时如下图所示,总是以0,0开头,1,1结尾:
Arduino使用旋转编码器 - gc_2299 - gc_2299的博客
所以规律应该是顺时针时,检测到0,0就可以认为是开始转动,接下来的数据中如果有1,1,则认为正在转动,再下面的数据中如果有0,0就认为上一个转动结束,开始下一个转动。逆时针的规律类似。
根据分析写的最终的程序为:
//定义引脚连接#define CW_START_CLK 0#define CW_START_DT 0#define CW_END_CLK 1#define CW_END_DT 1#define CCW_START_CLK 0#define CCW_START_DT 1#define CCW_END_CLK 1#define CCW_END_DT 0

int CLK = 2;//CLK->D2int DT = 11;//DT->D3int SW = 10;//SW->D4const int interrupt0 = 0;// Interrupt 0 在 pin 2 上int count = 0;//计数值int lastCLK = 0;//CLK历史值

int stage = -1; //两个阶段,0,开始,1,进行

void setup(){  pinMode(SW, INPUT);  digitalWrite(SW, HIGH);  pinMode(CLK, INPUT);  pinMode(DT, INPUT);  attachInterrupt(interrupt0, ClockChanged, CHANGE);//设置中断0的处理函数,电平变化触发  Serial.begin(9600);}

void loop(){  if (!digitalRead(SW) && count != 0) //读取到按钮按下并且计数值不为0时把计数器清零  {    count = 0;    Serial.print("count:");    Serial.println(count);  }}

//中断处理函数void ClockChanged(){  int clkValue = digitalRead(CLK);//读取CLK引脚的电平  int dtValue = digitalRead(DT);//读取DT引脚的电平

  if ((clkValue == CW_START_CLK) && (dtValue == CW_START_DT))  {    if (stage == -1)    {      stage = 0;    }    else if (stage == 1)    {      stage = 0;      count++;      Serial.print("count:");      Serial.println(count);    }  }  else  if ((clkValue == CW_END_CLK) && (dtValue == CW_END_DT))  {    if (stage == 0)    {      stage = 1;    }  }  else if ((clkValue == CW_START_CLK) && (dtValue == CCW_START_DT))  {    if (stage == -1)    {      stage = 0;    }    else if (stage == 1)    {      stage = 0;      count--;      Serial.print("count:");      Serial.println(count);    }  }  else  if ((clkValue == CCW_END_CLK) && (dtValue == CCW_END_DT))  {    if (stage == 0)    {      stage = 1;    }  }}

参考文献
[1] http://www.arduino.cn/forum.php?mod=viewthread&tid=2423&highlight =%E6%97%8B%E8%BD%AC%E7%BC%96%E7%A0%81%E5%99%A8
[2]http://www.cnblogs.com/conexpress/p/4984802.html
[3]http://blog.csdn.net/xuanyuanlei1020/article/details/51725653

[4]http://www.arduino.cn/thread-2423-1-1.html

Arduino使用旋转编码器相关推荐

  1. 【Arduino使用旋转编码器模块】

    Arduino使用旋转编码器模块 前言 旋转编码器模块引脚 旋转编码器模块如何工作? 旋转编码器模块电路图 Arduino旋转编码器模块电路连接图 代码说明 完整代码 前言 旋转编码器是一种机电位置传 ...

  2. 使用Arduino 连接旋转编码器

    文章目录 1. 所需的材料 2. 连接导线旋转编码器是如何工作的? 3. 旋转编码器的类型 4. KY-040旋转编码器引脚和说明 5. Arduino与旋转编码器的连接电路图 6. 编写用于旋转编码 ...

  3. Arduino 使用 旋转编码器

    相关资料链接 点这里 1.1 介绍: 本模块主要由旋转编码器组成,编码器(encoder)是将信号(如比特流)或数据进行编制.转换为可用以通讯.传输和存储的信号形式的设备.编码器把角位移或直线位移转换 ...

  4. 旋转编码器:如何在 Arduino 上使用 Keys KY-040 编码器

    旋转编码器是一种输入设备,您可以在任一方向连续旋转.当您转动设备时,它会生成数字脉冲,以使用两个相控输出信号显示旋转方向.这两个输出还指示单个位置运动,因此您可以在控制面板中使用它们来增加或减少参数. ...

  5. Arduino开发实例-旋转编码器RGB-LED调光

    旋转编码器RGB-LED调光 在本文中,将使用 Arduino 和旋转编码器进行 RGB LED 颜色控制. 我们将旋转旋转编码器来分配值. 红色.绿色和蓝色将合并以显示基于该值的全新颜色. 在这里, ...

  6. 使用Arduino开发板连接ec11旋转编码器

    使用Arduino开发板连接ec11旋转编码器 因为最近要用到旋转编码器,从网上花了好长时间找了好多关于arduino使用旋转编码器的资料,总是找不到合适的,最后总结了一下(部分内容有借鉴,仅作分享, ...

  7. Arduino旋转编码器

    在本教程中,我们将学习旋转编码器如何工作以及如何在Arduino上使用它.您可以观看以下视频或阅读下面的书面教程. 旋转编码器如何工作以及如何与Arduino一起使用 概述 旋转编码器是一种位置传感器 ...

  8. arduino+旋转编码器

    材料清单 arduino nano(其他型号也可以).旋转编码器.arduino下载数据线.杜邦线若干. 主要原理 旋转编码器是一种位置传感器,用于确定旋转轴的角度位置.它根据旋转运动产生模拟或数字电 ...

  9. 初出茅庐的小李第36篇博客之读取旋转编码器正反转状态(arduino uno 测试)

    旋转编码器的引脚 CLK(A相) DATA(B相) SWITCH VCC GND 工作原理 旋转编码器的工作原理以及如何在Arduino中使用 https://www.yiboard.com/thre ...

最新文章

  1. 《CCNP TSHOOT 300-135认证考试指南》——5.4节STP故障检测与排除
  2. PowerBI新功能: 自定义数据连接器(Data Connector)
  3. 5 判断数据是否存在_Trie树实现:100亿URL中判断某个URL是否存在
  4. cdlinux miniwdep 配置无线网卡
  5. OpenCV:Surface Matching 3D
  6. 在密码学研究方面不断创新突破—— 女密码学家的成功密码
  7. Java代码规范之编程规约
  8. wow服务器文件夹,《60级魔兽世界WTFWDB文件夹全解析 by Qcat》
  9. jsp调整字体大小font_html font标签如何设置字体大小?
  10. Ubuntu 20.04桌面文件夹图标消失及文件系统无法打开
  11. 量化交易让股市成为你的印钞机
  12. CSS 绘制太阳系行星运行轨迹
  13. linux一些不要想当然的事(一)之目录权限
  14. 【二维码】新浪开放平台和腾讯开放平台试水
  15. ppt文件提示处于受保护状处理方案
  16. python延时函数 微秒_Python程序可显示当前时,分,秒和微秒
  17. BDE动态连接Oracle数据库
  18. JS逆向——一个新的视频爬虫
  19. 学科网自动下载的开发方法
  20. 【论文阅读】Attention Based Spatial-Temporal GCN...Traffic Flow Forecasting[基于注意力的时空图卷积网络交通流预测](1)

热门文章

  1. renren-fast后端源码参考-配置和对应工具
  2. 了解公司企业:Noto IT Solutions
  3. Python---涂鸦跳跃
  4. 谷歌seo独立站搜索引擎优化指南【2023新版】
  5. 情人节特辑|桌面表白小程序
  6. 高校房产管理系统平台架构分析
  7. 上海移动通信企业短信通平台接口协议
  8. 银行接口开发记录(招商银行,工商银行,建设银行)
  9. 快应用的开发-新手入门指南
  10. 新媒体运营葬送了多少人的前程