아두이노를 위한 프로그래밍 기초 8 – 배열

이 문서는 아두이노 보드를 사용하기 위해 필요한 프로그래밍 기초 지식이 없는 분들을 위한 가이드 문서입니다. 따라서 이미 프로그래밍에 대한 경험이 있다면 이 강좌 시리즈는 넘어가셔도 좋습니다.

=============================================================

.

 

지난 강좌에서 반복문까지 살펴봤습니다. 이번 강좌에서는 지난 시간에 사용했던 예제의 회로를 그대로 이용하는 대신 소스코드만 조금 변경해서 배열에 대해 이해하는 시간입니다.

1. LED 옮겨가며 점멸하기 예제

지난 시간에 사용했던 회로를 그대로 사용하면 됩니다. 회로가 없으시다면 소스코드로 이해를 하시면 됩니다.

LED 6개를 똑같이 배치하고 각각의 + 라인을 아두이노의 6개 핀에 연결해줍니다. 2번~7번 핀을 사용.

이번 예제의 목표는 LED를 순서대로 켜는 것이 아니라 이리저리 옮겨가며 LED를 켜는 겁니다. 무작위로 옮겨가는 것은 아니고, 우리가 지정한 순서대로 옮겨가도록 할겁니다. 아래 처럼요

  • x번 핀 5v 출력 -> 잠시 대기 -> x번 핀 0V 출력
  • y번 핀 5v 출력 -> 잠시 대기 -> y번 핀 0V 출력
  • …..
  • z번 핀 5v 출력 -> 잠시 대기 -> z번 핀 0V 출력

이러면 빛이 무작위로 이동하는 것처럼 보이겠죠. 실제로는 우리가 지정한 순서이긴 하지만…

2. 예제 코드

/*
  Arrays
 
 Demonstrates the use of  an array to hold pin numbers
 in order to iterate over the pins in a sequence. 
 Lights multiple LEDs in sequence, then in reverse.
 
 Unlike the For Loop tutorial, where the pins have to be
 contiguous, here the pins can be in any random order.
 
 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/Array
 */

int timer = 100;           // The higher the number, the slower the timing.
int ledPins[] = { 2, 7, 4, 6, 5, 3 };  // an array of pin numbers to which LEDs are attached
int pinCount = 6;     // the number of pins (i.e. the length of the array)

void setup() {
  // the array elements are numbered from 0 to (pinCount - 1).
  // use a for loop to initialize each pin as an output:
  for (int thisPin = 0; thisPin < pinCount; thisPin++)  {
    pinMode(ledPins[thisPin], OUTPUT);      
  }
}

void loop() {
  // loop from the lowest pin to the highest:
  for (int thisPin = 0; thisPin < pinCount; thisPin++) { 
    // turn the pin on:
    digitalWrite(ledPins[thisPin], HIGH);   
    delay(timer);                  
    // turn the pin off:
    digitalWrite(ledPins[thisPin], LOW);    

  }

  // loop from the highest pin to the lowest:
  for (int thisPin = pinCount - 1; thisPin >= 0; thisPin--) { 
    // turn the pin on:
    digitalWrite(ledPins[thisPin], HIGH);
    delay(timer);
    // turn the pin off:
    digitalWrite(ledPins[thisPin], LOW);
  }
}

우리는 총 6개의 pin을 사용하는데, 우리가 사용할 핀 갯수를 pinCount 라는 전역변수에 저장해 두었습니다.  반복문에서 총 핀 갯수를 사용할 일이 자주 있어서 이렇게 전역 변수로 미리 저장해 둔겁니다.

3. 배열 선언

이전 강좌처럼 LED가 순서대로 켜지는 것이 아니므로 LED가 켜질 순서를 기억해 둬야 합니다. 즉 LED가 켜질 핀 번호를 순서대로 기억해 둬야 합니다. 아래처럼요.

int ledPins[] = { 2, 7, 4, 6, 5, 3 };  // an array of pin numbers to which LEDs are attached

변수종류  변수이름[n]  = { 값1, 값2, … , 값n };

위와 같이 선언하는 변수를 배열이라고 합니다. 일반적인 변수이름 뒤에 [] 배열 기호가 붙어있습니다. 이렇게 선언하면 n 개의 변수를 하나의 세트로 사용할 수 있습니다. 이름도 공유하구요.

