「雕爺學編程」Arduino動手做(40)——旋轉編碼器模塊


37款傳感器與模塊的提法,在網絡上廣泛流傳,其實Arduino能夠兼容的傳感器模塊肯定是不止37種的。鑒於本人手頭積累了一些傳感器和模塊,依照實踐出真知(一定要動手做)的理念,以學習和交流為目的,這里准備逐一動手試試做實驗,不管成功與否,都會記錄下來---小小的進步或是搞不定的問題,希望能夠拋磚引玉。 

【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形編程+仿真編程)

實驗四十:360度旋轉增量編碼器模塊(KY-040)

 

EC11旋轉編碼器

也叫開關編碼器、旋轉編碼器,EC11系列編碼器有直插編碼器、貼片式編碼器、沉板式編碼器、側插式編碼器,EC11A為直插式編碼器。因廣泛用於車載DVD、車載導航、汽車影音上,也經常被人稱為汽車編碼器。EC11編碼器在各類儀器設備中用於頻率、音量、速度、溫度、電壓、菜單選擇、光線強弱等參數的控制。此款編碼器有做20脈沖20定位點、15脈沖30定位點兩種。調節軸有金屬柄和塑膠柄,軸長區間9-30mm,調節軸有全柄、半柄、螺紋柄等類型供您選擇。EC11系列編碼器主要用於汽車電子、多媒體音響、儀器儀表、家用電器、智能家居、計算機周邊、醫療器械等領域。主要用於頻率調節、亮度調節、溫度調節、音量調節的參數控制等。

技術參數
使用溫度范圍:-30℃ to+80℃
保存溫度范圍: -40℃ to+85℃
額定電壓:DC 5V(最高12V)
全回轉角度:360度(無止檔點)
回轉壽命:30000+200 Cycles
接觸電阻:≤100mΩ
絕緣阻抗:100MΩ 以上
振盪:≤10mS 按壓(開關SW)
壽命:20,000±200次.(0.5行程)
          15,000±200次.(1.5行程)

工作原理
增量式編碼器是將位移轉換成周期性的電信號,再把這個電信號轉變成計數脈沖,用脈沖的個數表明位移的巨細。編碼器是把角位移或直線位移轉換成電信號的一種設備。依照讀出辦法編碼器能夠分為機械式和非機械式兩種:機械式選用電刷輸出,一電刷觸摸導電區或絕緣區來表明代碼的狀況是“1”仍是“0”;非機械式的承受靈敏元件是光敏元件或磁敏元件,選用光敏元件時以透光區和不透光區來表明代碼的狀況是“1”仍是“0”。旋轉增量式編碼器以轉變時輸出脈沖,通過計數設備來曉得其方位,當編碼器不動或停電時,依托計數設備的內部回憶來記住方位。這樣,當停電后,編碼器不能有任何的移動,當來電作業時,編碼器輸出脈沖進程中,也不能有攪擾而丟掉脈沖,否則,計數設備回憶的零點就會偏移,並且這種偏移的量是無從曉得的,只要過錯的出產成果呈現后才曉得。

目前常用的增量式編碼器全部為機械式編碼器,好用且成本低,高端的一般為非機械光電式的。

旋轉編碼器
可通過旋轉可以計數正方向和反方向轉動過程中輸出脈沖的次數,旋轉計數不像電位計,這種轉動計數是沒有限制的。配合旋轉編碼器上的按鍵,可以復位到初始狀態,即從 0 開始計數。增量編碼器是一種將旋轉位移轉換為一連串數字脈沖信號的旋轉式傳感器。這些脈沖用來控制角位移。在 Eltra 編碼器中角位移的轉換采用了光電掃描原理。讀數系統以由交替的透光窗口和不透光窗口構成的徑向分度盤(碼盤)的旋轉為依據,同時被一個紅外光源垂直照射,光把碼盤的圖像投射到接收器表面上。接收器覆蓋着一層衍射光柵,它具有和碼盤相同的窗口寬度。接收器的工作是感受光盤轉動所產生的變化,然后將光變化轉換成相應的電變化。再使低電平信號上升到較高電平,並產生沒有任何干擾的方形脈沖,這就必須用電子電路來處理。讀數系統通常采用差分方式,即將兩個波形一樣但相位差為180°的不同信號進行比較,以便提高輸出信號的質量和穩定性。讀數是再兩個信號的差別基礎上形成的,從而消除了干擾。

