2016年9月16日 星期五

使用Arduino 來偵測Rotary Encoder

# Arduino
# Rotary Encoder
# Interrutp
# Ext interrupt
# Arduino for Encoder
# Arduino for Rotary
# 兩個剪貼搞定 Rotary Encoder
使用Arduino來偵測Rotary Encoder 在網路的範例很多,但是他們似乎是不太適合我用,他們的方法,當我轉動Encoder會加二,或者會誤動作,讓人誤以爲Encoder不良,或者是漏格現象
針對這個問題我寫了一個即簡單有好用的程式碼在此公開給大家參考,如需要再改建,或者有錯誤,請讓我知道。
這是我們可以買得到的Rotary Encoder 

這個是Rotary Encoder的波形解析圖我的程式是來自於這張圖,在網路衆多圖片中我覺得這一張圖片畫的最好。

Encoder 和Arduino的接法【只是建議】,實際上的應用還是要以你的需要而定。
在硬體方面我的PinA是接在Arduino的外部中斷腳,PinB可以接在一般的Digital pin即可。
在Arduino的 Setup{

pinMode(outputB,INPUT); //設定19爲input
digitalWrite(outputB,HIGH); // 內部pull high 電阻開啓
attachInterrupt(digitalPinToInterrupt(outputA),ENCODER_SUB,FALLING);  
}
 宣告外部中斷。
外部中短的語法www.arduino.cc網站中建議使用
attachInterrupt(digitalPinToInterrupt(outputA),ENCODER_SUB,FALLING);
digitalPinToInterrupt(outputA)這個寫法在我這次的MEGA2560才有辦法啓動外部中斷
這一點要特別注意。

中斷的副程式內容如下:

void ENCODER_SUB(void)
{

if ((f_cw_start ==0)||(f_ccw_start==0))
{
if(digitalRead(outputB)==1)
{
f_cw_start = 1;
attachInterrupt(digitalPinToInterrupt(outputA), ENCODER_SUB,RISING);

} else{
attachInterrupt(digitalPinToInterrupt(outputA), ENCODER_SUB,RISING);
f_ccw_start = 1;
}
}

if ((f_cw_start ==1)||(f_ccw_start==1))
{
if(digitalRead(outputB)==0)
{
attachInterrupt(digitalPinToInterrupt(outputA), ENCODER_SUB,FALLING);
encoder_counter++;
f_cw_start = 0;

}else{
attachInterrupt(digitalPinToInterrupt(outputA), ENCODER_SUB,FALLING);
encoder_counter--;
f_ccw_start = 0;


}

}

}

1 則留言:

大紅龍 提到...

使用剪貼功能完成Arduino對Rotary Encoder 的使用!! 三分鐘會使用Encoder

如何使用終端機軟體收集來自於Arduino的資料

  將治具使用Micro USB cable 連上電腦 開啟終端機軟體 選擇 Serial🡪按下OK File🡪Log…  設定log file要存放位置,建議檔案名稱直接取名為*.CSV 例如:20231224.csv 按下治具Reset按鍵開始收集資料