[아두이노 초급] 4. LED(Blink)

이전 포스트까진 아두이노 보드와 아두이노 IDE에 대해 알아보았다.

이번에는 본격적으로 아두이노 보드를 동작시켜보자.

자, 본격적으로 아두이노 보드를 다루려고 하는데 사실 무작정 센서를 연결하고 전자소자를 연결하고 하는 것은 아직 아두이노에 익숙치 않은 상황에선 오히려 흥미를 식게 할 수 있다.

그래서 우리는 간단한 예제를 통해 아두이노 보드를 동작시켜보고 다음으로 다양한 전자소자나 센서를 연결해서 사용하는 식으로 진행을 해보자.

그럼 예제를 불러오자.

예제는 IDE의 메뉴바의 ‘파일’ 메뉴에서 예제를 선택하면 볼 수 있다.

여기는 다양한 예제들이 있는데 처음 나오는 1~11번까지의 예제는 기본 예제들에 해당하고 그 밑에 나오는 예제들은 내가 선택한 보드에서 사용할 수 있는 예제들이나 추가로 설치한 예제들이 표시되어진다.

이 말인 즉, 보드에 따라 활용할 수 있는 기능들의 차이가 있다는 뜻이다.

우리가 사용하는 아두이노 우노 보드는 별도로 특수한 예제가 존재하진 않지만 아두이노 레오나르도(Leonardo), 윤(Yun) 등 몇몇의 보드들은 그 보드에서만 사용할 수 있는 기능들이 있어서 그 기능에 대한 예제들이 존재한다.

그림을 보면 알 수 있지만 1~11번 예제 뒤로 보드 이름이 나오고 보드에 해당하는 예제가 나온다.

이전에는 각 보드에 사용할 수 있는 예제들만 표시되었지만, 요즘 나오는 최신 버전에서는 모든 예제가 다 나오고 있다.

그래서 만약 사용했을 때 그 보드에 해당되지 않는 예제는 동작하지 않는다.

대표적으로 Keyboard 예제가 있는데 이 예제를 아두이노 우노 보드에서 사용하려고 예제를 켠 다음 ‘확인’ 버튼을 누르면 오류가 나는 것을 볼 수 있다.

아무튼 요약하자면 1~11번까지는 모든 보드에서 사용가능한 예제지만 그 뒤로 나오는 예제는 보드에 따라서 동작하지 않는 예제도 존재한다라고 알면 되겠다.

다시 본론으로 돌아와서 우리가 사용할 예제는 아두이노의 가장 기본이 되는 예제인 ‘Blink’ 예제다.

코드 1 Blink
/*
  Blink

  Turns an LED on for one second, then off for one second, repeatedly.

  Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO
  it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to
  the correct LED pin independent of which board is used.
  If you want to know what pin the on-board LED is connected to on your Arduino
  model, check the Technical Specs of your board at:
  https://docs.arduino.cc/hardware/

  modified 8 May 2014
  by Scott Fitzgerald
  modified 2 Sep 2016
  by Arturo Guadalupi
  modified 8 Sep 2016
  by Colby Newman

  This example code is in the public domain.

  https://docs.arduino.cc/built-in-examples/basics/Blink/
*/

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  // change state of the LED by setting the pin to the HIGH voltage level
  delay(1000);                      // wait for a second
  digitalWrite(LED_BUILTIN, LOW);   // change state of the LED by setting the pin to the LOW voltage level
  delay(1000);                      // wait for a second
}

‘Blink’ 예제를 켜보면 코드 1과 같이 나타난다.

이 코드를 살펴보면 알겠지만 우리가 이전 포스트에서 이야기 했던 주석문이 많이 사용된 것을 알 수 있다.

주석문에 대해 다시 떠올려 보면 // 를 표시하면 뒤에 따라오는 한 줄을 주석으로 표현할 수 있고 /* */ 로 표시하면 /*과 */ 사이에 있는 모든 내용을 주석으로 표현할 수 있다.

