GIÁO D C VÀ ĐÀO T O

ƯỜ

Ạ Ọ

Ố Ồ

TR

NG Đ I H C NÔNG LÂM THÀNH PH  H  CHÍ MINH

Ơ

KHOA C  KHÍ – CÔNG NGH

—–¯—–

BÁO CÁO TH C HÀNH C M BI N

Ế  TRONG ĐI U KHI N

Đ C XUNG ENCODER

GVHD : Ths. LÊ VĂN B NẠ

ứ ả ầ SVTH  : Tr n Đ c B o

LỚP     : DH12TD

MSSV  : 12138017

Thang ́ 6 năm 2015

I.

II.

Ớ Ệ GI I THI U ENCODER:

Ơ Ồ S  Đ  NGUYÊN LÝ:

III.

Ậ L P TRÌNH TRÊN ARDUINO:

/*

ươ ắ Ch ng trình ng t cho Encoder quay

ộ ườ 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

*/

ươ ứ ng  ng chân DT trên Encoder:    right (labeled

#define  encoderPinA  2   // T DT on our decoder, yellow wire)

ươ ứ ng  ng chân CLK trên Encoder:   left (labeled

#define  encoderPinB  3   // T CLK on our decoder, green wire)

ủ ấ

#define  clearButton  8    // Chân c a nút nh n switch (labeled SW on our  decoder, orange wire)

ố ự ồ

ố // Chân + n i ngu n 5V và chân GND n i c c âm connect the +5v and gnd  appropriately

ầ ằ ị

volatile unsigned int encoderPos = 0;  // Cho v  trí đ u b ng 0 a counter for the  dial

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

ư ả ố ố

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

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

boolean A_set = false;

boolean B_set = false;

void setup() {

ươ ươ ng đ ng

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

pinMode(encoderPinB, INPUT_PULLUP);

pinMode(clearButton, INPUT_PULLUP);

ắ // Chân encoder trên ng t 0 (chân 2): encoder pin on interrupt 0 (pin 2)

attachInterrupt(0, doEncoderA, CHANGE);

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

attachInterrupt(1, doEncoderB, CHANGE);

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

}

ặ ụ ụ ắ ệ ượ ự ệ ở c th c hi n b i trình ph c v  ng t: main loop,

// Vòng l p chính, công vi c đ work is done by interrupt service routines, this one only prints stuff

void loop() {

ư ộ ố ể ể ở ộ ễ ộ

rotating = true;  // Kh i đ ng b  debounce (có th  hi u nh  b  ch ng nhi u):  reset the debouncer

if (lastReportedPos != encoderPos) {

Serial.print("Index:");

Serial.println(encoderPos, DEC);

lastReportedPos = encoderPos;

}

if (digitalRead(clearButton) == LOW )  {

encoderPos = 0;

}

}

ể ắ ạ ủ // Ng t khi chuy n tr ng thái c a A: Interrupt on A changing state

void doEncoderA(){

// debounce

ờ if ( rotating ) delay (1);  // Ch  1 chút wait a little until the bouncing is done

ể ổ ạ ổ ạ ậ ự ệ

ư ể   // 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: Test transition, did things really change?

ộ ầ ữ

if( digitalRead(encoderPinA) != A_set ) {  // debounce m t l n n a: debounce  once more

A_set = !A_set;

ệ ế ệ ộ ồ // C ng 1 n u có tín hi u A r i có tín hi u B: adjust counter + if A leads B

if ( A_set && !B_set )

encoderPos += 1;

ữ ế ượ ấ ầ ữ c nh n l n n a:

ầ     rotating = false;  // Không c n debounce n a cho đ n khi đ no more debouncing until loop() hits again

}

}

ắ ở ươ B, t ng t ự ư ở  nh A: Interrupt on B changing

ổ ạ // Ng t khi thay đ i tr ng thái  state, same as A above

void doEncoderB(){

if ( rotating ) delay (1);

if( digitalRead(encoderPinB) != B_set ) {

B_set = !B_set;

ồ ế ừ ế //  Tr  1 n u B r i đ n A: adjust counter ­ 1 if B leads A

if( B_set && !A_set )

encoderPos ­= 1;

rotating = false;

}

}