Sử Dụng Rotary Encoders Với Arduino

Giới thiệu 

Rotary encoders là thiết bị điện tử có thể đo vòng quay cơ học. Chúng có thể được sử dụng theo hai kiểu - Làm điều khiển hoặc như một thiết bị để đo chuyển động quay của trục.

 
Khi được sử dụng như một bộ điều khiển, rotary encoders có thể linh hoạt hơn nhiều so với một chiết áp. Chúng có thể được sử dụng khi bạn cần điều khiển rất chính xác và chúng không bị trôi do nhiệt độ.
Là một thiết bị để đo lường rotary encoder có một số công dụng. Một trong số đó là đo vòng quay của động cơ bánh răng DC.

Hôm nay chúng ta sẽ xem xét cả hai loại bộ mã hóa quay. Tôi sẽ chỉ cho bạn cách kết nối chúng với Arduino và tôi sẽ cung cấp cho bạn một số bản phác thảo trình diễn mà bạn có thể tự chạy.
Vậy hãy bắt đầu!

Hoạt động của Rotary Encoder

Có một số loại bộ mã hóa quay khác nhau. Tôi đang giới hạn cuộc thảo luận này với các bộ mã hóa “tăng dần” đơn giản hơn. Chúng đôi khi được gọi là bộ mã hóa quay cầu phương hoặc tương đối .
Các bộ mã hóa này có hai cảm biến và xuất ra hai bộ xung. Các cảm biến, có thể là từ tính (hall effect) hoặc ánh sáng (LED hoặc Laser), tạo ra xung khi trục bộ mã hóa được quay.
Vì có hai cảm biến ở hai vị trí khác nhau nên cả hai sẽ tạo ra các xung giống nhau, tuy nhiên, chúng sẽ lệch pha vì một cảm biến sẽ phát xung trước cảm biến kia. Cảm biến nào đi trước được xác định bởi hướng quay.

Trong ví dụ trên, trục encoder đang quay theo chiều kim đồng hồ. Cảm biến trên cùng được kích hoạt trước cảm biến dưới cùng, do đó, nhóm xung trên cùng đứng trước bộ dưới cùng.

Nếu trục encoder được quay ngược chiều kim đồng hồ thì tập hợp xung dưới cùng sẽ được phân phối trước tập hợp trên cùng.

Trong cả hai trường hợp, các xung có thể được đếm để xác định xem trục đã quay bao nhiêu. Bằng cách kiểm tra xem xung nào đến trước, chúng ta có thể xác định hướng quay.

Control encoder

Control encoder mà chúng ta sẽ sử dụng là một thiết bị rất phổ biến và nó có sẵn từ một số nguồn.

Bộ mã hóa có thể được gắn chính xác như một chiết áp và nó có trục D để chấp nhận một núm vặn. Nó cũng có công tắc tiếp xúc tạm thời bằng nút nhấn riêng có thể được kích hoạt bằng cách nhấn xuống trên trục. 

Sơ đồ chân của bộ mã hóa điều khiển như sau:

  • GND - Kết nối mặt đất.
  • + V - VCC hoặc điện áp cung cấp dương, thường là 3,3 hoặc 5V
  • SW - Nút công tắc đầu ra. Khi trục được nhấn xuống, nó sẽ xuống mức thấp.
  • DT - Kết nối đầu ra A.
  • CLK - Kết nối đầu ra B.

Tôi sẽ chỉ cho bạn cách sử dụng bộ control encoder này trong giây lát, nhưng trước tiên, chúng ta hãy xem xét bộ encoder khác mà chúng ta sẽ thảo luận ngày hôm nay.

Motor Encoder

Motor encoder được gắn trên trục của động cơ DC và có thể đếm số lượng trục động cơ đã di chuyển. Cùng với trình điều khiển động cơ, điều này sẽ cho phép bạn tạo cơ chế phản hồi có thể cho phép bạn chỉ định mức độ bạn muốn trục quay.
Bạn cũng có thể sử dụng các bộ mã hóa này như một máy đo tốc độ để đo tốc độ mà trục quay.

Các bộ mã hóa động cơ khác nên có kết nối tương tự.

Các kết nối rất cơ bản:

  • VCC - đầu vào nguồn điện 5V.
  • GND - Kết nối mass
  • CH A - Đầu ra A.
  • CH B - Đầu ra B.

Chúng ta sẽ xem cách sử dụng điều này với Arduino để đo RPM của động cơ rất sớm.

Sơ đồ kết nối

Sơ đồ LCD keypad

Code

#include <LiquidCrystal.h>
#include <stdio.h>
//LCD pin to Arduino
const int pin_RS = 8;
const int pin_EN = 9;
const int pin_d4 = 4;
const int pin_d5 = 5;
const int pin_d6 = 6;
const int pin_d7 = 7;
const int pin_BL = 10;
LiquidCrystal lcd( pin_RS,  pin_EN,  pin_d4,  pin_d5,  pin_d6,  pin_d7);
#define S2 2
#define S1 12
#define SW 11
int counter;
int currentStateCLK;
int lastStateCLK;
String currentDir = "";
char Buff[10];
//unsigned long lastButtonPress = 0;
int idx = 0, page2 = 0;
void setup() {

  // Set encoder pins as inputs
  pinMode(S2, INPUT);
  pinMode(S1, INPUT);
  pinMode(SW, INPUT_PULLUP);

  // Setup Serial Monitor
  Serial.begin(9600);
  lcd.begin(16, 2);
  // Read the initial state of CLK
  lastStateCLK = digitalRead(S2);
}

void loop() {
  counter = get_rotary(idx);
  lcd.setCursor(0, 0);
  lcd.print("count: ");
  sprintf(Buff, "%04d", counter);
  lcd.print(Buff);
}

int get_rotary(int &rotary)
{
  // Read the current state of CLK
  currentStateCLK = digitalRead(S2);

  // If last and current state of CLK are different, then pulse occurred
  // React to only 1 state change to avoid double count
  if (currentStateCLK != lastStateCLK  && currentStateCLK == 1) {

    // If the DT state is different than the CLK state then
    // the encoder is rotating CCW so decrement
    if (digitalRead(S1) != currentStateCLK) {
      rotary ++;
    } else {
      // Encoder is rotating CW so increment
      rotary --;
    }
  }
  // Remember last CLK state
  lastStateCLK = currentStateCLK;
  return rotary;
}

/* https://dronebotworkshop.com/rotary-encoders-arduino/ */

Nhận xét

  1. Merit Casino | Harness your horse racing with an
    Harness your horse racing with an online 메리트 카지노 sportsbook & online casino - 실시간 카지노 사이트 Harness your 코인카지노주소 horse 엠카지노에오신것을환영합니다 racing 용카지노 with online gambling.

    Trả lờiXóa
Mới hơn Cũ hơn