光電編碼器
是一種將位移或角度的模擬信號轉換成相應的電脈沖或數字量角度/角速度檢測元件,具有精度高、體積小、工作可靠、接口數字化等優點。光電編碼器一般由透鏡、光柵盤(碼盤)、光敏元件和放大整形電路組成。工作時,光柵盤與電機同速旋轉,同時一個帶有辨向狹縫(或狹縫群)的扇形薄片與圓盤平行放置,當光線通過這兩個做相對運動的光柵盤時,光敏元件接受到的光通量也時大時小地連續變化,經放大整形電路處理后變成脈沖信號。通過測量捕捉到的脈沖數目和頻率即可測出工作軸的轉角和轉速。而電機的當前轉速通過每秒光電編碼器輸出脈沖的個數可以計算出來。

旋轉編碼器模塊 
工作電壓:5V
一圈脈沖數:20
旋轉編碼器可通過旋轉可以計數正方向和反方向轉動過程中輸出脈沖的次數,旋轉計數不像電位計,這種轉動計數是沒有限制的。配合旋轉編碼器上的按鍵,可以復位到初始狀態,即從0開始計數。

 

 

我手頭的旋轉編碼器模塊有5個引腳,分別是VCC, GND, SW, CLK, DT。其中VCC和GND用來接電源和地,按縮寫SW應該是Switch(開關)、CLK是Clock(時鍾)、DT是Data(數據)。兩個引腳那一端為普通的按鍵,也就是圓柄按下去的那個按鍵,當做普通按鍵使用即可。右邊三個引腳中間的為GND,兩邊為兩路脈沖信號CLK和DT。旋轉編碼器的操作是旋轉和按壓轉軸,在按下轉軸的時候SW引腳的電平會變化,旋轉的時候每轉動一步CLK和DT的電平是有規律的變化。

引腳接線
Arduino Uno              旋轉傳感器模塊 
D2                              CLK(Clock 時鍾)
D3                              DT (Data 數據)
D4                              SW   (按鈕開關)   
5V                              +VCC   
GND                           GND  

/*

【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形編程+仿真編程)

實驗四十:360度旋轉增量編碼器模塊(KY-040)



*/

int CLK = 2;

int DT = 3;

int SW = 4;

const int interrupt0 = 0;

int count = 0;

int lastCLK = 0;

void setup()

{

  pinMode(SW, INPUT);

  digitalWrite(SW, HIGH);

  pinMode(CLK, INPUT);

  pinMode(DT, INPUT);

  attachInterrupt(interrupt0, ClockChanged, CHANGE);

  Serial.begin(9600);

}

void loop()

{

  if (!digitalRead(SW) && count != 0)

  {

  count = 0;

  Serial.print("count:");

  Serial.println(count);

  }

}

void ClockChanged()

{

  int clkValue = digitalRead(CLK);

  int dtValue = digitalRead(DT);

  if (lastCLK != clkValue)

  {

  lastCLK = clkValue;

  count += (clkValue != dtValue ? 1 : -1);

  Serial.print("count:");

  Serial.println(count);

  }

}

  

 

模塊電原理圖

/*

【Arduino】168種傳感器模塊系列實驗(資料+代碼+圖形編程+仿真編程)

實驗四十:360度旋轉增量編碼器模塊(KY-040)之二

輸出數字換屏

*/

 

const int clkPin = 2; 

const int dtPin = 3; 

const int swPin = 4 ; 

int encoderVal = 0;

 

void setup()

{

  

  pinMode(clkPin, INPUT);

  pinMode(dtPin, INPUT);

  pinMode(swPin, INPUT);

  digitalWrite(swPin, HIGH);

  Serial.begin(9600); 

}

 

void loop()

{

  int change = getEncoderTurn();

  encoderVal = encoderVal + change;

  if (digitalRead(swPin) == LOW) 

  {

    encoderVal = 0;

  }

  Serial.println(encoderVal);

}

int getEncoderTurn(void)

{

  static int oldA = HIGH; 

  static int oldB = HIGH;

  int result = 0;

  int newA = digitalRead(clkPin);

  int newB = digitalRead(dtPin);

  if (newA != oldA || newB != oldB) 

  {

 

    if (oldA == HIGH && newA == LOW)

    {

      result = (oldB * 2 - 1);

    }

  }

  oldA = newA;

  oldB = newB;

  return result;

  delay(500);

}

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM