【雕爷学编程】Arduino动手做(40)---KY-040旋转编码器模块2
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手试试多做实验,不管成功与否,都会记录下来——小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十:360度旋转编码器模块 KY-040 FOR模块电位器数字脉冲输出电子积木
在中间旋转的圆盘叫编码盘,它随着旋钮一起转动。可以把编码盘看做是导电金属盘,A、B引脚都分别接入单片机的两个GPIO脚,且同时拉高这两个引脚,C引脚就直接接地。当编码盘旋转时,A引脚在编码盘上的触点如果接触到编码盘,则与C引脚在编码盘上的触点接通,因为C引脚是接地的,那么就相当于此时把A引脚接地了,因此连接在A引脚上的GPIO脚则被拉低。B引脚同理。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十:360度旋转编码器模块 KY-040 FOR模块电位器数字脉冲输出电子积木
程序七:简易检测按钮(SW)的变化
Arduino实验开源代码
/* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 程序七:简易检测按钮(SW)的变化 */ int SW = 4; //定义引脚连接 SW->D4 bool lastButtonStatus = false; void setup() { pinMode(SW, INPUT); digitalWrite(SW, HIGH);//连接按钮的引脚设为上拉 Serial.begin(9600); } void loop() { bool buttonStatus = !digitalRead(SW);//高电平时未按下,状态为false if (buttonStatus != lastButtonStatus) { Serial.println(buttonStatus ? "按下SW" : "松开SW"); lastButtonStatus = buttonStatus; //保存当前状态 } delay(100); }
实验串口返回情况
Arduino实验场景图
Arduino实验接线示意图与模块参考电原理图
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十:360度旋转编码器模块 KY-040 FOR模块电位器数字脉冲输出电子积木
程序八:顺时针或者反时针旋转,按下按钮读取CLK和DT的值
Arduino实验开源代码
/* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 程序八:顺时针或者反时针旋转,按下按钮读取CLK和DT的值 */ //定义引脚连接 int CLK = 2;//CLK->D2 int DT = 3;//DT->D3 int SW = 4;//SW->D4 void setup(){ pinMode(SW, INPUT); digitalWrite(SW, HIGH);//连接按钮的引脚设为上拉 pinMode(CLK, INPUT); pinMode(DT, INPUT); Serial.begin(9600); } void loop(){ if (!digitalRead(SW)) //读取到按钮按下时读取CLK和DT的值 { int clkValue = digitalRead(CLK);//读取CLK引脚的电平 int dtValue = digitalRead(DT);//读取DT引脚的电平 Serial.print("CLK:"); Serial.print(clkValue); Serial.print("; DT:"); Serial.println(dtValue); delay(1000); } }
实验串口返回情况
实验发现,不管顺时针还是逆时针旋转,每次按下按钮之后读取的CLK和DT的值都是一样的,并且相邻两步之间的值是不一样的。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验四十:360度旋转编码器模块 KY-040 FOR模块电位器数字脉冲输出电子积木
程序九:通过中断0监控CLK上的电平变化,读取CLK和DT的电平值
Arduino实验开源代码
/* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 程序九:通过中断0监控CLK上的电平变化,读取CLK和DT的电平值 */ //定义引脚连接 int CLK = 2;//CLK->D2 int DT = 3;//DT->D3 const int interrupt0 = 0;// Interrupt 0 在 pin 2 上 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("CLK:"); Serial.print(clkValue); Serial.print("; DT:"); Serial.println(dtValue); delay(300); }
实验串口返回情况
顺时针旋转,CLK和DT的值都是不一样的,且相邻步数的值顺序不同。
逆时针旋转,CLK和DT的值都是一样的,且相邻步数的值不同。
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
程序十:使用旋转编码器模块控制伺服电机SG-90
SG-90 伺服电机是一款低成本、高输出功率的伺服电机。它最多可旋转 180 度,每步最大可旋转 90 度。此外,它足够小,可以轻松融入您的机器人 ARM 或避障机器人项目。最重要的是,它只需要一个输出脉冲信号来控制它的运动。SG90伺服电机的引脚图,它仅由三个引脚组成,例如 PWM、接地和 Vcc 引脚。棕色、橙色和红色线分别是 GND、Vcc 和 PWM 引脚。
Arduino实验接线示意图
Arduino实验开源代码
/* 【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程) 程序十:使用旋转编码器模块控制伺服电机SG-90 */ //使用舵机库 #include <Servo.h> //定义引脚连接 #define CLK 2 #define DT 3 Servo servo; // 创建一个伺服对象 int count = 0; int current_stateCLK; int last_stateCLK; void setup() { pinMode(CLK, INPUT); // 将编码器引脚设置为输入 pinMode(DT, INPUT); // 将编码器引脚设置为输入 Serial.begin(115200);// 初始化串行通信在115200bps //将引脚7上的伺服附加到伺服对象 servo.attach(7); servo.write(count); // 读取inputCLK的初始状态 // 赋值给 previousStateCLK 变量 last_stateCLK = digitalRead(CLK); } void loop() { current_stateCLK = digitalRead(CLK); //读取CLK的当前状态 // 如果CLK 的先前状态和当前状态不同,则发生脉冲 if (current_stateCLK != last_stateCLK && current_stateCLK == 1) { // 如果 inputDT 状态与 inputCLK 状态不同,则 // 编码器逆时针旋转 if (digitalRead(DT) != current_stateCLK) { count --; if (count < 0) count = 0; } else { // 编码器顺时针旋转 count ++; if (count > 179) count = 179; } servo.write(count); // 移动舵机 Serial.print("角度位置: "); Serial.println(count); } last_stateCLK = current_stateCLK; // 用当前状态更新 last_stateCLK }
实验串口返回情况
Arduino实验场景图
实验视频
https://v.youku.com/v_show/id_XNTg0NjU0MDE0OA==
【Arduino】168种传感器模块系列实验(资料代码+仿真编程+图形编程)
实验十一:TM1637四位数码管显示旋转编码器数值
开源仿真编程(Linkboy V4.63)
Arduino实验场景图