EC11旋转编码器
旋转编码器是一种将旋转位移转换为一连串数字脉冲信号的旋转式传感器。这些脉冲用来控制角位移。读数系统通常采用差分方式,即将两个波形一样但相位差为180°的不同信号进行比较,以便提高输出信号的质量和稳定性。读数是在两个信号的差别基础上形成的,从而消除了干扰。
模块来源
规格参数
工作电压:5V 工作电流:1MA 模块尺寸:18 x 25 mm 旋转角度: 360度 通信协议:相位差 管脚数量:5 Pin(2.54mm间距排针)
硬件连接
旋转编码器有三个或者更多引脚。对于最基本的类型,有三个主要引脚:A(CLK,时钟)、B(DT,数据)以及GND(地)。另外两个引脚(如果有的话)通常是+(VCC)和SW(按钮开关)。
- GND 接 Arduino 的 GND。
- +(如果有的话)接 Arduino 的 5V。
- A(CLK) 接 Arduino 的一个数字引脚(例如,2号引脚)。
- B(DT) 接 Arduino 的另一个数字引脚(例如,3号引脚)。
- SW(按钮开关,如果使用)接 Arduino 的另一个数字引脚(例如,4号引脚),可能需要额外的上拉或下拉电阻。
使用方法
编写代码
代码主要实现了检测旋转编码器的顺时针旋转和逆时针旋转,以及(如果使用)按钮的按压事件。
c
/******************************************************************************
* 测试硬件:ColorEasyDuino开发板
* 版 本 号: V1.0
* 修改作者: www.lckfb.com
* 修改日期: 2024年04月08日
* 功能介绍:
*****************************************************************************
* 开发板软硬件资料与相关项目软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
******************************************************************************/
// 定义用于旋转编码器的引脚。
const int pinA = 2; // CLK 引脚
const int pinB = 3; // DT 引脚
const int buttonPin = 4; // SW 引脚
volatile int lastEncoded = 0;
volatile long encoderValue = 0;
long lastencoderValue = 0;
int lastMSB = 0;
int lastLSB = 0;
void setup() {
pinMode(pinA, INPUT_PULLUP);
pinMode(pinB, INPUT_PULLUP);
pinMode(buttonPin, INPUT_PULLUP); // 设置按钮作为输入与内部上拉
// 设置中断
attachInterrupt(digitalPinToInterrupt(pinA), updateEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(pinB), updateEncoder, CHANGE);
Serial.begin(9600);
}
void loop() {
// 如果按钮被按下
if(digitalRead(buttonPin) == LOW) {
Serial.println("Button pressed!");
}
if(lastencoderValue != encoderValue) {
Serial.println(encoderValue);
lastencoderValue = encoderValue;
}
}
void updateEncoder() {
int MSB = digitalRead(pinA); //MSB = 高位
int LSB = digitalRead(pinB); //LSB = 低位
int encoded = (MSB << 1) |LSB; //将2个引脚值转换为单个数字
int sum = (lastEncoded << 2) | encoded; //将其添加到之前编码的值中
if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;
lastEncoded = encoded; //保存这个值以备下次使用
}
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
使用验证
先逆时针旋转,再顺时钟旋转,接着按下旋转编码器。