
Arduino | 旋轉編碼器模組使用(1)
關鍵字:arduino旋轉編碼器使用、arduino旋轉編碼器模組繼上一篇<Arduino | 旋轉編碼器模組使用(0)---問題分析>後,這一篇將介紹旋轉編碼器模組的使用心得與筆記。
如果只是需要測試程式碼,請直接往下拉,或是到黑修斯的GitHub取用。
腳位說明
腳位 | 說明 |
CLK | 相當於A相 |
DT | 相當於B相 |
SW | 編碼器按鈕腳位(編碼器上有開關的功能,可以按壓) |
+ | 正電源 |
GND | 接地 |
腳位觸發變化
通電後,CLK、DT、SW都是高電位(HIGH),當觸發時會變低電位(LOW),而SW(按鈕)被按下時變為低電位(LOW)。

解決方案:使用中斷計數,請見下一篇
轉貼本文時,需註明來自黑修斯隨手札記原創作者 hughes chen(黑修斯),及附上原文連結,同時 禁止修改,禁止商業使用 。
程式接腳
腳位 | 連接Arduino開發板腳位 | |
CLK | <---> | Arduino Pin6 |
DT | <---> | Arduino Pin7 |
SW | <---> | 本程式不使用 |
+ | <---> | 正電源 5V or 3.3V |
GND | <---> | 接地 |
程式碼
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* Arduino Rotary Encoder Tutorial | |
* | |
* by Dejan Nedelkovski, www.HowToMechatronics.com | |
* | |
* 中文解釋:黑修斯(陳建仲) | |
* 日期:2018/06/05 | |
* 檔名:encoder_hu01 | |
* 說明:將HowToMechatronics的代碼翻譯解釋。 | |
*/ | |
#define outputA 6 //定義 outputA = 6 | |
#define outputB 7 //定義 outputB = 7 | |
int counter = 0; //定義 counter 為 int 類型變數,且初始值為0 | |
int aState; //定義 aState 為 int 類型變數 | |
int aLastState; //定義 aLastState 為 int 類型變數 | |
//初始化設定↓↓↓ | |
void setup() { | |
pinMode (outputA,INPUT); //埠口模式設定:outputA 設為 輸入 | |
pinMode (outputB,INPUT); //埠口模式設定:outputB 設為 輸入 | |
Serial.begin (9600); //Serial通訊鮑率設為9600 | |
aLastState = digitalRead(outputA); //將初始outputA的讀取值 設給 aLastState | |
} | |
//主程式運作區↓↓↓ | |
void loop() { | |
aState = digitalRead(outputA); //將outputA的讀取值 設給 aState | |
if (aState != aLastState){ //條件判斷,當aState 不等於 aLastState時發生 | |
if (digitalRead(outputB) != aState) { //條件判斷,當outputB讀取值 不等於 aState時發生 | |
counter ++; //計數器+1 | |
} else { | |
counter --; //計數器-1 | |
} | |
Serial.print("Position: "); //透過serial印出字串 Position: | |
Serial.println(counter); //透過serial印出 counter 值 | |
} | |
aLastState = aState; //將aState 最後的值 設給 aLastState | |
} | |
程式流程圖與動作說明
從下圖得知,A相、B相的動作原理(A相為藍色,B相為綠色)。正轉時 ,A跟B訊號為相反。透過上述規則來判斷正反轉。
反轉時,A跟B訊號一樣。
![]() |
圖片來源:howtomechatronics |
如何判斷馬達運轉
要如何判斷馬達運轉呢,透過起始狀態( aState)與最後狀態(aLastState)來做判斷,請見程式流程圖或程式碼說明。![]() |
程式流程圖與程式碼 |
![]() |
程式流程圖 |
轉動編碼器
最後可以試著轉動編碼器,再觀察序列輸出視窗。
最後的問題補充
1.訊號丟失的問題:當轉速過快,快到晶片的讀取速度或程式掃描的速度追不上,就會發生。解決方案:使用中斷計數,請見下一篇
Reference
How Rotary Encoder Works and How To Use It with Arduino轉貼本文時,需註明來自黑修斯隨手札記原創作者 hughes chen(黑修斯),及附上原文連結,同時 禁止修改,禁止商業使用 。
0 留言
不一定能即時回覆問題,有時間會盡量答覆。