甲旋转编码器是一种输入装置,其帮助用户与系统进行交互。它看起来更像是一个无线电电位计,但是它输出一系列脉冲,这使其应用变得独一无二。旋转编码器的旋钮时,它会以小步长的形式旋转,这有助于将其用于步进/伺服电机控制,浏览一系列菜单以及增加/减少数字值等等。
在本文中,我们将了解旋转编码器的不同类型及其工作方式。我们还将与Arduino接口,并通过旋转编码器来控制整数值并将其值显示在16 * 2的LCD屏幕上。在本教程的最后,您将对项目使用旋转编码器感到满意。所以我们开始吧…
所需材料
- 旋转编码器(KY-040)
- Arduino UNO
- 16 * 2字母数字LCD
- 电位器10k
- 面包板
- 连接线
旋转编码器如何工作?
旋转编码器是一种机电转换器,意味着它将机械运动转换为电子脉冲。它由一个旋钮组成,旋钮旋转时会逐步移动,并为每个步进产生一系列具有预定宽度的脉冲序列。编码器有很多类型,每个编码器都有自己的工作机制,我们将在以后学习这些类型,但是由于我们在本教程中使用了KY040增量编码器,因此现在让我们仅关注KY040增量编码器。
编码器的内部机械结构如下所示。它基本上由一个圆盘(灰色)组成,在该圆盘的顶部放置有导电垫(铜色)。如下所示,将这些导电垫等距放置。输出销钉固定在此圆盘的顶部,以使旋钮旋转时,导电垫与输出销钉接触。如下图所示,这里有两个输出引脚,即输出A和输出B。
由输出引脚A和输出B产生的输出波形分别以蓝色和绿色显示。当导电垫直接位于引脚下方时,它会变高,从而导通时间;而当导电垫移开时,引脚会变低,从而导致上述波形的关断时间。现在,如果我们计算脉冲数,我们将能够确定编码器已移动了多少步。
现在可能出现的问题是,当一个足以计数旋转旋钮时所采取的步数时,为什么我们需要两个脉冲信号。这是因为我们需要确定旋钮的旋转方向。如果您看一下这两个脉冲,您会发现它们都异相90°。因此,当旋钮顺时针旋转时,输出A将首先变为高电平;当旋钮逆时针旋转时,输出B将首先变为高电平。
旋转编码器的类型
市场上有多种类型的旋转编码器,设计人员可以根据自己的应用选择一种。下面列出了最常见的类型
- 增量编码器
- 绝对编码器
- 磁性编码器
- 光学编码器
- 激光编码器
这些编码器基于输出信号和传感技术进行分类,增量编码器和绝对编码器根据输出信号进行分类,磁,光学和激光编码器根据传感技术进行分类。此处使用的编码器是增量类型的编码器。
KY-040旋转编码器的引脚排列和说明
KY-040增量式旋转编码器的引脚排列如下所示
前两个引脚(接地和Vcc)用于为编码器供电,通常使用+ 5V电源。除了按顺时针和逆时针方向旋转旋钮外,编码器还具有一个开关(低电平有效),可以通过按下内部的旋钮来按下该开关。来自此开关的信号通过引脚3(开关)获得。最后,它具有两个输出引脚,它们产生如上所述的波形。现在让我们学习如何将其与Arduino接口。
Arduino旋转编码器电路图
下图显示了将旋转编码器与Arduino接口的完整电路图
旋转编码器有5个插针,顺序如上标签所示。前两个引脚是Ground和Vcc,它们连接到Arduino的Ground和+ 5V引脚。编码器的开关连接到数字引脚D10,并通过一个1k电阻拉高。两个输出引脚分别连接到D9和D8。
要显示将通过旋转Rotary encoder增大或减小的变量的值,我们需要一个显示模块。此处使用的是通常可用的16 * 2 Alpha数字LCD显示屏。我们已将显示器连接为可在4位模式下运行,并已使用Arduino的+ 5V引脚为其供电。电位器用于调节LCD显示屏的对比度。如果您想了解有关将LCD显示器与Arduino接口的更多信息,请单击链接。完整的电路可以建立在面包板的顶部,所有连接完成后,我的外观如下所示。
为Arduino设计旋转编码器
如果您了解旋转编码器的工作原理,那么对Arduino板进行编程以连接旋转编码器是非常容易和直接的。我们只需读取脉冲数即可确定编码器旋转了多少圈,并首先检查哪个脉冲变高,以找到编码器朝哪个方向旋转。在本教程中,我们将在LCD的第一行显示递增或递减的数字,并在第二行显示编码器的方向。可以在此页面底部找到带有演示视频的完整程序,该程序不需要任何库。现在,让我们将程序分成小块以了解其工作原理。
由于我们使用了LCD显示器,因此我们包含了液晶库,该库在Arduino IDE中是默认存在的。然后我们定义用于将LCD与Arduino连接的引脚。最后,我们在这些引脚上初始化LCD显示。
#包括
接下来,在 设置 功能中,我们在LCD屏幕上显示介绍性消息,然后等待2秒钟,以便用户可以读取该消息。这是为了确保LCD正常工作。
lcd.print(“旋转编码器”); //简介消息行1 lcd.setCursor(0,1); lcd.print(“使用Arduino”); // Intro Message line 2 delay(2000); lcd.clear();
旋转编码器具有三个输出引脚,这将是Arduino的INPUT引脚。这三个引脚分别是开关,输出A和输出B。使用 pinMode 函数将它们声明为Input,如下所示。
// pin模式声明 pinMode(Encoder_OuputA,INPUT); pinMode(Encoder_OuputB,INPUT); pinMode(Encoder_Switch,INPUT);
在 void设置 功能内部,我们读取输出A引脚的状态以检查该引脚的最新状态。然后,我们将使用此信息与新值进行比较,以检查哪个引脚(输出A或输出B)变为高电平。
Previous_Output = digitalRead(Encoder_OuputA); //读取输出A的初始值
最后,在主 循环 函数内部,我们必须将输出A和输出B的值与上一个输出进行比较,以检查哪个先变高。只需将A和B的当前输出值与先前的输出进行比较即可完成,如下所示。
if(digitalRead(Encoder_OuputA)!= Previous_Output) { if(digitalRead(Encoder_OuputB)!= Previous_Output) { Encoder_Count ++; lcd.clear(); lcd.print(Encoder_Count); lcd.setCursor(0,1); lcd.print(“顺时针”); }
在上面的代码中,如果输出B已从前一个输出更改,则执行第二个 if 条件。在这种情况下,编码器变量的值会增加,并且LCD会显示编码器沿 顺时针 方向旋转。类似地,如果该 如果 条件不满足,在随后的 其他 条件,我们递减变量和显示该编码器在旋转 逆时针 方向。相同的代码如下所示。
否则 { Encoder_Count--; lcd.clear(); lcd.print(Encoder_Count); lcd.setCursor(0,1); lcd.print(“ Anti-Clockwise”); } }
最后,在主 循环 结束时,我们必须用当前输出值更新先前的输出值,以便可以使用相同的逻辑重复循环。以下代码执行相同的操作
Previous_Output = digitalRead(Encoder_OuputA);
另一个可选的事情是检查是否按下了编码器上的开关。这可以通过检查旋转编码器上的开关销进行监控。该引脚是低电平有效引脚,表示按下按钮时它将变为低电平。如果未按下,则该引脚保持在高电平,我们还使用了一个上拉电阻来确保未按下开关时保持在高电平,从而避免了浮点条件。
如果(digitalRead(Encoder_Switch)== 0){lcd.clear(); lcd.setCursor(0,1); lcd.print(“按下开关”); }
旋转编码器与Arduino一起工作
硬件和代码准备好后,只需将代码上传到Arduino板并打开Arduino板的电源即可。您可以通过USB电缆为其供电,也可以使用12V适配器。上电后,LCD应该显示介绍性消息,然后变为空白。现在旋转旋转编码器,您应该看到该值根据旋转方向开始递增或递减。第二行将显示编码器是沿顺时针方向还是逆时针方向旋转。下图显示相同
同样,当按下按钮时,第二行将显示按钮被按下。完整的工作可以在下面的视频中找到。这只是一个示例程序,用于将编码器与Arduino连接,并检查其是否按预期工作。到达此处后,您应该可以将编码器用于您的任何项目并相应地编程。
希望您已经了解了本教程,并按预期工作了。如果您有任何问题,请在评论部分或论坛中寻求技术帮助。