Arduino | 旋轉編碼器模組使用(1)


Arduino | 旋轉編碼器模組使用(1)

關鍵字:arduino旋轉編碼器使用、arduino旋轉編碼器模組
繼上一篇<Arduino | 旋轉編碼器模組使用(0)---問題分析>後,這一篇將介紹旋轉編碼器模組的使用心得與筆記。
如果只是需要測試程式碼,請直接往下拉,或是到黑修斯的GitHub取用。

腳位說明

腳位說明
CLK相當於A相
DT相當於B相
SW編碼器按鈕腳位(編碼器上有開關的功能,可以按壓)
+正電源
GND接地

腳位觸發變化

通電後,CLK、DT、SW都是高電位(HIGH),當觸發時會變低電位(LOW),而SW(按鈕)被按下時變為低電位(LOW)。

程式接腳

腳位
連接Arduino開發板腳位
CLK<--->Arduino Pin6
DT<--->Arduino Pin7
SW<--->本程式不使用
+<--->正電源 5V or 3.3V
GND<--->接地

程式碼


/* 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 留言