旋轉編碼器是一種輸入設備,可幫助用戶與系統進行交互。它看起來更像是一個無線電電位計,但它輸出一系列脈沖,這使得它的應用獨一無二。當編碼器的旋鈕旋轉時,它以小步長的形式旋轉,這有助于它用于步進/伺服電機控制,瀏覽一系列菜單以及增加/減少數字的值等等。
在本文中,我們將了解不同類型的旋轉編碼器及其工作原理。我們還將它與 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");
}
}
-
lcd
+關注
關注
34文章
4438瀏覽量
168376 -
旋轉編碼器
+關注
關注
5文章
159瀏覽量
26024 -
Arduino
+關注
關注
188文章
6477瀏覽量
187815
發布評論請先 登錄
相關推薦
評論