锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2022-09-16 15:00:00 连接器端子组件连接器地线端子定位结构h连接器端子

Arduino使用旋转编码器模块

    • 前言
    • 旋转编码器模块引脚
    • 如何工作旋转编码器模块?
    • 旋转编码器模块电路图
    • Arduino旋转编码器模块电路连接图
    • 代码说明
    • 完整代码

前言

旋转编码器是一种机电位置传感器,可用于识别旋转轴的角器。这种类型的传感器或模块根据旋转轴的运动和方向产生电信号。编码器由机械部件组成,因此传感器非常坚固,可用于机器人、计算机鼠标等多种应用CNC 机器和打印机。旋转编码器有两种:绝对编码器和增量编码器。

旋转编码器模块引脚

有旋转编码器模块 5 个引脚;分别是 GND、 (VCC)、SW(Switch)、DT 和 CLK。这个传感器模块的所有引脚都是数字的,除了 VCC 和地。旋转编码器模块的引脚排列如下:
在这里插入图片描述

如何工作旋转编码器模块?

如果我们拆下旋转编码器,我们会看到有一个圆盘,上面有很多孔。编码器板连接到公共地线,两个触点如下所示。
当编码器的轴旋转时,输出 A 和输出 B 端子以特定顺序接触公共板,具体顺序取决于旋转方向。如果编码器轮顺时针旋转,输出 A 先连接,然后输出 B 连接到公共板。如果编码器逆时针旋转,则会发生相反的情况,但最终输出 A 和输出 B 产生的信号将始终不同 90*。

在上面的动画中,如果我们顺时针旋转编码器的轴,首先连接针脚A,然后连接针脚B。我们可以通过跟踪先连接哪个针脚来确定旋转方向,因此我们可以根据旋转方向增加或减少a。
若仔细查看旋转编码器模块,PCB 没什么。顶部有旋转编码器和连接插头引脚,底部只有上拉电阻。这构成了我们的整个旋转编码器模块。因为旋转编码器是一种机械设备,所以可以 3.3V 和 5V 工作电压下工作。

旋转编码器模块电路图

该模块由一个非常和可用的组件制成,您只需要三个电阻和编码器本身就可以自行构建。旋转编码器模块的示意图如下。

如上图所示,旋转编码器模块中东西不多,只需三个10K如果要从模块中构建模块,可以自行构建模块。 PCB,则此原理图可以派上用场。

Arduino旋转编码器模块电路连接图

现在我们已经完全理解了旋转编码器模块的工作原理,我们可以连接所有必要的电线 Arduino 编写代码,从传感器中获取所有角位数据。旋转编码器模块和 Arduino 如下所示
连接旋转编码器模块Arduino很简单,我们只需要旋转编码器CLK和DT引脚连接到Arduino外部中断引脚,即Arduino的D2和D3 in,我们需要连接SW引脚连接到 Arduino 的 D4 引脚,我们将引脚配置为中断引脚。这是从旋转编码器到旋转编码器 Arduino 我们现在可以将硬件连接的所有内容转移到代码部分。

代码说明

从旋转编码器读取角度数据Arduino 旋转编码器代码如下所示。代码非常简单易懂。对于此代码,我们将使用中断从旋转编码器获取角度数据。我们使用中断是因为中断错误的可能性很小。

我们开始我们的代码,包括所有必要的库,我们还定义了时钟、数据和按钮引脚 Arduino 引脚。

#include "PinChangeInterrupt.h" #define CLK 2 #define DT 3 #define SW 4 

接下来,我们定义了保持按钮状态和计数器状态所需的所有变量。

int counter = 0; int currentState; int initState; unsigned long bebounceDelay = 0; 

接下来,我们有我们的设置功能。在设置函数中,我们将之前定义的三个引脚设置为输入,并初始化串行监控窗口进行调试。

