【雕爷学编程】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引脚同理。
旋转旋钮时,是安装下图所示原理来采样出A、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实验场景图

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41659040/article/details/131821703