아두이노를 위한 프로그래밍 기초 7 – for (반복문)
이 문서는 아두이노 보드를 사용하기 위해 필요한 프로그래밍 기초 지식이 없는 분들을 위한 가이드 문서입니다. 따라서 이미 프로그래밍에 대한 경험이 있다면 이 강좌 시리즈는 넘어가셔도 좋습니다.
=============================================================
.
지난 강좌에서 조건문과 반복문은 프로그램의 흐름을 파악하는데 중요한 요소라고 말씀 드렸습니다. 조건문은 살펴봤으니 반복문의 활용에 대해서 살펴보겠습니다.
1. LED 차례로 점멸하기 예제
이번에 살펴볼 예제는 LED를 여러개 연결한 다음 차례로 on/off 시켜서 마치 빛이 좌우로 움직이는 듯한 느낌을 주도록 하는 예제입니다. 여기에서는 6개의 LED를 사용합니다. 소스코드 및 세부내용은 아두이노 공식 사이트에서 확인하실 수 있습니다.
http://arduino.cc/en/Tutorial/ForLoop
아래처럼 회로를 꾸미면 됩니다. LED 6개를 똑같이 배치하고 각각의 + 라인을 아두이노의 6개 핀에 연결해줍니다. 제어가 편하도록 연속된 핀을 사용합니다. 여기서는 2번~7번 핀을 사용.
자 그럼 우리가 원하는 대로 차례대로 LED가 켜지게 하려면? 아래과정을 반복하면 되겠죠.
- 2번 핀 5v 출력 -> 잠시 대기 -> 2번 핀 0V 출력
- 3번 핀 5v 출력 -> 잠시 대기 -> 3번 핀 0V 출력
- …..
- 7번 핀 5v 출력 -> 잠시 대기 -> 7번 핀 0V 출력
이러면 빛이 2번 LED부터 7번까지 이동하는 것처럼 보이겠죠. 이걸 역순으로 다시 실행하면 빛이 7번에서 2번으로 돌아오구요.
2. 예제 코드
/* For Loop Iteration Demonstrates the use of a for() loop. Lights multiple LEDs in sequence, then in reverse. The circuit: * LEDs from pins 2 through 7 to ground created 2006 by David A. Mellis modified 30 Aug 2011 by Tom Igoe This example code is in the public domain. http://www.arduino.cc/en/Tutorial/ForLoop */ int timer = 100; // The higher the number, the slower the timing. void setup() { // use a for loop to initialize each pin as an output: for (int thisPin = 2; thisPin < 8; thisPin++) { pinMode(thisPin, OUTPUT); } } void loop() { // loop from the lowest pin to the highest: for (int thisPin = 2; thisPin < 8; thisPin++) { // turn the pin on: digitalWrite(thisPin, HIGH); delay(timer); // turn the pin off: digitalWrite(thisPin, LOW); } // loop from the highest pin to the lowest: for (int thisPin = 7; thisPin >= 2; thisPin--) { // turn the pin on: digitalWrite(thisPin, HIGH); delay(timer); // turn the pin off: digitalWrite(thisPin, LOW); } }
3. 반복문
먼저 setup 함수부터 보죠. 앞선 강좌에서와는 다르게 setup 안에 for 반복문이 나오면서 pinMode 함수를 호출하고 있습니다.
void setup() { // use a for loop to initialize each pin as an output: for (int thisPin = 2; thisPin < 8; thisPin++) { pinMode(thisPin, OUTPUT); } }
이건 6개의 아두이노 핀을 반복문을 이용해서 초기화하는 겁니다. for 반복문은 아래와 같은 형태로 사용합니다.
for( 변수를 선언하고 초기값을 지정; 이 조건에 부합하면 반복; 매 반복이 끝날때마다 하는 작업) { 반복할 작업 }
- ‘변수를 선언하고 초기값을 지정’하는 부분을 보죠. int thisPin = 2 라고 되어 있습니다. thisPin 이라는 변수를 선언하고 여기에 초기값 2를 줬습니다. 여기서 선언된 thisPin 변수는 for {} 중괄호 블럭 안에서만 유용한 변수입니다. for 반복문이 끝나면 저 변수는 사라져요.
- ‘이 조건에 부합하면 반복’하는 부분에 조건을 걸어둡니다. 여기서는 2번 핀부터 7번 핀까지 반복할거니까 thisPin < 8 이라고 조건을 걸었습니다. thisPin을 1씩 증가하면서 초기화 하면 2~7번 핀을 초기화 할 수 있겠죠.
- ‘반복이 끝날때마다 하는 작업’ 부분은 for {} 중괄호 안의 작업을 한번 처리할 때 마다 실행됩니다. 보통 사용된 변수의 값을 변화시킵니다. 여기서는 thisPin 을 1 증가시켜야겠죠. thisPin++ 이 그걸 의미합니다. 간편하기 적기 위해서 프로그래밍 할 때 쓰는 표현입니다. thisPin = thisPin + 1; 이걸 축약해서 쓰는 표현이죠.
이제 setup 안의 for 반복문이 하는 작업을 아시겠죠. 2부터 7까지 값을 하나씩 변화시키면서 숫자에 해당하는 핀을 pinMode 함수로 초기화하는 겁니다.
그럼 이제 loop 함수안에서 하는 작업도 어느정도 이해가 되실겁니다.
for (int thisPin = 2; thisPin < 8; thisPin++) { // turn the pin on: digitalWrite(thisPin, HIGH); delay(timer); // turn the pin off: digitalWrite(thisPin, LOW); }
loop 함수안에서 처음 나오는 for 반복문은 2번부터 7번 핀까지 차례대로 [5V 전압 출력 -> timer에 지정돈 시간만큼 잠시 대기 -> 0V 출력] 과정을 반복하는 겁니다. 2->7번 LED가 순서대로 켜지도록 하는거죠.
// loop from the highest pin to the lowest: for (int thisPin = 7; thisPin >= 2; thisPin--) { // turn the pin on: digitalWrite(thisPin, HIGH); delay(timer); // turn the pin off: digitalWrite(thisPin, LOW); }
loop 함수안에서 2번째로 등장하는 for 반복문도 비슷합니다. 다만 7번 핀부터 2번 핀까지 역순으로 on/off 과정을 반복하는 겁니다. 그러기 위해서 조건이 조금 다르게 쓰여졌습니다.
for (int thisPin = 7; thisPin >= 2; thisPin--)
초기화 할 때 thisPin 에 7을 대입해서 시작 LED를 바꿨고, 조건에서 thisPin 이 2보다 크거나 같다는 조건을 줬습니다. 조건을 thisPin > 1 이렇게 줘도 똑같은 결과가 나오겠지요. 그리고 1회 반복할 때마다 thisPin– 를 실행합니다. thisPin– 는 thisPin++ 처럼 값을 1 감소시키는 표현입니다. thisPin = thisPin – 1; 과 같은 표현입니다.
4. 실행 결과
코드가 정확히 작성되었다면 LED가 순서대로 켜지면서 왔다갔다 할겁니다.
# 강좌의 내용이 명확하지 않거나 이해가 힘든 부분이 있으시면 댓글로 말씀해 주세요. 해당 부분을 지속적으로 업데이트 하겠습니다.
=============================================================
이 문서는 작성자의 동의없이 개인적인 목적 외의 상업적인 목적으로 활용되어서는 안됩니다.
이 문서의 일부 혹은 전체를 수정, 삭제, 재배포 하여서는 안됩니다.
작성자 : GodsTale (godstale@hotmail.com)