‘Blink’ 예제에는 이 두 가지 스타일의 주석문이 모두 사용되었는데 처음 1~23번 줄까지는 영역을 통째로 /* */을 이용하여 주석 처리를 했고 나머지는 한 줄씩해서 각 코드의 설명을 주석으로 표현해 놓았다.

이 예제에 보이는 것처럼 보통 한 영역을 주석으로 표현할 때는 이 코드의 설명 같은 경우를 적는 경우가 많다.

여기도 이 예제의 동작 내용과 언제 누가 예제를 만들었는지 그리고 이 예제가 있는 홈페이지 주소가 적혀있다.

이것을 참고해서 우리도 다른 코드를 작성할 때 다음에 봐도 이 코드가 어떤 동작인지 알 수 있게 주석으로 내용을 적어두는 것도 좋을 것이다.

아무튼 다시 본론으로 돌아와서 이 코드를 다시 살펴볼건데 코드의 정확한 내용을 알기 위해서는 사실 주석문이 좀 거슬린다.

그러니 주석문을 지워보자.

코드 2 Blink – 주석제거
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  
  delay(1000);                      
  digitalWrite(LED_BUILTIN, LOW);   
  delay(1000);                     
}

이렇게 주석을 지우고 나면 코드가 사실 뭐 없다.

중복된 내용을 제거하고 보면 pinMode, digitalWrite, delay 이렇게 3종류의 명령어가 사용된 것을 알 수 있다.

그럼 이게 어떤 동작을 하는지 볼 수 있게 업로드 버튼을 눌러보자.

코드를 업로드하면 그림에 표시된 LED가 깜박이는 것을 볼 수 있다.

자, 그럼 코드를 살펴보자.

코드는 이전 포스트에서 이야기한 것처럼 setup과 loop 두 가지로 나뉘어져 있다.