이전 강좌에서 변수는 메모지 역할을 한다고 했습니다. 마찬가지로 배열도 메모지인데 우리가 지정한 갯수만큼 붙어있어서 하나의 이름으로 찾을 수 있는 메모지입니다. 그래서 변수이름 뒤에 몇 번째 메모인지를 나타내는 숫자를 덧붙여서 사용할 수 있습니다. 아래처럼요.

변수이름[0], 변수이름[1], … , 변수이름[n-1

프로그래밍 세계에서는 배열의 순서(index)를 나타낼 때 0부터 나타냅니다. 그래서 배열의 첫번째 변수(=메모)를 나타내는 숫자가 0번입니다. 만약 6개의 값을 담은 배열을 선언했다면 변수이름[0] ~ 변수이름[5] 까지 사용할 수 있는겁니다.

이제 위에 적힌 배열을 선언한 코드가 이해 되실 것 같습니다. 위 코드는 LED 를 점멸할 순서를 기억하기 위해 ledPins 라는 배열을 만들어서 점멸 순서대로 LED 핀 번호를 적어둔 겁니다. 따라서 ledPins[0] ~ ledPins[5] 에 우리가 지정한 LED 핀 번호가 들어갑니다

{2, 7, 4, 6, 5, 3}

4. 배열 사용 방법

이제 배열을 실제로 사용해서 LED를 켜는 작업을 하는 부분을 보겠습니다. 먼저 setup() 함수 안에서 디지털 핀들을 초기화를 해주는 부분입니다.

  for (int thisPin = 0; thisPin < pinCount; thisPin++)  {
    pinMode(ledPins[thisPin], OUTPUT);      
  }

for 반복문을 사용하는데 반복문 안에서 thisPin 이라는 변수를 사용해서 핀을 초기화 합니다. 작업이 한번 진행될 때마다 thisPin 값이 증가하도록 되어있고 pinCount 값보다 작으면 계속 반복하도록 되어 있습니다. 따라서 thisPin 이 0 일 때부터 thisPin 이 5 일 때까지 6번을 실행합니다.

pinMode() 함수를 사용해서 LED가 연결된 디지털 핀을 초기화 해야합니다. 이때 ledPins 라는 배열을 아래와 같이 사용합니다.

ledPins[thisPin]

이게 의미하는 건 ledPins 라는 배열에 순서대로 넣어둔 값 중, thisPin 에 해당하는 값을 사용하겠다는 겁니다. thisPin 이 반복문 안에서 0~5까지 변화하니까 ledPins[0] ~ ledPins[5] 에 저장된 값을 차례로 사용하겠죠. 따라서 {2, 7, 4, 6, 5, 3} 으로 저장한 값이 사용됩니다.

pinMode 함수안에서 ledPins 배열을 사용했으니 2, 7, 4, 6, 5, 3 번 핀이 순서대로 초기화 되겠네요.

loop() 함수 안에서 사용된 for 반복문에서도 마찬가지의 형태로 배열이 사용됩니다.

  for (int thisPin = pinCount - 1; thisPin >= 0; thisPin--) { 
    // turn the pin on:
    digitalWrite(ledPins[thisPin], HIGH);
    delay(timer);
    // turn the pin off:
    digitalWrite(ledPins[thisPin], LOW);
  }

ledPins[thisPin] 배열이 사용된 것은 같은데, 여기서는 digitalWrite 함수 안에서 사용되었을 뿐입니다. 따라서 우리가 배열에 저장한 핀 넘버 순서대로 LED 를 on/off 시키는거죠.

5. 실행 결과

코드가 정확히 작성되었다면 LED가 순서대로 켜지면서 왔다갔다 할겁니다.

 

# 강좌의 내용이 명확하지 않거나 이해가 힘든 부분이 있으시면 댓글로 말씀해 주세요. 해당 부분을 지속적으로 업데이트 하겠습니다.

=============================================================

이 문서는 작성자의 동의없이 개인적인 목적 외의 상업적인 목적으로 활용되어서는 안됩니다.

이 문서의 일부 혹은 전체를 수정, 삭제, 재배포 하여서는 안됩니다.

작성자 : GodsTale (godstale@hotmail.com)

 

You may also like...