Embedded Lecture/Arduino2017. 4. 11. 21:10


아두이노 라이브러리는 다른 언어와 마찬가지로 코드의 재사용성을 높혀 유지관리를 쉽게 만들어줍니다. 물론 상업용 업체에서는 코드를 컴파일하여 제공하므로써 우선 코드 암호화를 통한 보안 등에 더 관심을 갖을 수는 있지만, 아두이노(Arduino)나 리눅스(Linux)처럼 컴파일된 파일 혹은 실행 파일과 더불어 소스 코드도 제공하는 경우에는 사용자가 코드의 디버그(debug)와 같은 효율성 및 유지관리 측면에서 보다 촛점을 맞출 수 있습니다.


라이브러리(Library)는 기본적으로 사용자가 작성한 코드로 자주 사용하는 코드를 모듈화하여 추후에 쉽게 불러다 사용할 수 있도록 소스 코드 자체나, 컴파일하여 목적코드(object) 형태로 저장한 것입니다. 사실 사용자 뿐만 아니라 소프트웨어 환경제공자나 제조업체에 의해서 제공되는 경우가 많습니다. 이러한 라이브러리는 재사용이 가능한 루틴이나 함수 등으로 구성되며, 이 루틴이나 함수의 내부를 모르고도 설명만으로 누구나 헤더파일에 선언하여 컴파일 시 쉽게 가져다 사용할 수 있습니다.


여기서는 인터넷상에서 다운로드한 아두이노용 라이브러리를 설치하는 방법과 직접 라이브러리를 작성하는 방법에 대해서 설명합니다. 우선 Arduino IDE를 설치하면 {내문서}\Arduino\libraris 폴더가 생성되고, 여기에 다운로드 받은 라이브러리를 복사하거나 사용자가 직접 작성한 라이브러리를 저장합니다. 컴파일을 수행할 때 이 폴더는 자동으로 'include'되어서 여기에 있는 라이브러리들이 링크하게 됩니다.


라이브러리는 기본적으로 폴더 단위로 저장되어야 하는데, 예를 들어 'MyLib' 라는 이름(통상 라이브러리명은 대문자로 시작함)으로 라이브러리를 작성한다면, {내문서}\Arduino\libraris 폴더 밑에 MyLib라는 폴더가 있어야 하고, 이 폴더 밑에 MyLib.h 헤더 파일과 MyLib.cpp 파일이 있어야 합니다. 만일 예제 파일을 제공하고 싶다면 별도의 example 폴더 밑에 예제 파일의 이름과 같은 폴더를 두고 그 밑에 .ino 파일을 위치해 두어야 합니다. 이와 같은 폴더 구조를 유지하는 것이 다수의 사용자들에게 통일되고 익숙하기 때문입니다.



통상 라이브러리는 클래스나 변수 등을 선언한 헤더 파일(*.h)과 클래스 멤버함수의 정의부가 있는 *.cpp 파일로 나뉩니다. 그리고 헤더 파일에는 MyLib 클래스가 선언되어 있어야 합니다. 보통은 헤더 파일과 *.cpp 파일로 구분되지만 모든 선언과 정의를 헤더 파일에 둘 수도 있습니다만, 헤더 파일에는 클래스의 선언부를 작성하고 그것을 구현한 *.cpp 파일을 별도로 두는 것이 더 일반적이고 바람직하다는 것입니다. 이렇게 구성하면 이 라이브러리를 사용하는 스케치 파일에서는 헤더 파일만 include 해서 사용할 수 있고, 여러 곳에서 중복해서 사용할 경우에도 헤더 파일만 포함하면 되기 때문입니다.


아두이노 홈페이지에서 다양한 아두이노 라이브러리를 제공하고 있습니다. 사용자는 여기에서 필요한 라이브러리를 다운로드 받아서 설치할 수 있습니다. 예를 들어 OneWire 라는 라이브러리를 다운로드 받았다고 가정하면, 다운로드 폴더에 OneWire.zip 파일이 다운로드 되어 있을 것입니다. 이 압축파일에는 OneWire.h, OneWire.cpp 파일이 들어 있습니다. 이 경우 이 압축파일을 이용하여 바로 사용자 라이브러리 폴더에 복사할 수 있는데 다음과 같이 'Sketch>Include library > Add .ZIP Library' 메뉴를 이용하여 압축파일을 선택해 주면 됩니다.


아두이노 라이브러리


