60/7/10/1A đường số 4, khu phố 5, P.Trường Thọ Q.Thủ Đức, TP.HCM  0986.977.330

Image

HOTLINE ĐẶT HÀNG

 0986.977.330

HOTLINE LIÊN HỆ

0986.977.330

MẠNG XÃ HỘI

Image

CỬA HÀNG VÀ ĐẠI LÝ

CH1: 60/7/10/1A đường số 4, khu phố 5, p.Trường Thọ, q.Thủ Đức, TP.HCM
Tel: 0986.977.330

CH2: Cầu Cái Sơn, ấp 2B, xã Nhơn Thạnh, TP.Bến Tre, tỉnh Bến Tre
Tel: 0986.977.330

THANH TOÁN TRỰC TUYẾN

Khách hàng có thể chuyển khoản qua số tài khoản sau:

AGRIBANK
- Chủ tài khoản: Huỳnh Minh Phú
- Số tài khoản: 6300205184282
- Địa chỉ: Chi nhánh 9, TP.HCM

VIETCOMBANK
- Tài khoản: Huỳnh Minh Phú
- Số tài khoản: 0381000510491
- Địa chỉ: Chi nhánh Thủ Đức, TP.HCM

♙ Encoder quay

Image

Encoder quay

Tên Sản Phẩm: Encoder quay

Mã Sản Phẩm: KTPH

Giá: 50,000 đ

 

CHI TIẾT SẢN PHẨM


Rotary Encoder (Encoder quay) được sử dụng để đo tốc độ động cơ. Module này có thể đo chiều thuận và chiều nghịch, đồng thời trong module có 1 nút nhấn khi ấn thanh quay sẽ reset lại quá trình đo. Xin gửi các bạn mã code mà mình đã lập trình cho nó và clip do chính mình làm.

 

 

 

 

Mã code chương trình:

 /*

 Chương trình ĐẾM SỐ VÒNG QUAY BẰNG ENCODER QUAY

 Chương trình được viết bởi Huỳnh Minh Phú

 Các bạn có thể tham khảo video thứ 44 để hiểu rõ về việc kết nối

 Một encoder quay thông thường có 3 chân, nhìn từ mặt trước là A C B

 Quay theo chiều kim đồng hồ A(on)>B(on)>A(off)->B(off)

 Quay ngược chiều kim đồng hồ B(on)>A(on)>B(off)->A(off)

 Ngoài ra còn có một chân có nút nhấn và 2 chân nguồn

 Chương trình này hiện đo rất tốt khi chiều ngược chiều kim đồng hồ nhưng chiều cùng chiều kim đồng hồ thì đo chưa đạt

 Mình đã mất 3 ngày cho nghiên cứu này

 Vì công việc bận bịu nên mình đành tạm gác việc phát triển hướng này, mong các bạn sẽ bổ sung thêm

 Các bạn có thể đo thủ công bằng cách đổi 2 chân DT và CLK nếu muốn đo cùng chiều kim đồng hồ

 Hoặc 1 ngày nào đó khi có thời gian rãnh mình sẽ chỉnh việc đọc chiều quay cùng chiều kim đồng hồ cho chính xác

 

*/

 

// Cách nối các chân trên Encoder quay

#define  encoderPinA  2   // Tương ứng chân DT trên Encoder quay

#define  encoderPinB  3   // Tương ứng chân CLK trên Encoder quay

// Chân + nối nguồn 5V và chân GND nối cực âm

 

volatile unsigned int encoderPos = 0;  // Cho vị trí đầu bằng 0

unsigned int lastReportedPos = 1;   // Vị trí cuối bằng 1

static boolean rotating=false;      // Quản lý debounce (giống như là chống nhiễu)

 

// các biến cho trình phục vụ ngắt interrupt service routine vars

boolean A_set = false;             

boolean B_set = false;

//Đo tốc độ

unsigned int newposition;

unsigned int oldposition=0;

unsigned long newtime;

unsigned long oldtime=0;

float vantoc;

 

void setup() {

 

  pinMode(encoderPinA, INPUT_PULLUP); // INPUT-PULLUP tương đương Mode INPUT và tự động nhận trạng thái HIGH hoặc LOW

  pinMode(encoderPinB, INPUT_PULLUP);

 

// Chân encoder trên ngắt 0 (chân 2)

  attachInterrupt(0, doEncoderA, CHANGE);

// Chân encoder trên ngắt 1 (chân 3)

  attachInterrupt(1, doEncoderB, CHANGE);

 

  Serial.begin(9600);  // chuyển dữ liệu lên cổng Serial Port

}

 

// Vòng lặp chính, công việc được thực hiện bởi trình phục vụ ngắt

void loop() {

  rotating = true;  // Khởi động bộ debounce (có thể hiểu như bộ chống nhiễu)

  newtime=millis();

  newposition=encoderPos;

  if (newtime-oldtime==1000){

    detachInterrupt(0);

    detachInterrupt(1);

    vantoc=(newposition-oldposition)*60/20;

    Serial.print("vantoc=");

    Serial.println(vantoc,DEC);

    oldposition=newposition;

    oldtime=newtime;

   attachInterrupt(0, doEncoderA, CHANGE);

   attachInterrupt(1, doEncoderB, CHANGE); 

       }

}

 

// Ngắt khi chuyển trạng thái của A

void doEncoderA(){

  // debounce

  if ( rotating ) delay (1);  // Chờ 1 chút

 

  // Kiểm tra việc chuyển đổi trạng thái, xem có thật sự thay đổi trạng thái chưa

  if( digitalRead(encoderPinA) != A_set ) {  // debounce một lần nữa

    A_set = !A_set;

 

    // Cộng 1 nếu có tín hiệu A rồi có tín hiệu B

    if ( A_set && !B_set )

      encoderPos += 1;

 

    rotating = false;  // Không cần debounce nữa cho đến khi được nhấn lần nữa

  }

}

 

// Ngắt khi thay đổi trạng thái ở B, tương tự như ở A

void doEncoderB(){

  if ( rotating ) delay (1);

  if( digitalRead(encoderPinB) != B_set ) {

    B_set = !B_set;

    //  Trừ 1 nếu B rồi đến A

    if( B_set && !A_set )

      encoderPos -= 1;

      rotating = false;

  }

}

♙ SẢN PHẨM KHÁC