4. 아두이노로 LED 제어하기 - 스마트 폰으로 제어하는 아두이노 -
강의 개요 아두이노 보드를 사용하여 LED를 on-off제어하는 다양한 실습으로 아두이노 보드의 디지털제어 방법과 명령어들을 익혀보자.
4.1 LED 1개 ON/OFF 제어 아두이노 보드로 모든 디지털 출력을 내보낼 수 있는 예 단순하고 쉽지만 확장이 가능한 중요한 개념 "Blink" 예제 프로그램 setup( )함수 안에서 pinMode()함수를 이용 디지털입출력 핀 13번을 출력 설정 loop( )함수 안에서 digitalWrite() 함수 핀 13번에 "1"과 "0"을 출력 delay( )함수를 이용하여 시간 지연 아두이노 보드의 디지털입출력 핀 13번 부근에 있는 LED가 약 1초 간격으로 깜박임
"Blink" 예제 void setup() { 아두이노 보드의 핀 설정 pinMode(13, OUTPUT); 디지털입출력 핀 13번을 출력으로 설정 } setup() 함수 종료 void loop() { loop() 함수의 시작, 내부의 명령이 무한 반복 digitalWrite(13, HIGH); 디지털입출력 핀 13번에 HIGH("1") 출력 delay(1000); 1000ms 동안 시간지연 digitalWrite(13, LOW); 디지털입출력 핀 13번에 LOW("0") 출력 loop() 함수의 끝
예제 4.1 디지털입출력 13번의 출력제어 아두이노 보드 외부에 LED를 연결하여 제어 디지털입출력 핀 13번에 LED 연결 "Blink" 사용한 스케치 업로드 디지털입출력 핀 13번에 연결한 LED가 약 1초 간격으로 깜박임
예제 4.2 디지털입출력 핀 10번의 출력제어 LED에 연결한 핀 13번을 핀 10번으로 변경 pinMode(10, OUTPUT); digitalWrite(10, HIGH);
UNO와 Mega 보드의 디지털입출력 UNO보드 디지털입출력 핀 0~13번 가운데 어떤 것으로 변경하여도 동일한 결과
예제 4.3 ON/OFF 속도 조절 LED의 깜박이는 속도 조절 주요개념 dealy(ms)함수에서 변수 ms는 밀리초(milli second) 의미 "delay(500)" 0.5초의 시간지연을 시키는 동작 delay(500); "delay(1000)"에서 보다 "delay(500)"에서 빠르게 LED가 깜박임
예제 4.4 변수 사용 변수를 사용하면 입출력 핀이나 시간지연의 변경 편리 주요개념 변수 선언을 loop( )함수 밖에 선언 전역 변수로 사용되어 스케치 전체에 적용 변수는 형식의 지정이 필요 핀의 번호와 같이 정수형으로 표현되는 값은 "int"로 선언 int digitalPin = 10; int delayTime = 500; void setup() { pinMode(digitalPin, OUTPUT); } void loop() { digitalWrite(digitalPin, HIGH); delay(delayTime); digitalWrite(digitalPin, LOW);
4.2 LED 4개 on/off제어 여러 개의 LED의 on/off 상태 제어 디지털 입출력 핀 4개에 LED 4개 연결
예제 4.5 LED 4개의 ON-OFF 제어 4개의 LED 동시 ON-OFF void setup() { pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); } void loop() { digitalWrite(8, HIGH); digitalWrite(9, HIGH); digitalWrite(10, HIGH); digitalWrite(11, HIGH); delay(1000); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW);
예제 4.6 변수와 for문을 사용한 ON/OFF 제어 int i; for문에 사용하기 위하여 i를 정수형 변수로 선언 void setup() { for(i=8; i<12; i++) { pinMode(i, OUTPUT); } 핀 8번부터 11까지 디지털 출력모드로 지정 void loop() { loop함수 시작 digitalWrite(i, HIGH); delay(1000); 디지털 출력모드인 핀 8번부터 11으로 HIGH출력 시간지연 1초 digitalWrite(i, LOW); 디지털 출력모드인 핀 8번부터 11으로 LOW출력 loop함수 끝
예제 4.7 배열과 변수, for문을 이용한 ON/OFF 제어 연속적이 않은 핀들을 이용한 제어는 배열을 사용 주요개념 사용하고자 하는 디지털 입출력 핀을 배열에 저장 for문을 사용하여 호출하도록 작성 pinLED[ ]= {pin1, pin2, pin3, pin4};
예제 4.7 스케치 int pinLED[]= {6, 9, 11, 12}; int i; pinLED[0]~pinLED[3]은 각각 핀 6, 9, 11, 12번 지정 void setup() { for(i=0; i<4; i++) { pinMode(pinLED[i], OUTPUT); } pinLED[0]이 나타내는 6번을 출력모드로 선언 pinLED[1]이 나타내는 9번을 출력모드로 선언 pinLED[2]이 나타내는 11번을 출력모드로 선언 pinLED[3]이 나타내는 12번을 출력모드로 선언 void loop() { loop함수 시작 digitalWrite(pinLED[i], HIGH); delay(1000); 디지털 출력모드인 핀 6, 9, 11, 12번으로 HIGH 출력 시간지연 1초 digitalWrite(pinLED[i], LOW); 디지털 출력모드인 핀 6, 9, 11, 12번으로 LOW 출력 loop함수 끝
4.3 LED 4개의 ON/OFF 상태를 좌우로 이동제어 주요개념 제어하고자 하는 핀을 배열에 저장 원하는 순서에 따라 배열에 저장된 핀을 사용하게 되면, 연속하지 않은 핀들도 순서적으로 제어 가능
int pinLED[]= {8, 9, 10, 11}; int i; 배열 pinLED[] 정수형으로 선언하고 값을 지정 pinLED[0]~pinLED[3]은 각각 핀8~11번 지정 void setup() { for(i=0; i<4; i++) { pinMode(pinLED[i], OUTPUT); } pinLED[0]이 나타내는 8번을 출력모드로 선언 pinLED[1]이 나타내는 9번을 출력모드로 선언 pinLED[2]이 나타내는 10번을 출력모드로 선언 pinLED[3]이 나타내는 11번을 출력모드로 선언 void loop() { loop함수 시작 for(i=0; i<4; i++) { digitalWrite(pinLED[i], HIGH); delay(1000); digitalWrite(pinLED[i], LOW); 지정된 핀에 HIGH를 출력(LED ON) 1초의 시간지연 지정된 핀에 LOW를 출력(LED ON) loop함수 끝
4.4 PWM을 이용한 밝기 조절 UNO보드의 디지털입출력 가운데 PWM제어가 가능한 핀 “~”가 붙어 있는 핀 3, 5, 6, 9, 10, 11번 그림 1.3과 표 1.3 참고 LED의 밝기나 모터의 속도 빠르기 제어 가능
PWM PWM(Pulse Width Modulation) 아두이노 보드 펄스의 폭을 조정하여 전류를 공급해 주는 방식 펄스가 HIGH(+5V)가 되는 시간만큼 ON 펄스가 LOW(0V)가 되면 OFF ON/OFF 동작을 일정한 주기로 반복 펄스가 HIGH가 되는 시간이 길수록 더 많은 전류 흐르게 되어 LED의 경우 더 밝아지고, 모터의 경우 속도가 빨라진다 아두이노 보드 PWM 기능을 가진 디지털 입출력 핀 사용 analogWrite() 함수로 제어
예제 4.9 LED의 밝기 조절 LED의 밝기를 밝게 하거나 어둡게 조정 주요개념 LED는 LED_on 시간만큼 켜져 있다가, LED_off 시간만큼 꺼지게 되는 동작을 LED_pulse 주기로 반복 LED_on 시간을 크게 하면 LED의 밝기는 밝아지는 PWM동작
int digitalPin = 8; int LED_pulse = 20; int LED_on = 5; int LED_off = LED_pulse - LED_on; LED의 on/off 반복시간 설정 LED가 on되는 시간 설정 LED가 off되는 시간 설정 void setup() { pinMode(digitalPin, OUTPUT); } void loop() { digitalWrite(digitalPin, HIGH); delay(LED_on * 20); digitalWrite(digitalPin, LOW); delay(LED_off * 20); loop문을 보면 LED가 반복적으로 on-off되도록 되어 있지만, LED는 계속 on되어 있는 것처럼 보인다. 그러나 on/off가 반복시간 LED_pulse를 20ms보다 크게 주면 LED가 깜박이게 보이게 된다.
예제 4.10 PWM에 의한 발기 조절 주요개념 : analogWrite( ) 함수 생성되는 펄스의 주기(주파수)는 약 500Hz const int digitalPin=8; int i=0; void setup() { pinMode(digitalPin, OUTPUT); } 디지털입출력 핀 8번을 출력으로 설정 void loop() { loop함수 시작 for (i=0; i<255; i++) { analogWrite(digitalPin, i); delay(10); 디지털입출력 핀 8번으로 analogWrite( )로 0에서 254까지 서서히 켜지는 PWM 신호 출력 for (i=0; i>0; i--) { 255에서 1까지 서서히 줄어드는 PWM 신호 출력 loop함수 끝
4.5 함수만들기 반복적으로 사용되는 부분을 함수로 만들어 사용
예제 4.11 LED ON/OFF함수 만들기 함수부분 함수호출 int led = 12; 정수형 변수 led로 핀 12번 지정 void setup() { pinMode(led, OUTPUT); } 디지털입출력 핀 12번을 출력으로 설정 void blink_ft(int pin) { pin이라는 변수를 갖는 blink_ft( )함수 선언 digitalWrite(pin, HIGH); delay(1000); digitalWrite(pin, LOW); blink_ft( )함수의 내용 void loop() { blink_ft(led); 함수 blink_ft( )에 변수 led를 지정하여 호출 함수부분 함수호출
예제 4.12 LED 좌우이동 ON/OFF함수 만들기 int pinLED[ ]= {6, 9, 11, 12}; int i; 배열 pinLED[] 정수형으로 선언하고 값 지정 pinLED[0]~pinLED[3] 각각 6,9,11,12번 지정 void setup() { for(i=0; i<4; i++) { pinMode(pinLED[i], OUTPUT); } pinLED[0]이 지시하는 6번을 출력모드로 선언 pinLED[1]이 지시하는 9번을 출력모드로 선언 pinLED[2]이 지시하는 11번을 출력모드로 선언 pinLED[3]이 지시하는 12번을 출력모드로 선언 void blink_ft2(int pin, boolean val){ pin과 val 변수를 갖는 blink_ft( )함수를 선언 digitalWrite(pin, val); delay(1000); blink_ft2( )함수의 내용 void loop() { loop함수 시작 for(i=0; i<4; i++) { int pin=pinLED[i]; 출력할 핀 지정 boolean st_H=1; blink_ft2(pin, st_H); LED를 ON으로 출력할 상태 지정 blink_ft2( )함수 호출 boolean st_L=0; blink_ft2(pin, st_L); LED를 OFF로 출력할 상태 지정 loop함수 끝
4.6 HBE-MCU-Multi의 LED 모듈을 이용한 제어 Mega2560과 HBE-MCU-Multi의 LED 모듈로 16개 LED 동시 제어 HBE-MCU-Multi의 LED 모듈 LED LD0~LD15는 음극에 공통으로 연결 LED 점등 방법 : LED0 ~ LED15) +5V를 인가하면, LED 점등
예제 4.13 LED 좌우이동 ON/OFF함수 만들기 아두이노 MEGA 보드 디지털입출력 핀 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52번을 LED 모듈을 사용하여 16개의 LED가 순차적 ON/OFF
예제 4.13의 스케치 int pinLED[16] = {22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52}; int i; void setup() { for(i=0; i<16; i++) { pinMode(pinLED[i], OUTPUT); } void blink_ft2(int pin, boolean val){ digitalWrite(pin, val); delay(1000); void loop() { for(i=0; i<16; i++) { int pin=pinLED[i]; boolean st_H=1; blink_ft2(pin, st_H); boolean st_L=0; blink_ft2(pin, st_L);
연습과제1 4개의 LED가 다음 그림과 같이 2개씩 번갈아 가며 on/off되는 스케치를 작성하여 보자.
연습과제2 4개의 LED가 다음 그림과 같이 오른쪽에서 왼쪽으로 순차적으로 on/off되는 스케치를 작성하여 보자.
연습과제3 8개의 LED가 다음 그림과 같이 왼쪽에서 오른쪽으로 순차적으로 2개씩 on되었다가 다시 왼쪽에서 오른쪽으로 순차적으로 2개씩 off되는 스케치를 작성하여 보자. 8개의 LED가 다음 그림과 같이 왼쪽에서 오른쪽으로 순차적으로 2개씩 시간지연이 점점 빠르게 되며 on되었다가 다시 왼쪽에서 오른쪽으로 순차적으로 2개씩 시간지연이 점점 느리게 되며 off되는 스케치를 작성하여 보자.
연습과제4 8개의 LED가 다음 그림과 같이 왼쪽에서 오른쪽으로 순차적으로 시간지연이 점점 빠르게 되며 더 밝아져서 on되었다가 다시 왼쪽에서 오른쪽으로 순차적으로 시간지연이 점점 느리게 되며 off되고 남아있는 LED는 어두워지는 스케치를 작성하여 보자.
함수정리 아두이노 보도의 디지털입출력 핀에 대하여 입력모드와 출력 모드를 지정하는 명령어 pinMode(pin-munber, state); 아두이노 보도의 디지털입출력 핀에 대하여 입력모드와 출력 모드를 지정하는 명령어 -pin-munber : UNO(0~13), Mega(0~54) -state : 출력은 “OUTPUT”, 입력은 “INPUT"로 설정 (예) pinMode(10, OUTPUT); 핀10을 출력으로 지정 pinMode(10, INPUT); 핀10을 입력으로 지정 digitalWrite(pin-munber, state); 아두이노 보도의 디지털출력으로 선언된 핀에 대하여 HIGH('1')와 LOW('0') 출력하는 명령어 -pin-munber : 디지털출력으로 선언된 핀의 번호 -state : HIGH 또는 '1', LOW 또는 '0' (예) digitalWrite(10, HIGH); 핀10에 ‘1’ 출력 digitalWrite(10, ‘1’); 핀10에 ‘1’ 출력
함수정리 delay(milli-seconds); 시간지연 함수 -milli-seconds : 숫자 값이 밀리초를 의미 (예) digitalWrite(1000); 1000밀리초(1초) digitalWrite(500); 500밀리초(0.5초) int 정수형 변수 선언 (예) int val=10; val를 정수형 변수로 선언하고 값을 10으로 설정 analogWrite(pin-munber, value); 아두이노 보도의 디지털입력으로 선언된 핀을 통하여 HIGH('1')와 LOW('0') 값을 읽는 명령어 -pin-munber : 디지털입력으로 선언된 핀의 번호 -value : 출력범위 0~255 (예) analogWrite(8, 128); 핀8에 최대출력의 50%값을 출력