Embedded Lecture/Arduino2017. 3. 12. 17:41


Arduino Uno 보드는 LED가 실장되어 있으며 이는 디지털 입출력 핀 13번에 연결되어 있습니다. 이 LED를 깜박이는 예제는 이미 아두이노 IDE에서 제공되고 있으며 '파일|예제'에서 'Blink'를 선택하여 불러올 수 있으며, 다양한 예제들은 여기서 확인할 수 있습니다.



읽어들인 소스 코드인 스케치 파일은 다음과 같습니다.


int led = 13;

void setup() {

    pinMode(led, OUTPUT);

}

void loop() {

    // turn the LED on (HIGH is the voltage level)

    digitalWrite(led, HIGH);

    delay(1000); // wait for a second

    // turn the LED off by making the voltage LOW

    digitalWrite(led, LOW); 

    delay(1000); // wait for a second

}


setup() 함수 내에서 pinMode() 함수는 첫 번째 인자로 핀의 번호를, 두 번째 인자는 입출력 모드를 지정하게 되는데, 입력이면 'INPUT'을 출력이면 'OUTPUT'을 설정하게 됩니다. 그러므로 pinMode(led, OUTPUT)는 13번 핀을 출력으로 사용하겠다는 의미입니다. 참고로 아두이노에서 제공하는 함수의 문법(Syntax)이나 인자(Parameter)에 대한 자세한 설명은 아두이노 홈페이지에서 확인할 수 있습니다.


https://www.arduino.cc/en/Reference/HomePage 


사실 전통적인 표준 라이브러리 AVR libc의 문법으로는 위의 pinMode 함수는 DDRD = 0b01000000; PORTD = 0b01000000; 이들 두 문장을 대체하게 됩니다. 아두이노에서 같은 기능을 하기 위해 고유 서브함수를 호출한 반면, 표준 라이브러리는 단순한 매크로(macro)들의 사용만으로 속도나 실행 크기면에서 우수하다는 것입니다. 하지만 표준 라이브러리는 ATmega328P에 대한 전문적인 지식이 요구되어 초보자에게 결코 쉽지 않다는 것입니다.


특히 속도의 측면에서 빠른 처리나 인터럽트 처리를 요구하는 장치를 동작시키는 경우에는 아두이노는 표준 라이브러리에 비해서 상당한 열쇠에 놓이게 됩니다. AVR 칩이 C 언어를 지원함에도 불구하고 아직도 어셈블러(Assembler)로 개발하는 경우가 있는데, 이것도 같은 이유에서라는 것입니다. 하지만 점차 MCU의 속도는 끊임없이 진화하고 리소스도 풍부해지기 때문에 크게 문제는 되지 않을 것입니다.


loop() 함수내에서 digitalWrite() 함수는 첫 번째 인자로 지정된 핀에, 두 번째 인자로 HIGH 혹은 LOW 값을 쓰는데 사용하는 함수로 digitalWrite(led, HIGH)는 이미 출력으로 지정된 13번 핀에 HIGH 값을 내보냄을 의미합니다. 입출력의 지정없이 이 함수를 사용할 수는 없으며 전원 전압이 5V이면 13번 핀은 5V의 전압이 인가되어 LED를 점등하게 됩니다.


또한 delay() 함수는 입력된 시간만큼 동작을 멈추는 용도로 사용되어 delay(1000)은 1000ms 동안 지연을 줄 목적으로 사용됩니다. 여기서 단위는 ms임을 주목해야 합니다.


결국 loop() 함수 내의 동작은 13번 핀을 점등하고 1s를 기다렸다가 다시 소등하고 1s를 기다리는 코드로, loop() 함수는 영원히 반복하게 되므로 끊임 없이 LED를 1초 간격으로 점등과 소등을 반복하게 됩니다,



'Embedded Lecture > Arduino' 카테고리의 다른 글

인터럽트와 volatile 지시자  (1) 2017.03.18
아두이노의 TWI(I2C) 통신  (0) 2017.03.18
아두이노의 시리얼 통신  (0) 2017.03.18
인터럽트의 처리(1)  (0) 2017.03.12
아두이노(Arduino) 코딩의 시작  (0) 2017.03.12
Posted by Nature & Life