【Arduino使用旋转编码器模块】
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 MonitorSerial.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 pressedif (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 4int counter = 0;int currentState;int initState;unsigned long debounceDelay = 0;void setup() {pinMode(CLK, INPUT);pinMode(DT, INPUT);pinMode(SW, INPUT_PULLUP);// Setup Serial MonitorSerial.begin(9600);// Read the initial state of CLKinitState = 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 pressedif (buttonVal == LOW) {if (millis() - debounceDelay > 200) {Serial.println("Button pressed!");}debounceDelay = millis();}}void encoder_value() {// Read the current state of CLKcurrentState = digitalRead(CLK);// If last and current state of CLK are different, then we can be sure that the pulse occurredif (currentState != initState && currentState == 1) {// Encoder is rotating counterclockwise so we decrement the counterif (digitalRead(DT) != currentState) {counter ++;} else {// Encoder is rotating clockwise so we increment the countercounter --;}// print the value in the serial monitor windowSerial.print("Counter: ");Serial.println(counter);}// Remember last CLK state for next cycleinitState = currentState;}總結
以上是生活随笔為你收集整理的【Arduino使用旋转编码器模块】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 动作捕捉在各大领域的应用效果展示
- 下一篇: Kubernetes HPA测试