이 경우에, OneWire.zip 파일을 선택하면 자동으로 사용자 라이브러리 폴더에 압축이 해제되서 복사하게 됩니다. 만일에 인터넷 상에서 특정 라이브러리의 특정 버젼을 필요로 하는 경우에는 사용자가 직접 압축을 해제한 후에 필요한 폴더 혹은 파일만을 사용자 라이브러리 폴더에 수동으로 복사해도 무방하다는 것입니다.



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

인터럽트의 처리(2)  (0) 2017.05.08
초음파 센서를 이용한 거리 측정 예제  (0) 2017.04.16
아날로그 출력(PWM)  (0) 2017.03.20
아날로그 입력 및 온도계 예제  (0) 2017.03.19
아날로그 입력  (0) 2017.03.18
Posted by Nature & Life
Embedded Lecture/Arduino2017. 3. 19. 10:07


아날로그 입력 핀에 온도 센서를 연결하여 실시간으로 Arduino IDE 환경의 PC 모니터링 창에 실시간으로 현재의 온도를 일정 시간 간격으로 보여주는 예제입니다. 사용할 온도 센서는 LM35-DZ인데, 이는 3단자 소자로 전원공급 단자, GND 그리고 출력단자로 구성되며 제조사가 제공하는 간단한 응용회로는 다음과 같습니다.


 


이 소자는 0~100˚C를 측정할 수 있는 센서로 5V의 전원전압을 공급하면 섭씨 1˚C 변화에 10mV의 전압을 출력합니다. 따라서 현재 온도가 섭씨 100˚C라면 출력전압은 100˚C*10mV=1V가 됩니다. 결국 온도 센서는 LM35-DZ는 0~100˚C 사이의 섭씨 온도 변화에 대해서 비례적으로 0~1V의 출력전압을 내보내게 됩니다.


void setup() {

    Serial.begin(9600);

}


void loop() {

    Serial.println(getTemp());

    delay(1000); // 1s에 시간지연을 줍니다.

}


float getTemp() {

    short sVal = analogRead(A0); // Default 모드로 최대 5V를 1024 레벨의 값으로 읽습니다.

    float voltage = sVal*5.0/1024; // 실제로 읽어드린 아날로그 값으로 변환합니다.

    return voltage*100; // 섭씨 온도로 환산하여 반환합니다.

}


위 코드는 결국 온도 센서를 이용하여 매 1s마다 측정된 섭씨 온도를 Arduino IDE 환경의 PC 모니터 창에 지속적으로 보여주게 됩니다.


<1초마다 온도를 감지하여 표시하는 결과 화면>


만일 ADC의 기준 전압으로 내부 전압인 1.1V를 사용한다면 분해능(resolution)은 약 5배 정도 개선되는 효과를 얻을 수 있으므로 위의 코드를 기준 전압을 내부 전압으로 사용하는 코드로 수정하였습니다. 단, 온도 센서는 100˚C까지만 유효하고 따라서 센서의 최대 전압은 1V까지만 유효하게 됩니다.


#define SUPPLY_VOLTAGE 1.1


void setup() {

    Serial.begin(9600);

    analogReference(INTERNAL); // ADC의 기준 전압을 내부 전압 1.1V로 사용함을 지정합니다.

}


void loop() {

    Serial.println(getTemp());

    delay(1000);

}


float getTemp() {

    short sVal = analogRead(A0);

    float voltage = sVal*SUPPLY_VOLTAGE/1024;

    return voltage*100;

}



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

아두이노 라이브러리의 설치  (0) 2017.04.11
아날로그 출력(PWM)  (0) 2017.03.20
아날로그 입력  (0) 2017.03.18
인터럽트와 volatile 지시자  (1) 2017.03.18
아두이노의 TWI(I2C) 통신  (0) 2017.03.18
Posted by Nature & Life
Embedded Lecture/Arduino2017. 3. 12. 01:12


아두이노(Arduino) 코딩(coding)을 위해서 아두이노 통합 환경 즉, IDE(Integrated development envirionment)를 다음의 링크에서 사용자의 OS 환경에 맞게 설치하여 합니다.


https://www.arduino.cc/en/Main/Software


사실 IDE에는 2가지가 존재합니다. 첫번째는 사용자 PC에 직접 설치하는 전통적 환경이며, 두번째는 Arduino Web Editor으로 온라인 버젼입니다. 일반적인 설치 버젼은 아두이노가 업데이트 되면 업데이트 작업이 매번 필요하지만, Web Editor 버젼은 항상 아두이노 보드의 모든 라이브러리나 지원 사항을 포함하여 최신 버젼을 유지하고 클라우드에 스케치(sketch)를 저장하게 됩니다. 여기서 스케치는 자신이 코딩한 소스 파일을 의미합니다.


