Arduino使用旋转编码器
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 ); }}
测试的实物连接图如下,测试的视频在连接图之后:
只有自己写测试代码看这两个引脚的输出了。测试代码如下:
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引脚输出值的和的图。好像也看不出来什么东西。
通过看DT引脚和CLK引脚的输出值,转动的时候这两个引脚的值在变化,但是如果没有转动,则这两个引脚的值始终为1.所以上图中大部分点都分布在值为1的水平线上。
//定义引脚连接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:
下图是逆时针时获取到的数据图形,红色的是CLK引脚的输出值,蓝色的是DT引脚的输出,可以看到逆时针转动的时候CLK输出为1的时候比顺时针的时候多,DT输出为0的时候也比较密集。
看上述的图形好像也总结不出来什么规律,还得参考别人的文章来看是怎么计数。还得看刚才那个AB通道信号图。CW的时候在A通道从LOW到HIGH时,此时B通道为HIGH,而CCW的时候,如果A通道从LOW到HIGH,B通道为LOW。大部分的文章都是根据这个规律来区分是正转还是反转。这个AB通道应该就是对应的CLK和DT。
参考文献4中的代码的值比较均匀,但是手动转一下就会增加两个值,程序可能还是需要改进。
//定义引脚连接#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; } }}
[4]http://www.arduino.cn/thread-2423-1-1.html
Arduino使用旋转编码器相关推荐
- 【Arduino使用旋转编码器模块】
Arduino使用旋转编码器模块 前言 旋转编码器模块引脚 旋转编码器模块如何工作? 旋转编码器模块电路图 Arduino旋转编码器模块电路连接图 代码说明 完整代码 前言 旋转编码器是一种机电位置传 ...
- 使用Arduino 连接旋转编码器
文章目录 1. 所需的材料 2. 连接导线旋转编码器是如何工作的? 3. 旋转编码器的类型 4. KY-040旋转编码器引脚和说明 5. Arduino与旋转编码器的连接电路图 6. 编写用于旋转编码 ...
- Arduino 使用 旋转编码器
相关资料链接 点这里 1.1 介绍: 本模块主要由旋转编码器组成,编码器(encoder)是将信号(如比特流)或数据进行编制.转换为可用以通讯.传输和存储的信号形式的设备.编码器把角位移或直线位移转换 ...
- 旋转编码器:如何在 Arduino 上使用 Keys KY-040 编码器
旋转编码器是一种输入设备,您可以在任一方向连续旋转.当您转动设备时,它会生成数字脉冲,以使用两个相控输出信号显示旋转方向.这两个输出还指示单个位置运动,因此您可以在控制面板中使用它们来增加或减少参数. ...
- Arduino开发实例-旋转编码器RGB-LED调光
旋转编码器RGB-LED调光 在本文中,将使用 Arduino 和旋转编码器进行 RGB LED 颜色控制. 我们将旋转旋转编码器来分配值. 红色.绿色和蓝色将合并以显示基于该值的全新颜色. 在这里, ...
- 使用Arduino开发板连接ec11旋转编码器
使用Arduino开发板连接ec11旋转编码器 因为最近要用到旋转编码器,从网上花了好长时间找了好多关于arduino使用旋转编码器的资料,总是找不到合适的,最后总结了一下(部分内容有借鉴,仅作分享, ...
- Arduino旋转编码器
在本教程中,我们将学习旋转编码器如何工作以及如何在Arduino上使用它.您可以观看以下视频或阅读下面的书面教程. 旋转编码器如何工作以及如何与Arduino一起使用 概述 旋转编码器是一种位置传感器 ...
- arduino+旋转编码器
材料清单 arduino nano(其他型号也可以).旋转编码器.arduino下载数据线.杜邦线若干. 主要原理 旋转编码器是一种位置传感器,用于确定旋转轴的角度位置.它根据旋转运动产生模拟或数字电 ...
- 初出茅庐的小李第36篇博客之读取旋转编码器正反转状态(arduino uno 测试)
旋转编码器的引脚 CLK(A相) DATA(B相) SWITCH VCC GND 工作原理 旋转编码器的工作原理以及如何在Arduino中使用 https://www.yiboard.com/thre ...
最新文章
- 《CCNP TSHOOT 300-135认证考试指南》——5.4节STP故障检测与排除
- PowerBI新功能: 自定义数据连接器(Data Connector)
- 5 判断数据是否存在_Trie树实现:100亿URL中判断某个URL是否存在
- cdlinux miniwdep 配置无线网卡
- OpenCV:Surface Matching 3D
- 在密码学研究方面不断创新突破—— 女密码学家的成功密码
- Java代码规范之编程规约
- wow服务器文件夹,《60级魔兽世界WTFWDB文件夹全解析 by Qcat》
- jsp调整字体大小font_html font标签如何设置字体大小?
- Ubuntu 20.04桌面文件夹图标消失及文件系统无法打开
- 量化交易让股市成为你的印钞机
- CSS 绘制太阳系行星运行轨迹
- linux一些不要想当然的事(一)之目录权限
- 【二维码】新浪开放平台和腾讯开放平台试水
- ppt文件提示处于受保护状处理方案
- python延时函数 微秒_Python程序可显示当前时,分,秒和微秒
- BDE动态连接Oracle数据库
- JS逆向——一个新的视频爬虫
- 学科网自动下载的开发方法
- 【论文阅读】Attention Based Spatial-Temporal GCN...Traffic Flow Forecasting[基于注意力的时空图卷积网络交通流预测](1)