旋转编码器是一种输入设备,可帮助用户与系统进行交互。它看起来更像是一个无线电电位计,但它输出一系列脉冲,这使得它的应用独一无二。当编码器的旋钮旋转时,它以小步长的形式旋转,这有助于它用于步进/伺服电机控制,浏览一系列菜单以及增加/减少数字的值等等。
在本文中,我们将了解不同类型的旋转编码器及其工作原理。我们还将它与 arduino 连接,并通过旋转编码器来控制整数的值,并在 16*2 lcd 屏幕上显示其值。在本教程结束时,您将习惯于为您的项目使用旋转编码器。所以让我们开始吧...
所需材料
旋转编码器 (ky-040)
arduino uno
16*2字母数字液晶显示器
电位器 10k
面包板
连接线
旋转编码器如何工作?
旋转编码器是一种机电换能器,这意味着它将机械运动转换为电子脉冲。它由一个旋钮组成,当旋转时,旋钮将逐步移动,并为每个步骤产生一系列具有预定义宽度的脉冲序列。有许多类型的编码器,每种都有自己的工作机制,我们稍后将了解这些类型,但现在让我们只关注ky040 增量编码器,因为我们在教程中使用它。
编码器的内部机械结构如下所示。它基本上由一个圆形圆盘(灰色)组成,导电垫(铜色)放置在该圆形圆盘的顶部。这些导电垫放置在相等的距离上,如下所示。输出引脚固定在这个圆形圆盘的顶部,这样当旋钮旋转时,导电垫与输出引脚接触。这里有两个输出引脚,输出a和输出b,如下图所示。
输出引脚a和输出b产生的输出波形分别以蓝色和绿色显示。当导电焊盘直接位于引脚下方时,它会变高,从而按时导通,当导电焊盘移开时,引脚变低,导致上面所示波形的关断时间。现在,如果我们计算脉冲数,我们将能够确定编码器移动了多少步。
现在可能会出现一个问题,为什么我们需要两个脉冲信号,而一个脉冲信号足以计算旋转旋钮时采取的步数。这是因为我们需要确定旋钮的旋转方向。如果你看一下这两个脉冲,你会发现它们都是90°的异相。因此,当旋钮顺时针旋转时,输出 a 将首先变高,当旋钮逆时针旋转时,输出 b 将首先变高。
旋转编码器的类型
市场上有许多类型的旋转编码器,设计人员可以根据自己的应用选择一种。下面列出了最常见的类型
增量编码器
绝对值编码器
磁编码器
光学编码器
激光编码器
这些编码器根据输出信号和传感技术进行分类,增量编码器和绝对编码器根据输出信号进行分类,磁性、光学和激光编码器根据传感技术进行分类。此处使用的编码器是增量类型编码器。
ky-040 旋转编码器引脚排列和说明
ky-040增量式旋转编码器的引脚排列如下所示
前两个引脚(接地和vcc)用于为编码器供电,通常使用+5v电源。除了顺时针和逆时针方向旋转旋钮外,编码器还有一个开关(低电平有效),可以通过按下内部旋钮来按下。来自该开关的信号通过引脚 3(开关)获得。最后,它具有两个输出引脚,可产生如上所述的波形。现在让我们学习如何将其与arduino接口。
arduino 旋转编码器电路图
旋转编码器与arduino接口的完整电路图如下图所示
旋转编码器有 5 个引脚,顺序如上标签所示。前两个引脚是接地和vcc,连接到arduino的接地和+5v引脚。编码器的开关连接到数字引脚d10,并通过一个1k电阻被拉高。两个输出引脚分别连接到d9和d8。
为了显示通过旋转编码器增加或减少的变量值,我们需要一个显示模块。这里使用的是一种常见的16 * 2字母数字lcd显示器。我们已经连接了显示器以4位模式运行,并使用arduino的+5v引脚为其供电。电位计用于调整lcd显示屏的对比度。如果您想了解有关使用arduino接口lcd显示器的更多信息,请点击链接。完整的电路可以建在面包板的顶部,一旦所有连接完成,我的下面看起来像这样。
为旋转编码器编程 arduino
如果您了解旋转编码器的工作原理,那么对arduino板进行编程以将旋转编码器与其连接是相当容易和直接的。我们只需要读取脉冲数来确定编码器转了多少圈,并检查哪个脉冲先变高,以找到编码器旋转的方向。在本教程中,我们将在lcd的第一行显示递增或递减的数字,在第二行显示编码器的方向。用于执行相同操作的完整程序可以在此页面底部找到演示视频,它不需要任何库。现在,让我们将程序分成小块以了解工作原理。
由于我们使用了lcd显示器,因此我们包含了默认情况下存在于arduino ide中的液晶库。然后我们定义用于将lcd与arduino连接的引脚。最后,我们初始化这些引脚上的lcd显示。
#include //default arduino lcd library is included
const int rs = 7, en = 6, d4 = 5, d5 = 4, d6 = 3, d7 = 2; //mention the pin number for lcd connection
liquidcrystal lcd(rs, en, d4, d5, d6, d7);
lcd.begin(16, 2); //initialise 16*2 lcd
接下来在设置功能中,我们在lcd屏幕上显示一条介绍性消息,然后等待2秒钟,以便该消息可供用户阅读。这是为了确保液晶屏工作正常。
lcd.print( rotary encoder ); //intro message line 1
lcd.setcursor(0, 1);
lcd.print( with arduino ); //intro message line 2
delay(2000);
lcd.clear();
旋转编码器有三个输出引脚,它们将成为arduino的输入引脚。这三个引脚分别是开关、输出 a 和输出 b。这些使用pinmode函数声明为输入,如下所示。
//pin mode declaration
pinmode (encoder_ouputa, input);
pinmode (encoder_ouputb, input);
pinmode (encoder_switch, input);
在 void 设置功能中,我们读取输出 a 引脚的状态以检查引脚的最后状态。然后,我们将使用此信息与新值进行比较,以检查哪个引脚(输出 a 或输出 b)已变高。
previous_output = digitalread(encoder_ouputa); //read the inital value of output 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(clockwise);
}
在上面的代码中,如果输出 b 与上一个输出相比发生了变化,则执行第二个 if 条件。在这种情况下,编码器变量的值递增,lcd显示编码器按顺时针方向旋转。类似地,如果条件失败,在随后的 else 条件中,我们递减变量并显示编码器沿逆时针方向旋转。相同的代码如下所示。
else
{
encoder_count--;
lcd.clear();
lcd.print(encoder_count);
lcd.setcursor(0, 1);
lcd.print(anti - clockwise);
}
}
最后,在主循环结束时,我们必须使用当前输出值更新以前的输出值,以便可以使用相同的逻辑重复循环。以下代码执行相同的操作
previous_output = digitalread(encoder_ouputa);
另一个可选的事情是检查编码器上的开关是否被按下。这可以通过检查旋转打码机上的开关引脚来监控。此引脚是有效的低引脚,这意味着按下按钮时它将变为低电平。如果不按下引脚保持高电平,我们还使用上拉电阻器来确保在未按下开关时保持高电平,从而避免浮点情况。
if (digitalread(encoder_switch) == 0) { lcd.clear(); lcd.setcursor(0, 1); lcd.print(switch pressed); }
旋转编码器与arduino的工作
硬件和代码准备就绪后,只需将代码上传到arduino板并启动arduino板即可。您可以通过 usb 电缆或使用 12v 适配器为其供电。通电后,液晶屏应显示介绍消息,然后变为空白。现在旋转旋转编码器,您应该会看到值开始根据旋转方向递增或递减。第二行将显示编码器是顺时针还是逆时针旋转。下图显示相同
此外,当按下按钮时,第二行将显示按钮已按下。完整的工作可以在下面的视频中找到。这只是一个示例程序,用于将编码器与arduino连接并检查其是否按预期工作。到达此处后,您应该能够将编码器用于任何项目和相应的程序。
/*
* interfacing rotary encoder with arduino
* power lcd and rotary encoder from the +5v pin of arduino
* lcd rs -> pin 7
* lcd en -> pin 6
* lcd d4 -> pin 5
* lcd d5 -> pin 4
* lcd d6 -> pin 3
* lcd d7 -> pin 2
* encoder switch -> pin 10
* encoder output a -> pin 9
* encoder output b -> pin 8
*/
int encoder_ouputa = 9;
int encoder_ouputb = 8;
int encoder_switch = 10;
int previous_output;
int encoder_count;
#include //default arduino lcd librarey is included
const int rs = 7, en = 6, d4 = 5, d5 = 4, d6 = 3, d7 = 2; //mention the pin number for lcd connection
liquidcrystal lcd(rs, en, d4, d5, d6, d7);
void setup() {
lcd.begin(16, 2); //initialise 16*2 lcd
lcd.print( rotary encoder ); //intro message line 1
lcd.setcursor(0, 1);
lcd.print( with arduino ); //intro message line 2
delay(2000);
lcd.clear();
//pin mode declaration
pinmode (encoder_ouputa, input);
pinmode (encoder_ouputb, input);
pinmode (encoder_switch, input);
previous_output = digitalread(encoder_ouputa); //read the inital value of output a
}
void loop() {
//aval = digitalread(pina);
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(clockwise);
}
else
{
encoder_count--;
lcd.clear();
lcd.print(encoder_count);
lcd.setcursor(0, 1);
lcd.print(anti - clockwise);
}
}
previous_output = digitalread(encoder_ouputa);
if (digitalread(encoder_switch) == 0)
{
lcd.clear();
lcd.setcursor(0, 1);
lcd.print(switch pressed);
}
}
配电箱的作用是什么
雷曼光电董事长畅谈超高清
MF58玻封型热敏电阻
协议是什么?学习协议有哪些注意事项?
条件构造器
旋转编码器如何工作?有哪些类型?
关于反无人机管控部署方案的简单分析
Firefly关于的屏幕模组简介
晶电决定斥资12.7亿元人民币扩建Mini LED产能
Vivado 工具已更新至2020.1.1 v1.30
采用京东方面板的华为mateX2难与三星竞争?
CES现场:VR大洗牌,VR头显市场成巨头游乐场
浙江大学新专业机器人工程和人工智能了解一下?
使用全彩小间距LED显示屏的好处有哪些
手机操作系统
智能家居舒适生活 靠谱的由利电动拖把是关键
巨浪进军快速成型制造领,研发首台激光金属3D打印机
电动汽车2020年的几个趋势
华为新MatePad爆料:两款新平板,分别采用12.6英寸和10.8英寸屏幕
DS1964S DeepCover安全认证器的介绍