이외에도 사용자의 로컬 PC에서 설치 버젼을 사용시 빠른 속도와 편의기능 등이 있으에도 불구하고 온라인 버젼이 출시되는 이유는 여러 사람이 코딩이 함께 하는 협업에 유리하고 자신의 작성한 코드나 라이브러리를 공유할 수 있으며, 이러한 코드를 효율적으로 안전하게 관리할 수 있기 때문이라는 것입니다.



이는 아두이노 IDE의 첫 화면이며 여기서 프로그램의 코딩과 컴파일(compile) 그리고 아두이노 보드가 PC에 USB를 통해서 제대로 연결되었다면 아두이노 보드로의 다운로드 까지 가능하게 됩니다. 아두이노 보드를 PC에 연결하려면, USB로 아두이노 보드와 연결하고 IDE를 실행한 다음, 메뉴에서 '도구|보드'에 자신이 연결한 아두이노 보드의 종류를 선택하고, '도구|시리얼 포트'에 가상 시리얼 포트의 번호를 선택합니다. 참고로 아두이노 포트 번호는 Windows의 경우 장치관리자에서 확인할 수 있습니다.



위의 아두이노 IDE의 첫 화면에서 아래와 같이 아두이도 코딩의 프로토타입(prototype)을 보여줍니다. 사실 사용자가 이마저도 직접 써야 하지만, 아두이노는 친절하게 반드시 있어야 할 코드는 미리 써주었다는 것입니다. C 언어에 익숙한 사용자라면 프로그램은 반드시 main() 함수로 시작해야 한다고 알고 있는데, 이는 없는 것이 아니고 아두이노 IDE가 사용자 편의를 위해서 내부적으로 처리하게끔 하였다는 것입니다.


void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

일반적인 C 프로그램과 달리 아두이노 하드웨어 프로그램은 위의 2가지 함수인 setup()과 loop()가 반드시 필요합니다. 코딩이란 사용자가 이들 함수를 기반으로 새로운 코드나 함수를 삽입하여 원하는 기능이나 동작을 구현하는 과정이라는 것입니다. setup() 함수는 아두이노 보드의 MCU가 처음 시작할 때 단 한번 실행됩니다. loop() 함수는 setup() 함수가 실행된 이후에 영원히 반복하게 됩니다. 이런 무한 반복을 하드웨어적으로 멈추게 하는 것은 아두이노 MCU의 'RESET' 버튼을 누르는 것인데, 이때 하드웨어는 다시 초기화되고 처음 setup() 함수부터 실행하게 됩니다.





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

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


아두이노(Arduino)가 오픈 소스 플랫폼으로 자리잡은 이유는 AVR 칩이 제공하는 Self-programming 기능으로 거슬러 올라갑니다. Self-programming 기능이란 칩의 퓨즈를 적절히 설정함으로써 부팅시 Application 영역이 아닌 Boot 영역으로 시작 지점이 변경된다는 것입니다.



한편, AVR 칩은 추가적인 하드웨어 구성 없이 USART나 TWI, SPI 등으로 통신이 가능한데, 칩이 Boot 영역에서 수신된 데이터를 감지하고 Application 영역을 변경할 수 있다는 것입니다. 이러한 기능은 3세대 AVR 칩에서 등장하여 펌웨어의 유지 및 보수 목적으로 특히 가혹한 원격지에서 펌웨어 업그레이드에 유연성을 주기 위함이었습니다.


따라서 이러한 기능이 가능하게끔 작성된 Bootloader를 최초 한번 JTAG이나 ISP를 이용하여 펌웨어를 프로그래밍을 하면 아두이노는 그 다음부터 ISP 없이 USART로 프로그램의 간단히 업로드가 가능하게 됩니다. 결국 아두이노 보드는 아래 회로도에서와 같이 별도의 ATmega16U2 칩을 이용해 USB로 데이터를 송수신하고, 이를 다시 ATmega328 칩에 USART 규격으로 통신하는 구조를 가집니다.



요약하면 아두이노 IDE 환경은 AVR 칩에 최초 Bootloader를 탑재하여 PC의 USB 포트로 C 코드인 스케치(Sketch) 파일을 컴파일하고 이를 아두이노 보드로 추가의 하드웨어 없이 전송하여 쉽고 빠른 개발환경을 제공한다는 것입니다. 게다가 아두이노 IDE 환경에서 함께 제공하는 Serial Monitor를 이용해서 클릭 한번으로 그 결과를 바로 확인할 수 있다는 장점을 가집니다.





Posted by Nature & Life