旋轉(zhuǎn)編碼器是一種輸入設(shè)備,可幫助用戶與系統(tǒng)進(jìn)行交互。它看起來更像是一個(gè)無線電電位計(jì),但它輸出一系列脈沖,這使得它的應(yīng)用獨(dú)一無二。當(dāng)編碼器的旋鈕旋轉(zhuǎn)時(shí),它以小步長的形式旋轉(zhuǎn),這有助于它用于步進(jìn)/伺服電機(jī)控制,瀏覽一系列菜單以及增加/減少數(shù)字的值等等。
在本文中,我們將了解不同類型的旋轉(zhuǎn)編碼器及其工作原理。我們還將它與 Arduino 連接,并通過旋轉(zhuǎn)編碼器來控制整數(shù)的值,并在 16*2 LCD 屏幕上顯示其值。在本教程結(jié)束時(shí),您將習(xí)慣于為您的項(xiàng)目使用旋轉(zhuǎn)編碼器。所以讓我們開始吧...
所需材料
旋轉(zhuǎn)編碼器 (KY-040)
Arduino UNO
16*2字母數(shù)字液晶顯示器
電位器 10k
面包板
連接線
旋轉(zhuǎn)編碼器如何工作?
旋轉(zhuǎn)編碼器是一種機(jī)電換能器,這意味著它將機(jī)械運(yùn)動(dòng)轉(zhuǎn)換為電子脈沖。它由一個(gè)旋鈕組成,當(dāng)旋轉(zhuǎn)時(shí),旋鈕將逐步移動(dòng),并為每個(gè)步驟產(chǎn)生一系列具有預(yù)定義寬度的脈沖序列。有許多類型的編碼器,每種都有自己的工作機(jī)制,我們稍后將了解這些類型,但現(xiàn)在讓我們只關(guān)注KY040 增量編碼器,因?yàn)槲覀冊(cè)诮坛讨惺褂盟?/p>
編碼器的內(nèi)部機(jī)械結(jié)構(gòu)如下所示。它基本上由一個(gè)圓形圓盤(灰色)組成,導(dǎo)電墊(銅色)放置在該圓形圓盤的頂部。這些導(dǎo)電墊放置在相等的距離上,如下所示。輸出引腳固定在這個(gè)圓形圓盤的頂部,這樣當(dāng)旋鈕旋轉(zhuǎn)時(shí),導(dǎo)電墊與輸出引腳接觸。這里有兩個(gè)輸出引腳,輸出A和輸出B,如下圖所示。
輸出引腳A和輸出B產(chǎn)生的輸出波形分別以藍(lán)色和綠色顯示。當(dāng)導(dǎo)電焊盤直接位于引腳下方時(shí),它會(huì)變高,從而按時(shí)導(dǎo)通,當(dāng)導(dǎo)電焊盤移開時(shí),引腳變低,導(dǎo)致上面所示波形的關(guān)斷時(shí)間。現(xiàn)在,如果我們計(jì)算脈沖數(shù),我們將能夠確定編碼器移動(dòng)了多少步。
現(xiàn)在可能會(huì)出現(xiàn)一個(gè)問題,為什么我們需要兩個(gè)脈沖信號(hào),而一個(gè)脈沖信號(hào)足以計(jì)算旋轉(zhuǎn)旋鈕時(shí)采取的步數(shù)。這是因?yàn)槲覀冃枰_定旋鈕的旋轉(zhuǎn)方向。如果你看一下這兩個(gè)脈沖,你會(huì)發(fā)現(xiàn)它們都是90°的異相。因此,當(dāng)旋鈕順時(shí)針旋轉(zhuǎn)時(shí),輸出 A 將首先變高,當(dāng)旋鈕逆時(shí)針旋轉(zhuǎn)時(shí),輸出 B 將首先變高。
旋轉(zhuǎn)編碼器的類型
市場上有許多類型的旋轉(zhuǎn)編碼器,設(shè)計(jì)人員可以根據(jù)自己的應(yīng)用選擇一種。下面列出了最常見的類型
增量編碼器
絕對(duì)值編碼器
磁編碼器
光學(xué)編碼器
激光編碼器
這些編碼器根據(jù)輸出信號(hào)和傳感技術(shù)進(jìn)行分類,增量編碼器和絕對(duì)編碼器根據(jù)輸出信號(hào)進(jìn)行分類,磁性、光學(xué)和激光編碼器根據(jù)傳感技術(shù)進(jìn)行分類。此處使用的編碼器是增量類型編碼器。
KY-040 旋轉(zhuǎn)編碼器引腳排列和說明
KY-040增量式旋轉(zhuǎn)編碼器的引腳排列如下所示
前兩個(gè)引腳(接地和Vcc)用于為編碼器供電,通常使用+5V電源。除了順時(shí)針和逆時(shí)針方向旋轉(zhuǎn)旋鈕外,編碼器還有一個(gè)開關(guān)(低電平有效),可以通過按下內(nèi)部旋鈕來按下。來自該開關(guān)的信號(hào)通過引腳 3(開關(guān))獲得。最后,它具有兩個(gè)輸出引腳,可產(chǎn)生如上所述的波形。現(xiàn)在讓我們學(xué)習(xí)如何將其與Arduino接口。
Arduino 旋轉(zhuǎn)編碼器電路圖
旋轉(zhuǎn)編碼器與Arduino接口的完整電路圖如下圖所示
旋轉(zhuǎn)編碼器有 5 個(gè)引腳,順序如上標(biāo)簽所示。前兩個(gè)引腳是接地和Vcc,連接到Arduino的接地和+5V引腳。編碼器的開關(guān)連接到數(shù)字引腳D10,并通過一個(gè)1k電阻被拉高。兩個(gè)輸出引腳分別連接到D9和D8。
為了顯示通過旋轉(zhuǎn)編碼器增加或減少的變量值,我們需要一個(gè)顯示模塊。這里使用的是一種常見的16 * 2字母數(shù)字LCD顯示器。我們已經(jīng)連接了顯示器以4位模式運(yùn)行,并使用Arduino的+5V引腳為其供電。電位計(jì)用于調(diào)整LCD顯示屏的對(duì)比度。如果您想了解有關(guān)使用Arduino接口LCD顯示器的更多信息,請(qǐng)點(diǎn)擊鏈接。完整的電路可以建在面包板的頂部,一旦所有連接完成,我的下面看起來像這樣。
為旋轉(zhuǎn)編碼器編程 Arduino
如果您了解旋轉(zhuǎn)編碼器的工作原理,那么對(duì)Arduino板進(jìn)行編程以將旋轉(zhuǎn)編碼器與其連接是相當(dāng)容易和直接的。我們只需要讀取脈沖數(shù)來確定編碼器轉(zhuǎn)了多少圈,并檢查哪個(gè)脈沖先變高,以找到編碼器旋轉(zhuǎn)的方向。在本教程中,我們將在LCD的第一行顯示遞增或遞減的數(shù)字,在第二行顯示編碼器的方向。用于執(zhí)行相同操作的完整程序可以在此頁面底部找到演示視頻,它不需要任何庫。現(xiàn)在,讓我們將程序分成小塊以了解工作原理。
由于我們使用了LCD顯示器,因此我們包含了默認(rèn)情況下存在于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
接下來在設(shè)置功能中,我們?cè)贚CD屏幕上顯示一條介紹性消息,然后等待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();
旋轉(zhuǎn)編碼器有三個(gè)輸出引腳,它們將成為Arduino的輸入引腳。這三個(gè)引腳分別是開關(guān)、輸出 A 和輸出 B。這些使用pinMode函數(shù)聲明為輸入,如下所示。
//pin Mode declaration
pinMode (Encoder_OuputA, INPUT);
pinMode (Encoder_OuputB, INPUT);
pinMode (Encoder_Switch, INPUT);
在 void 設(shè)置功能中,我們讀取輸出 A 引腳的狀態(tài)以檢查引腳的最后狀態(tài)。然后,我們將使用此信息與新值進(jìn)行比較,以檢查哪個(gè)引腳(輸出 A 或輸出 B)已變高。
Previous_Output = digitalRead(Encoder_OuputA); //Read the inital value of Output A
最后,在主循環(huán)函數(shù)中,我們必須將輸出 A 和輸出 B 的值與上一個(gè)輸出進(jìn)行比較,以檢查哪個(gè)先變高。這可以通過簡單地將A和B的電流輸出值與先前的輸出進(jìn)行比較來完成,如下所示。
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 與上一個(gè)輸出相比發(fā)生了變化,則執(zhí)行第二個(gè) if 條件。在這種情況下,編碼器變量的值遞增,LCD顯示編碼器按順時(shí)針方向旋轉(zhuǎn)。類似地,如果條件失敗,在隨后的 else 條件中,我們遞減變量并顯示編碼器沿逆時(shí)針方向旋轉(zhuǎn)。相同的代碼如下所示。
else
{
Encoder_Count--;
lcd.clear();
lcd.print(Encoder_Count);
lcd.setCursor(0, 1);
lcd.print("Anti - Clockwise");
}
}
最后,在主循環(huán)結(jié)束時(shí),我們必須使用當(dāng)前輸出值更新以前的輸出值,以便可以使用相同的邏輯重復(fù)循環(huán)。以下代碼執(zhí)行相同的操作
Previous_Output = digitalRead(Encoder_OuputA);
另一個(gè)可選的事情是檢查編碼器上的開關(guān)是否被按下。這可以通過檢查旋轉(zhuǎn)打碼機(jī)上的開關(guān)引腳來監(jiān)控。此引腳是有效的低引腳,這意味著按下按鈕時(shí)它將變?yōu)榈碗娖健H绻话聪乱_保持高電平,我們還使用上拉電阻器來確保在未按下開關(guān)時(shí)保持高電平,從而避免浮點(diǎn)情況。
if (digitalRead(Encoder_Switch) == 0) { lcd.clear(); lcd.setCursor(0, 1); lcd.print("Switch pressed"); }
旋轉(zhuǎn)編碼器與Arduino的工作
硬件和代碼準(zhǔn)備就緒后,只需將代碼上傳到Arduino板并啟動(dòng)Arduino板即可。您可以通過 USB 電纜或使用 12V 適配器為其供電。通電后,液晶屏應(yīng)顯示介紹消息,然后變?yōu)榭瞻住,F(xiàn)在旋轉(zhuǎn)旋轉(zhuǎn)編碼器,您應(yīng)該會(huì)看到值開始根據(jù)旋轉(zhuǎn)方向遞增或遞減。第二行將顯示編碼器是順時(shí)針還是逆時(shí)針旋轉(zhuǎn)。下圖顯示相同
此外,當(dāng)按下按鈕時(shí),第二行將顯示按鈕已按下。完整的工作可以在下面的視頻中找到。這只是一個(gè)示例程序,用于將編碼器與Arduino連接并檢查其是否按預(yù)期工作。到達(dá)此處后,您應(yīng)該能夠?qū)⒕幋a器用于任何項(xiàng)目和相應(yīng)的程序。
/*
* 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");
}
}
-
lcd
+關(guān)注
關(guān)注
34文章
4507瀏覽量
170858 -
旋轉(zhuǎn)編碼器
+關(guān)注
關(guān)注
5文章
160瀏覽量
26262 -
Arduino
+關(guān)注
關(guān)注
189文章
6493瀏覽量
190213
發(fā)布評(píng)論請(qǐng)先 登錄
旋轉(zhuǎn)編碼器的類型區(qū)別與應(yīng)用選擇
旋轉(zhuǎn)編碼器是如何工作的?
旋轉(zhuǎn)編碼器的作用及工作原理
旋轉(zhuǎn)編碼器的原理和特點(diǎn)有哪些
旋轉(zhuǎn)編碼器的類型及其工作原理
了解不同類型的旋轉(zhuǎn)編碼器及其工作原理
旋轉(zhuǎn)式編碼器,旋轉(zhuǎn)式編碼器是什么意思
旋轉(zhuǎn)編碼器測量_旋轉(zhuǎn)編碼器安裝方式

旋轉(zhuǎn)編碼器拆卸方法_旋轉(zhuǎn)編碼器型號(hào)說明
旋轉(zhuǎn)編碼器能直接換嗎_旋轉(zhuǎn)編碼器更換注意事項(xiàng)
旋轉(zhuǎn)編碼器是什么?淺讀旋轉(zhuǎn)編碼器工作原理與特點(diǎn)及應(yīng)用

旋轉(zhuǎn)編碼器能直接換嗎_旋轉(zhuǎn)編碼器更換注意事項(xiàng)

旋轉(zhuǎn)編碼器的常見類型
帶Arduino的旋轉(zhuǎn)編碼器設(shè)計(jì) 旋轉(zhuǎn)編碼器的工作原理和特點(diǎn)

評(píng)論