Ụ
Ạ
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); // INPUTPULLUP 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;
}
}