LOGO Dongyang Mirae University 3 prepared by Choon
LOGO 아두이노 슈퍼루프 프로젝트 § 다중 기능 구현 Dongyang Mirae University 센서활용프로그래밍 3 prepared by Choon Woo Kwon
Multi-tasking 실습 : Blink+Fading LOGO v 실습 준비 Arduino UNO Breadboard 저항 330 Ω LED(Red) Dongyang Mirae University LED(Yellow) 센서활용프로그래밍 5 prepared by Choon Woo Kwon
Multi-tasking 실습(Blink+Fading) 배선도/회로도 Dongyang Mirae University 센서활용프로그래밍 6 LOGO prepared by Choon Woo Kwon
Multi-tasking 실습(Blink+Fading) – 스케치(1) // Blink 루틴과 Fading 루틴을 단순히 합친 경우(p. 59) // Blink, Fading 두 기능이 순차적으로 처리 // Blink 동작을 Fading 루틴 사이에 삽입 (p. 62) // Blink, Fading 기능이 상호 연동이 되어 동작 int led. Pin_fading = 11; int led. Pin_blink = 13; void setup() { pin. Mode(led. Pin_fading, OUTPUT); pin. Mode(led. Pin_blink, OUTPUT); } void loop() { //Blink 루틴 시작 digital. Write(led. Pin_blink, HIGH); delay(1000); digital. Write(led. Pin_blink, LOW); delay(1000); // Fading 루틴 시작 for(int fade. Value = 0; fade. Value <= 255; fade. Value +=5) { analog. Write(led. Pin_fading, fade. Value); delay(30); } for(int fade. Value = 255; fade. Value >= 0; fade. Value -=5) { analog. Write(led. Pin_fading, fade. Value); delay(30); } } Dongyang Mirae University LOGO void loop() { // fading up for(int fade. Value = 0; fade. Value <= 255; fade. Value +=5) { analog. Write(led. Pin_fading, fade. Value); digital. Write(led. Pin_blink, HIGH); delay(30); } // fading down for(int fade. Value = 255; fade. Value >= 0; fade. Value -=5) { analog. Write(led. Pin_fading, fade. Value); digital. Write(led. Pin_blink, LOW); delay(30); } } 센서활용프로그래밍 7 prepared by Choon Woo Kwon
Multi-tasking 실습(Blink+Fading) – 스케치(2) // millis() 함수를 이용하여 Blink 기능 수행 // delay() 함수 사용 않음 int led. Pin_fading = 11; int led. Pin_blink = 13; void loop() { // millis 함수로 현재 시간 얻기 unsigned long current. Millis = millis(); Serial. println(current. Millis); if(current. Millis-previous. Millis >= interval) { previous. Millis = current. Millis; int led. State = LOW; long previous. Millis = 0; if(led. State == LOW) led. State = HIGH; else led. State = LOW; long interval = 1000; void setup() { Serial. begin(115200); pin. Mode(led. Pin_fading, OUTPUT); pin. Mode(led. Pin_blink, OUTPUT); LOGO digital. Write(led. Pin_blink, led. State); } } } Dongyang Mirae University 센서활용프로그래밍 8 prepared by Choon Woo Kwon
Multi-tasking 실습(Blinking+Fading) – 스케치(3)LOGO // millis() 함수를 이용하여 Blink 기능, Fading 기능 구현 // 각 기능을 독립적으로 설정 가능 void blink_loop() { // millis 함수로 현재 시간 얻기 unsigned long current. Millis = millis(); void setup() { blink_setup(); fading_setup(); } if(current. Millis-blink_previous. Millis >= blink_interval) { blink_previous. Millis = current. Millis; if(blink_led. State == LOW) blink_led. State = HIGH; else blink_led. State = LOW; void loop() { blink_loop(); fading_loop(); } 매 blink _interval(500 ms) 마다 토글(toggle)되는 blink_led. State를 출력 digital. Write(led. Pin_blink, blink_led. State); } int led. Pin_blink = 13; } //led. State, previous. Millis, blink_interval 변수는 전역변수로 스케 치 파일 내 모든 함수에서 참조 가능 //(… 다음 슬라이드 스케치로 연속 …) int blink_led. State = LOW; long blink_previous. Millis = 0; long blink_interval = 500; void blink_setup() { pin. Mode(led. Pin_blink, OUTPUT); } Dongyang Mirae University 센서활용프로그래밍 9 prepared by Choon Woo Kwon
Multi-tasking 실습(Blinking+Fading) – 스케치(3)LOGO // (… 이전 슬라이드 스케치에서 연속 …) void fading_loop() { unsigned long current. Millis = millis(); //fading. Value, fading. Dir, previous. Millis, fading_interval 등은 전 역변수로 스케치 파일 내 모든 함수에서 참조 가능 if(current. Millis-fading_previous. Millis >= fading_interval) { fading_previous. Millis = current. Millis; int led. Pin_fading = 11; int fading. Value = 0; int fading. Dir = 1; long fading_previous. Millis = 0; long fading_interval = 30; if(fading. Dir == 1) { if(fading. Value <= 255) { fading. Value +=3; if(fading. Value > 255) { fading. Value = 255; void fading_setup() { pin. Mode(led. Pin_fading, OUTPUT); } 매 fading _interval(30 ms) 마다 fading_DIR에 따라 증가 또는 감소하는 fading_Value(0~255)를 PWM 출력 fading. Dir = 0; } } } else { if(fading. Value >= 0) { fading. Value -=3; if(fading. Value < 0) { fading. Value = 0; fading. Dir = 1; } } } analog. Write(led. Pin_fading, fading. Value); } } Dongyang Mirae University 센서활용프로그래밍 10 prepared by Choon Woo Kwon
Multi-tasking 실습(Blinking+Fading) – millis() 동작LOGO millis() 함수 이용 LED BLINK current. Millis=millis() (예) blink_interval=500 경우 0 1 2 ︙ ︙ 498 499 500 501 502 ︙ 998 999 1000 1001 1002 ︙ ︙ 1498 1499 1500 1501 1502 ︙ current. Millis 값이 매 interval 값에 도달할 때마다 § LED 상태 값을 토글 ON ⇔ OFF § LED 상태 값을 아두이노 Pin을 통해 출력 current. Millis 값이 interval에 도 달 않은 경우 § 출력 없음 current. Millis 값이 500, 1000, 1500, … 이 될 때 LED 상태가 토글 되면서 상태 값이 출력 ⇒ LED 0. 5초 ON, 0. 5초 OFF 깜박거림 Dongyang Mirae University millis() 함수 이용 LED FADING current. Millis=millis() 0 1 2 ︙ 29 30 31 ︙ 59 60 61 ︙ 89 90 91 ︙ 119 120 121 ︙ 149 150 151 ︙ 179 180 181 ︙ 센서활용프로그래밍 (예) fading_interval=30 경우 current. Millis 값이 매 interval이 될 때마다 § LED Fading이 UP 또는 DOWN 방향 으로 1개의 fade. Value 값을 PWM 출 력으로 수행 fade. Value 값이 PWM 출력범위 0, 255을 벗어나면 Fading 방향 값을 토글 FADING UP ⇔ FADING DOWN current. Millis 값이 interval에 도달 않 은 경우 § 출력 없음 current. Millis 값이 30, 60, 90, 120, …이 될 때 PWM 출력 값으로 사용되는 fade. Value 가 fade. Dir 상태(UP/DOWN)에 따라 값이 증가/감소되며 fade. Value 값이 PWM 출력 § fade. Value는 0~255으로 제한되며 범위 를 벗어나면 fade. Dir이 토글 ⇒ LED는 매 30 ms마다 1개의 fade. Value가 일정크기(예제 경우 ± 3) 증가 또는 감소하 여 PWM 출력 값으로 출력. ⇒ LED는 30 ms 간격으로 일정크기 밝기로 증가 또는 감소 11 prepared by Choon Woo Kwon
타이머 1 인터럽트 예시(1) – LED Blink 간격 구현 LOGO v 예시(1) 배치도 // // 예시(1) : 타이머 1 인터럽트를 이용하여 LED Blink // // Timer. One 라이브러리 사용을 위해 라이브러리 #include <Timer. One. h> void setup() { pin. Mode(13, OUTPUT); Timer 1. initialize(2000000); //타이머 간격을 2초로 설정 //2000000 us=2000 ms=2 sec Timer 1. attach. Interrupt(timer. Isr); //타이머 1 인터럽트 처리기 } void loop() {} // 인터럽트 처리기(Interrupt Service Routine) void timer. Isr() { digital. Write(13, digital. Read(13) ^ 1); //LED 토글 } /* 참고 : 비트연산자(Bitwise Operators) & (bitwise and) | (bitwise or) ^ (bitwise xor) ~ (bitwise not) << (bitshift left) >> (bitshift right) */ Dongyang Mirae University 센서활용프로그래밍 14 prepared by Choon Woo Kwon
LOGO 타이머 1 인터럽트 예시(2) – ISR과 loop의 공유문제(p. 76) // ISR(Interrupt Service Routine)과 loop의 공유문제 발생 // // 타이머 1 인터럽트를 이용 // // Timer. One 라이브러리 사용을 위해 라이브러리 #include <Timer. One. h> // ISR(Interrupt Service Routine)과 loop의 공유문제 해결 // // 타이머 1 인터럽트를 이용 // // Timer. One 라이브러리 사용을 위해 라이브러리 #include <Timer. One. h> void setup() { Serial. begin(115200); Timer 1. initialize(1000); Timer 1. attach. Interrupt(timer. Isr); } void loop() { Serial. println("| "); } void setup() { Serial. begin(115200); Timer 1. initialize(1000); Timer 1. attach. Interrupt(timer. Isr); } void loop() { no. Interrupts(); 인터럽트 발생 금지 Serial. println("| "); interrupts(); 인터럽트 발생 허용 } void timer. Isr() { Serial. println(" ]"); } 직렬통신 속도 115200 bps 1000 us=1 ms=1/1000초 초당 1000번 인터럽트 발생: time. Isr() 호출 |, space, newline을 차례로 출력 space, ], newline을 차례로 출력 void timer. Isr() { Serial. println(" ]"); } (수행결과) |, space, newline space ] 을 차례로 출력 (수행결과) | space, ] 이 한 줄에 표시되는 경우 발생 Dongyang Mirae University 센서활용프로그래밍 15 prepared by Choon Woo Kwon
타이머 1 인터럽트 예시(3) – millis() 함수 기능 구현(p. 82)LOGO // 타이머 1 인터럽트를 이용 millis() 함수 기능 구현 // // 타이머 1 인터럽트를 이용 // #include <Timer. One. h> void setup() { Serial. begin(115200); (수행결과) millis() 함수와 동일한 결과 출력 직렬통신 속도 115200 bps 1000 us=1 ms=1/1000초 Timer 1. initialize(1000); 초당 1000번 인터럽트 발생: Timer 1. attach. Interrupt(timer. Isr); time. Isr() 호출 } space, ], newline을 차례로 출력 void loop() { unsigned long current. Millis = get_millis(); Serial. println(current. Millis); } unsigned long timer 1_millis = 0; void timer. Isr() { timer 1_millis ++; } timer 1_millis 변수 값을 초당 1000번 증가 unsigned long get_millis(void) { return timer 1_millis; } Dongyang Mirae University 센서활용프로그래밍 17 prepared by Choon Woo Kwon
외부 인터럽트– 버튼 기능 구현(p. 140) LOGO // 타이머 1 인터럽트를 이용 millis() 함수 기능 구현 // // 타이머 1 인터럽트를 이용 // int pin = 11; volatile int state = LOW; void setup() { pin. Mode(pin, OUTPUT); attach. Interrupt(0, blink, RISING); 외부 인터럽트 0 처리 함수 button. Isr 함수 등록 2번 핀 입력값이 LOW에서 HIGH로 바뀌는 순간 button. Isr 인 터럽트 처리 함수를 하드웨어적으로 호출 } void loop() { digital. Write(pin, state); } void blink() { state = !state; } Dongyang Mirae University button. Isr 인터럽트 처리 함수 state 값 토글 센서활용프로그래밍 18 prepared by Choon Woo Kwon
LOGO 슈퍼루프 아두이노 프로젝트 § 아두이노 프로젝트(p. 84) Dongyang Mirae University 센서활용프로그래밍 19 prepared by Choon Woo Kwon
슈퍼루프 아두이노 프로젝트 LOGO v 아두이노 프로젝트(p. 84) § § § LED Blink LED Fading RGB LED Blink RGB LED Fading Serial Input & Serial Output Bluetooth Communication Dongyang Mirae University 센서활용프로그래밍 20 prepared by Choon Woo Kwon
LOGO Dongyang Mirae University 센서활용프로그래밍 21 prepared by Choon Woo Kwon
- Slides: 21