void setup() { 
           pinMode(CLK, INPUT);   pinMode(DT, INPUT);   pinMode(SW, INPUT_PULLUP);   // Setup Serial Monitor   Serial.span class="token function">begin(9600);

接下来,我们读取编码器CLK 引脚的当前状态并将其存储在initState 变量中。这很重要,如果没有这一步,编码器计数器将无法工作。

 initState = digitalRead(CLK);

最后,在setup函数中,我们声明了中断并将其配置为 CHANGE,以便我们可以捕获来自编码器的任何中断。

  attachInterrupt(0, encoder_value, CHANGE);
  attachInterrupt(1, encoder_value, CHANGE);
  attachPCINT(digitalPinToPCINT(SW), button_press, CHANGE);
}

接下来,我们有我们的循环部分,循环部分将保持为空,因为我们在循环部分内什么都不做。

void loop(){ 
        
}

接下来,我们有我们的button_press()函数,该函数将在中断发生时自动调用。在此函数中,我们读取SW 引脚并检查该引脚是否为低电平。如果它很低,那么我们等待一定的时间来检查按钮是否真的被按下或者它是否是随机噪音。这样我们可以减少按钮的去抖动错误。如果按钮被按下,我们打印按钮被按下!串行监视器窗口上的消息。

void button_press()
{ 
        
  int buttonVal = digitalRead(SW);
  //If we detect LOW signal, button is pressed
  if (buttonVal == LOW) { 
        
    if (millis() - bebounceDelay > 200) { 
        
      Serial.println("Button pressed!");
    }
    debounceDelay = millis();
  }
}

接下来,我们有编码器值函数。在此函数中,我们检查编码器位置及其方向,并根据编码器的旋转增加计数器。如果旋转是顺时针方向,我们增加计数器,如果它是逆时针方向,我们减少计数器。

void encoder_value() { 
        

  currentState = digitalRead(CLK);

  if (currentState != initState  && currentState == 1) { 
        

    if (digitalRead(DT) != currentState) { 
        
      counter ++;
    } else { 
        

      counter --;
    }

    Serial.print("Counter: ");
    Serial.println(counter);
  }

  initState = currentState;
}

这标志着我们代码部分的代码部分的结束,我们可以继续下一部分,了解这个与 Arduino 的基本接口项目。

完整代码

#include "PinChangeInterrupt.h"


#define CLK 2


#define DT 3


#define SW 4


int counter = 0;


int currentState;


int initState;


unsigned long debounceDelay = 0;


void setup() { 
        


  pinMode(CLK, INPUT);


  pinMode(DT, INPUT);


  pinMode(SW, INPUT_PULLUP);


  // Setup Serial Monitor


  Serial.begin(9600);


  // Read the initial state of CLK


  initState = digitalRead(CLK);


  // Call encoder_value() when any high/low changed seen


  // on interrupt 0 (pin 2), or interrupt 1 (pin 3)


  attachInterrupt(0, encoder_value, CHANGE);


  attachInterrupt(1, encoder_value, CHANGE);


  attachPCINT(digitalPinToPCINT(SW), button_press, CHANGE);


}


void loop()


{ 
        


}


void button_press()


{ 
        


  int buttonVal = digitalRead(SW);


  //If we detect LOW signal, button is pressed


  if (buttonVal == LOW) { 
        


    if (millis() - debounceDelay > 200) { 
        


      Serial.println("Button pressed!");


    }


    debounceDelay = millis();


  }


}


void encoder_value() { 
        


  // Read the current state of CLK


  currentState = digitalRead(CLK);


  // If last and current state of CLK are different, then we can be sure that the pulse occurred


  if (currentState != initState  && currentState == 1) { 
        


    // Encoder is rotating counterclockwise so we decrement the counter


    if (digitalRead(DT) != currentState) { 
        


      counter ++;


    } else { 
        


      // Encoder is rotating clockwise so we increment the counter


      counter --;


    }


    // print the value in the serial monitor window


    Serial.print("Counter: ");


    Serial.println(counter);


  }


  // Remember last CLK state for next cycle


  initState = currentState;


}
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章