이 부분에 대해 잘 기억나지 않는다면 이전 포스트를 다시 보고 오자.
( https://polnalab.com/arduino/basic/360/ )

먼저 setup 쪽을 살펴보자.

setup에는 한 줄의 코드만이 사용되었는데 그 코드가 pinMode다.

pinMode(Pin, Mode)

이 코드는 내가 사용하려고 하는 핀이 어떤 역할로 동작할지 설정해주는 코드로 Pin에는 내가 사용하려고 하는 데이터 핀 번호를, Mode에는 역할을 적게 된다.

이때 Mode는 출력 설정과 입력 설정이 있는데 만약 전압을 출력한다면 OUTPUT, 전압을 입력 받는다면 INPUT으로 설정해야 한다.

데이터 핀은 아두이노 보드에서 센서나 전자 소자를 연결할 수 있게 해둔 것으로 양 옆에 디지털 핀과 아날로그 핀으로 나뉘어 있다.

좀 더 상세한 내용은 이전 포스트를 참고하자.
( https://polnalab.com/arduino/basic/220/ )

그런데 지금 ‘Blink’ 예제를 다시 보면 Pin 자리에 위의 그림에 표시되어진 부분의 값이 아닌 LED_BUILTIN 이라는 내용이 있다.

이 LED_BUILTIN은 사실 최근에 바뀐 것이고 이전 IDE 버전에서는 숫자로 적혀있었다.

아마 아두이노 보드의 내장된 LED라는 느낌을 주기 위해 LED_BUILTIN이라는 이름으로 변경된 것 같다.

그럼 이 LED_BUILTIN이 원래 어떤 숫자였는지 알아보자.

이것을 알기 위해선 아까 지운 주석이 필요하다.

/*
  Blink

  Turns an LED on for one second, then off for one second, repeatedly.

  Most Arduinos have an on-board LED you can control. On the UNO, MEGA and ZERO
  it is attached to digital pin 13, on MKR1000 on pin 6. LED_BUILTIN is set to
  the correct LED pin independent of which board is used.

  If you want to know what pin the on-board LED is connected to on your Arduino
  model, check the Technical Specs of your board at:
  https://docs.arduino.cc/hardware/

  modified 8 May 2014
  by Scott Fitzgerald
  modified 2 Sep 2016
  by Arturo Guadalupi
  modified 8 Sep 2016
  by Colby Newman

  This example code is in the public domain.

  https://docs.arduino.cc/built-in-examples/basics/Blink/
*/

이 부분이 필요한 부분인데 여기서 굵은 부분을 보면 아두이노에는 내장형 LED가 있고 그 LED는 보드에 따라 다른 곳에 연결되어 있다고 적혀있다.

좀 더 자세히 보면 우리가 사용하는 우노 보드는 내장형 LED가 13번에 연결되어 있고 이게 보드마나 틀리기 때문에 LED_BUILTIN 이라고 설정했다고도 적혀 있다.

이 말인 즉, 지금 코드 2의 LED_BUILTIN은 숫자 13과 같다는 말이다.

그래서 현재 코드를 pinMode(13, OUTPUT)이라고 고쳐도 동일한 동작을 한다.

이걸 통해서 pinMode(LED_BUILTIN, OUTPUT)을 정리해보면 데이터 핀 13번을 출력 모드로 설정해달라라는 말이된다.

그리고 이어서 loop를 보면 digitalWrite라는 코드가 적혀있다.

digitalWrite(Pin, Voltage_level)

이 코드는 지정된 데이터 핀으로 전압을 출력하는 코드로 Pin에는 전압을 출력할 핀 번호를 적고 Voltage_level에는 전압을 출력할지 안할지를 적게된다.

전압을 출력하려면 HIGH라고 쓰고 아니라면 LOW라고 쓰는데 실제로 HIGH라고 쓰면 해당 데이터 핀으로 5V가 출력되고 LOW라고 쓰면 0V가 출력된다.

이렇게 두 가지 동작을 하고 있는데 이런 것을 디지털 동작 이라고 한다.

그래서 명령어의 이름도 디지털은 쓴다라는 의미로 digitalWrite라고 하고 HIGH LOW 값도 HIGH는 숫자 1, LOW는 숫자 0으로 대체해서 사용할 수도 있다.

참고로 이 명령어는 pinMode로 출력 설정을 한 데이터 핀에만 적용이 된다.

만약 출력 설정을 하지 않은 데이터 핀에 이 명령어를 사용하면 정상적으로 동작하지 않는 것을 볼 수 있다.

그리고 코드 2에선 HIGH와 LOW를 둘 다 사용하고 있는데 그 결과로 LED가 깜박이고 있는 것이다.

이제 마지막으로 남아있는 코드는 delay다

delay(Millisecond)

이 코드는 지정된 시간만큼 지연시키는 좀 더 제대로 말하면 멈추는 코드다.

이때 지정된 시간은 괄호안의 시간만큼 멈추게 되는데 이때 시간은 밀리초(ms) 단위다.

그래서 delay(1000)이면 1초 동안 멈추게 된다.

여기서 중요한 점은 멈춘다라는 것이다.

지정된 시간동안 보드가 동작하지 않고 멈춘다는 것인데 이게 지금은 전혀 문제가 되지 않지만 나중에 프로젝트를 하거나 센서를 여러개 사용하거나 할 때 문제가 되는 경우가 많다.

그런 경우에는 다른 방법을 사용해야 하지만 지금은 delay를 사용하면 멈춘다 정도만 기억하자.

자, 이렇게 각각의 명령어들에 대해 알아보았다.

이것을 합쳐서 코드를 하나씩 살펴보면

setup에선 13번으로 전기를 출력할 수 있게 출력 설정을 하고 loop에선 13번으로 5V를 출력하고 1초 기다리고 0V를 출력하고 1초 기다리고를 무한히 반복하게 된다.

이를 통해 전기를 공급 받은 1초간 LED가 켜지고 전기를 공급 받지못한 1초간 꺼지는 동작을 하고 있는 것이다.

그리고 여기서 한 발자국 더 나가면 지금 사용한 명령어들 pinMode, digitalWrite, delay와 같이 아두이노 보드를 제어하고 데이터를 처리하는 특정한 작업을 위해 만들어진 명령어 블록을 ‘함수‘라고 부른다.

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
error: Content is protected !!