임베디드시스템개론 : Arduino 활용 Lecture #3: Button Input & FND Control 2012. 3. 25 by 김영주
강의목차 디지털입력 Button switch 입력 Button Debounce 7-Segment FND : 직접제어 7-Segment FND : IC 제어 2
디지털입력 : Switch 입력 (1) 실습목표 아두이노디지털입력처리실습 digitalread() 스위치입력처리이해 3
디지털입력 : Switch 입력 (2) 사전지식 디지털입력 (Digital Input) 아두이노는디지털입출력핀을 입력모드 로설정할경우 HIGH (5V) 또는 LOW (0 V) 의전기신호가입력가능 HIGH LOW digitalread() 함수 특정입력핀의현재입력신호값을읽어옴 (HIGH/LOW) 스위치 (Switch) 연결을만들거나끊는데사용하는전자부품다양한형태의스위치를사용가능간이형태의스위치를만들어사용가능 4
디지털입력 : Switch 입력 (3) 사전지식 : 스위치종류 Knife Switch Toggle Switch Magnetic Hexadecimal Tilt Lever Penny Switch Button Switch 5
디지털입력 : Switch 입력 (4) 사전지식 스위치연결 디지털입력핀은아무런회로연결을갖지않는경우 디지털입력은 0V와 5V 사이를움직이며 (floating) 일정한값을갖지못함 Pull-up Register / Pull-down Register 입력핀을 5V 또는 0V 연결할때적용 Pull input up to 5V Pull input down to ground(0v) 스위치연결방식 스위치동작 Press HIGH Not Press LOW 6
[ 참고 ] 저항컬러코드식별법 (1) 7
[ 참고 ] 저항컬러코드식별법 (2) 8
디지털입력 : Switch 입력 (5) 회로도및회로구성 회로도 회로연결 9
디지털입력 : Switch 입력 (6) 아누이노프로그램 : Button Input int btnpin = 22; Int ledpin = 9; int btnstate; void setup() { pinmode(ledpin, OUTPUT); pinmode(btnpin, INPUT); void loop() { btnstate = digitalread(btnpin); if (btnstate == HIGH) { digitalwrite(ledpin, HIGH); else { digitalwrite(ledpin, HIGH); 10
디지털입력 : Switch 입력 (7) Button Bounce 현상 버튼을누르거나땔때에일시적으로전압이불안해지는현상 Button Debounce Button bounce를제거하는동작 H/W 해결책 capacity 활용 S/W 해결책 버튼입력상태가바뀔때에약간의지연을허용 11
디지털입력 : Switch 입력 (8) 아누이노프로그램 : Button Debounce int btnpin = 22; Int ledpin = 9; int btnstate; Int lastbtnstate = LOW; if (millis()-lastdebouncetime > debouncedelay) { btnstate = reading; long lastdebouncetime = 0; long debouncedelay = 50; void setup() { pinmode(ledpin, OUTPUT); pinmode(btnpin, INPUT); void loop() { int reading = digitalread(btnpin); 12 if (reading == lastbtnstate) { lastdebouncetime = millis(); digitalwrite(ledpin, btnstate); lastbtnstate = reading;
디지털입력 : Switch 입력 (9) Debounce 라이브러리 Arduino 플랫폼에서는 button debounce 라이브러리를제공 #include <Debounce.h> int btnpin = 22; Int ledpin = 9; Debounce debouncer = new Debounce(50, btnpin); void setup() { pinmode(ledpin, OUTPUT); pinmode(btnpin, INPUT); void loop() { debouncer.update(); digitalwrite(ledpin, debouncer.read()); 13
7-Segment FND 출력 (1) 실습목표 FND 장치를이용하여 16진수 (10진수) 출력 MCU를이용하여 FND 장치제어방법학습 14
7-Segment FND 출력 (2) 사전지식 7-Segment FND 8개의 LED로 1자리숫자를출력종류 Common-Anode FND Common-Cathode FND 10 진수출력 15
7-Segment FND 출력 (3) 사전지식 7-Segment FND 16진수출력 16
7-Segment FND 출력 (4) 회로도 7 6 4 2 1 9 10 5 17
7-Segment FND 출력 (5) 회로연결 18
7-Segment FND 출력 (6) 아두이노프로그램 : FND 출력 int fndstartpin = 24; int fndendpin = 31; void fndwrite(int num) { static unsigned char fnd_segcode[] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71 ; unsigned char outcode; int value; if (num < 0) num = 0; else if (num >= 16) num = 15; outcode = fnd_segcode[num]; 19 for (int i=fndstartpin; i<=fndendpin; i++) { value = (outcode & 0x01)? HIGH : LOW; digitalwrite(i, value); outcode >>= 1;
7-Segment FND 출력 (7) 아두이노프로그램 : FND 출력 void setup() { for (int i=fndstartpin; i<=fndendpin; i++) pinmode(i, OUTPUT); void loop() { for (int num=0; num<16; num++) { fndwrite(num); delay(1000); 20
7-Segment FND 출력 (8) 아두이노프로그램 : Button 입력 & FND 출력 #include <Debounce.h> int fndstartpin = 24; int fndendpin = 31; int btnpin = 2; int lastbtnstate = LOW; Int btninputcnt = 0; Debounce debouncer = new Debounce(20, btnpin); boolean checkrisingedge() { boolean edge; int state; debouncer.update(); state = debouncer.read(); edge = (state && (state!= lastbtnstate))? true : false; lastbtnstate = state; 21 return edge;
7-Segment FND 출력 (9) 아두이노프로그램 : Button 입력 & FND 출력 void fndwrite(int num) { static unsigned char fnd_segcode[] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71 ; unsigned char outcode; int value; if (num < 0) num = 0; else if (num >= 16) num = 15; outcode = fnd_segcode[num]; for (int i=fndstartpin; i<=fndendpin; i++) { value = (outcode & 0x01)? HIGH : LOW; digitalwrite(i, value); outcode >>= 1; 22
7-Segment FND 출력 (10) 아두이노프로그램 : Button 입력 & FND 출력 void setup() { for (int i=fndstartpin; i<=fndendpin; i++) pinmode(i, OUTPUT); fndwrite(btninputcnt); void loop() { if (checkrisingedge()) { if (++btninputcnt > 15) btninputcnt = 0; fndwrite(btninputcnt); 버튼입력신호의 rising edge 에동기화하여카운터값을증가시킴 23
전용 IC 를이용한 FND 출력 (1) 실습목표 전용제어 IC 를이용하여 FND 장치제어방법학습 I/O 전용 IC 를사용함으로써 MCU 의제어동작과관련하여입출력핀및제어프로그램을줄일수있음 MCU BCD code Blackbox Control signal 24
전용 IC 를이용한 FND 출력 (2) 사전지식 FND I/O IC : HEF4511BP IC 데이터쉬트참조 BCD to 7-segment latch/decoder/driver 25
전용 IC 를이용한 FND 출력 (3) 사전지식 HEF4511BP 26
전용 IC 를이용한 FND 출력 (4) 사전지식 HEF4511BP 제어신호타이밍 : 27
전용 IC 를이용한 FND 출력 (5) 회로도 28
전용 IC 를이용한 FND 출력 (6) 회로연결 29
전용 IC 를이용한 FND 출력 (7) 아두이노프로그램 : HEF4511BP 제어 #include <Debounce.h> int fndnelpin = 22; int fndbcdstartpin = 23; int fndbcdendpin = 26; int btnpin = 2; int lastbtnstate = LOW; Int btninputcnt = 0; Debounce debouncer = new Debounce(20, btnpin); boolean checkrisingedge() { boolean edge; int state; debouncer.update(); state = debouncer.read(); edge = (state && (state!= lastbtnstate))? true : false; lastbtnstate = state; 30 return edge;
전용 IC 를이용한 FND 출력 (8) 아두이노프로그램 : HEF4511BP 제어 void fndwrite(int bcd) { if (bcd < 0) bcd = 0; else if (bcd >= 10) bcd = 9; bcd &= 0x0f; digitalwrite(fndnelpin, LOW); for (int i=fndbcdstartpin; i<=fndbcdendpin; i++) { digitalwrite(i, (bcd & 0x08)? HIGH : LOW); bcd <<= 1; digitalwrite(fndnelpin, LOW); asm( nop ); asm( nop ); asm( nop ); digitalwrite(fndnelpin, HIGH); 31
전용 IC 를이용한 FND 출력 (9) 아두이노프로그램 : HEF4511BP 제어 void setup() { pinmode(fndnelpin, OUTPUT); for (int i=fndbcdstartpin; i<=fndbcdendpin; i++) pinmode(i, OUTPUT); fndwrite(btninputcnt); void loop() { if (checkrisingedge()) { if (++btninputcnt > 15) btninputcnt = 0; fndwrite(btninputcnt); 32
과제물 과제내용 HEF4511BP IC 를이용한 FND 프로그램에서 2 자리십진수를출력할수있도록회로를설계하고프로그램을작성하여라. 되도록제어신호수를줄일수있도록설계를제안하여라. 제출물 회로도 프로그램소스 실행예 ( 사진 ) 제출일 차주수업시간 33