레이블이 아두이노인 게시물을 표시합니다. 모든 게시물 표시
레이블이 아두이노인 게시물을 표시합니다. 모든 게시물 표시

2016년 10월 3일 월요일

아두이노에서 HC-06 다루기

HC-06은 Bluetooth SPP 통신을 위한 장치입니다.
HC-06

HC-06의 Pin은 다음과 같이 구성되어 있습니다.
  • VCC: 전원(+) 핀
  • GND: 접지(-) 핀
  • TX: 데이터 송신 핀
  • RX: 데이터 수신 핀
주의할 점은 HC-06은 2가지 타입이 있는데, 데이터 송수신 핀의 전압에 따라 3.3V와 5V 타입으로 나뉩니다. 자신이 갖고 있는 HC-06 모듈이 어떤 타입인지 잘 알고 있어야 합니다.
HC-06 3.3V 타입

HC-06 5V 타입

아두이노 Uno는 5V로 부품을 제어 하기때문에 HC-06 5V 타입은 그대로 연결해도 되지만, HC-06 3.3v 타입은 전압을 맞춰줘야만 사용할 수 있습니다.
3.3v 전압을 맞추기 위해서 사용하는 회로는 전압 분배(Voltage Divider) 회로입니다.
전압 분배 회로

R1과 R2의 크기를 1:2 비율로 맞춘다면 공식에 의해 5 * (2/3) = 3.33의 계산이 이루어집니다. 따라서, HC-06 3.3v 타입은 전압 분배 회로와 같이 사용해야 합니다.

아두이노 보드는 외부 장치와 통신할 수 있는 UART를 1개만 보유하고 있습니다. 이것은 USB에 연결되어 있어서 PC와 통신할때 사용합니다.
만약, HC-06을 UART에 연결하면 USB통신을 할 수 없습니다.
따라서, HC-06을 연결하여 USB 통신을 포기하던가 아니면 HC-06과의 연결을 선택할 수 있도록 만들어서 USB와 HC-06을 번갈아 사용해야 합니다.

아두이노에는 UART가 부족할 때, UART 기능을 만들 수 있는 유용한 라이브러리가 있습니다.
이것의 이름은 SoftwareSerial이며 이것을 사용하면 UART를 추가할 수 있습니다.
많은 아두이노 HC-06 예제를 보면 SoftwareSerial을 이용해서 통신을 하는 것을 볼 수 있습니다.
실제 UART를 이용한 통신 소스와 SoftwareSerial을 이용한 통신 소스를 비교해보면 그 사용법이 유사한 것을 알 수 있습니다.

<실제 UART 통신 소스>
void setup()
{
    Serial.begin(9600);
}

void loop()
{
    if(Serial.available() > 0)
    {
        char data = Serial.read();
        Serial.write(data);
    }
}


<SoftwareSerial 통신 소스>
#include<SoftwareSerial.h>

SoftwareSerial softSerial(10, 11);

void setup()
{
    softSerial.begin(9600);
}

void loop()
{
    if(softSerial.available() > 0)
    {
        char data = softSerial.read();
        softSerial.write(data);
    }
}

차이점은 Serial과 달리 SoftwareSerial은 TX, RX에 대한 핀 번호가 필요하다는 것입니다. 그 이유는 UART를 사용하는 Serial은 TX, RX 핀 번호가 고정되어 있지만, SoftwareSerial은 아무 핀이나 사용할 수 있기때문에 여러분이 정해줘야 한다는 것입니다.
이 이유로 SoftwareSerial을 통한 HC-06의 아두이노 연결 회로는 다음과 같습니다.
HC-06 3.3v 타입 연결

HC-06 5v 타입 연결

아두이노 보드와 HC-06이 시리얼 통신을 하기 위해서 가장 중요한 것은 통신 속도를 맞추는 것입니다. 시리얼 통신에서 통신 속도는 보레이트(Baudrate)라고 부르며, 아무 숫자나 사용하는 것이 아니고 규격이 정해져있습니다.
  • 4800bps
  • 9600bps
  • 19200bps
  • 38400bps
  • 57600bps
  • 115200bps
이 중에 골라서 사용해야 하는데, 값이 클수록 고속 통신이기에 주고받을 수 있는 데이터 양이 많아집니다. 문제는 아두이노 보드에서 보레이트는 스케치 작성을 통해 설정할 수 있지만, HC-06은 그렇지 못하다는 것입니다.
HC-06의 보레이트를 변경하기 위해서는 다른 방법을 사용해야 합니다.
HC-06은 통신에 필요한 설정을 위해 AT Command라는 방식을 사용합니다.
이것은 HC-06의 TX, RX선을 사용해서 AT+데이터라는 특별한 형식으로 정보를 보내주면 필요한 설정을 할 수 있는 방식입니다.
AT Command 사용 방법은 인터넷을 통해 쉽게 찾을 수 있는데, 여기서는 자주 사용하는 몇 가지만 소개하겠습니다.
AT CommnadResponseFunction
ATOKHC-06이 연결되었는지 확인
AT+NAMEOOOOKsetname블루투스 장치 검색 시 나타나는 이름 설정
AT+BAUD4OK9600보레이트를 9600bps로 설정
AT+BAUD5OK19200보레이트를 19200bps로 설정
AT+BAUD6OK38400보레이트를 38400bps로 설정
AT+BAUD7OK57600보레이트를 57600bps로 설정
AT+BAUD8OK115200보레이트를 115200bps로 설정

이 명령어를 HC-06에 전달하는 방법은 2가지 입니다.
  • 아두이노 스케치 코드로 전달한다.
  • 아두이노 시리얼 모니터를 이용해서 전달한다.

아두이노 스케치 코드로 전달하는 예는 아래와 같습니다.


void setup()
{
    Serial.begin(9600);
    Serial.write("AT+NAMEmyHC-06"); // Change name to "myHC-06"
}

아두이노 시리얼 모니터는 아두이노 UART를 통해 사용자와 정보를 주고받을 수 있는 유틸리티이며 Arduino IDE에 포함되어있습니다.
시리얼 모니터를 통해 아두이노 보드 상태를 알 수 있다.

시리얼 모니터를 통해 AT Command를 전달하려면 아두이노 스케치가 중간에서 역할을 해줘야 합니다.
다음 스케치 소스는 시리얼 모니터를 통해 HC-06에 AT Command를 전달할 수 있게 해줍니다.

#include<SoftwareSerial.h>

SoftwareSerial softSerial(10, 11);

void setup()
{
    Serial.begin(9600);
    softSerial.begin(9600);
}

void loop()
{
    while(Serial.available() > 0)
    {
        char command = Serial.read();
        softSerial.write(command);
    }

    while(softSerial.available() > 0)
    {
        char response = softSerial.read();
        Serial.write(response);
    }
}


마지막으로 다룰 내용은 고속 통신 방법에 관한 것입니다.
HC-06은 115200bps까지 통신 속도를 올릴 수 있습니다. 물론, 이 통신 속도는 앞에서 언급한 AT Command를 이용해서 설정해야 합니다.
앞에서는 SoftwareSerial을 이용해서 아두이노 보드와 HC-06이 통신하는 방법을 설명했는데, SoftwareSerial은 높은 보레이트에서 안정적이지 않아서 통신이 잘 되지 않습니다. 알려진바로는 9600bps 이상을 넘어가면 통신이 되지 않는다고 합니다.
따라서, SoftwareSerial을 사용할 때는 9600bps로 설정할 것을 권장드립니다.
만약, 그 이상의 보레이트를 원하는 경우는 UART에 연결해서 사용해야 합니다.
하지만, HC-06 3.3v 타입의 경우는 전압 분배 회로를 사용한다해도 UART 연결 시 통신이 잘 되지 않을 수 있습니다.
그 이유는 고속 통신 시에는 정보 손실을 최소화하기 위한 부가 회로들이 필요한데, 전압 분배 회로만으로는 해결되지 않기 때문입니다.
이 문제는 아주 전문적인 내용이기때문에 아두이노에서 해결하는 것은 맞지 않습니다.
따라서, 되도록이면 HC-06 5V 타입을 사용할 것을 권장합니다.



2016년 9월 18일 일요일

아두이노 I2C통신

I2C(Inter Integrated Circuit)는 대표적인 칩간 통신 규격으로 필립스에서 개발하여 임베디드 시스템 개발 시 널리 사용되고 있습니다.
아두이노에서도 이 I2C를 사용하여 부품을 제어할 수 있습니다.
아두이노에서 기초적인 제어 방식은 다음과 같습니다.
  • Digital 핀을 이용해서 On/Off할 수 있다.
  • Digital 핀을 이용해서 스위치 등의 상태를 확인할 수 있다.
  • PWM 핀을 이용해서 전기 출력을 조절할 수 있다.
  • Analog 핀을 이용해서 센서의 상태를 확인할 수 있다.
이것만으로도 할 수 있는 것은 많지만, 더 복잡한 기능을 수행하려면 턱없이 부족합니다. 하드웨어에서 복잡한 기능을 효과적으로 구현하는 방법은 바로 IC로 만드는 것입니다.
하드웨어는 필요한 기능을 IC로 만들 수 있다.

이렇게 만들어진 IC로 아두이노에서 제어하려면 Digital/Analog 핀만으로는 다루기 어렵습니다. 그래서, 통신이라는 것이 필요하고 통신을 위해 프로토콜(통신 방식)을 사용합니다.
I2C는 바로 IC로 만들어진 기능을 쉽게 사용하기 위한 대표적인 방법입니다.
I2C는 버스(Bus)라 불리는 하나의 선으로 여러 장치를 효과적으로 제어할 수 있는 기능을 제공합니다.
I2C 버스의 개념

아두이노에서는 I2C통신을 지원하는 부품을 여러 개 연결해서 사용할 수 있다는 뜻입니다. 버스 통신은 하나의 선을 여러 장치가 사용하므로 충돌없이 통신할 수 있도록 다음의 개념이 필요합니다.
  • Master: 통신을 시작할 수 있는 권한이 있다. 반드시 한개만 존재해야 한다.
  • Slave: Master의 요구에 응답만 할 수 있다.
  • Address: 자신을 구별할 일종의 ID이다.
I2C Master/Slave 개념

아두이노에서 I2C를 사용하기 위해서는 2개의 핀이 필요합니다.
  • SDA: 아두이노 Uno에서는 A4 핀이 이 역할을 한다.
  • SCK: 아두이노 Uno에서는 A5 핀이 이 역할을 한다.
아두이노에서 I2C 핀

아두이노 보드의 종류마다 SDA/SCK 역할을 하는 핀이 다르므로 잘 확인해야 합니다.

하드웨어 연결을 잘 했다면, I2C 통신을 위해 스케치를 작성해야 합니다.
아두이노는 I2C 통신을 위해 Wire라 부르는 라이브러리를 제공합니다. (Wire 라이브러리 사용법)

<아두이노 보드가 Master역할을 하는 경우>
#include <Wire.h> // using Wire Library

void setup()
{
    Wire.begin(); // Start I2C Master
}

void loop()
{
    // Write data to Slave
    Wire.beginTransmission(3); // Slave address is 3
    Wire.write(data);
    Wire.endTransmission();


    // Read data from Slave
    Wire.requestFrom(3, 6);  // Slave address is 3, Data length is 6
    while(Wire.available())  // Wait data until completed
    {
         Wire.read();    // Get data from buffer
    }
}


<아두이노 보드가 Slave역할을 하는 경우>
#include <Wire.h> // using Wire Library

void setup()
{
    Wire.begin(5); // Set address of Slave
    Wire.onReceive(OnReceived);  // Set callback for writing of Master
    Wire.onRequest(OnRequested);  // Set callback for requesting of Master
}

void OnReceived(int numByte)
{
    // When received from Master
    while(Wire.available())  // Wait data until completed
    {
         Wire.read();    // Get data from buffer
    }  
}

void OnRequested()
{
    // When requested from Master
    Wire.write(data);
}


실제로 I2C를 통해 어떤 데이터를 주고 받을 지에 대해서는 해당 부품의 데이터시트(Data Sheet)를 확인해야 합니다.


블루투스와 아두이노

블루투스는 대표적인 근거리 무선 통신 방식입니다. 근거리 무선 통신을 전문적인 용어로 PAN(Personal Area Network)이라 부릅니다.

스마트 폰과 같은 개인용 무선 기기들이 블루투스를 채택하면서 블루투스는 자연스럽게 근거리 무선 통신 표준으로 자리 잡았습니다.
많은 기기들이 블루투스를 무선 통신 규격으로 사용한다.

이 포스트에서는 블루투스를 개발에 활용하기 위해 필요한 상식을 소개하겠습니다.
블루투스에는 프로파일(Profile)이라 부르는 통신 프로토콜 규격이 있습니다. 프로파일의 역할은 하드웨어 제조사들이 통신 소프트웨어 개발 없이 규격에 맞추기만 하면 바로 사용할 수 있도록 만들어줍니다. 예를 들어 블루투스 이어폰 제품이 많이 나온 것은 블루투스에 핸즈 프리와 통화 및 오디오 전송과 관련된 프로파일이 있기 때문입니다.

블루투스에 포함된 프로파일 중 SPP(Serial Port Profile)은 새로운 장치를 개발하는 사람들이 많이 사용하는 프로파일 입니다. SPP는 시리얼 포트 프로파일로써 시리얼 통신과 비슷한 방식으로 블루투스를 무선 통신으로 사용할 수 있습니다.
아두이노 무선 통신은 대부분 블루투스 SPP를 이용한 것이다.

블루투스 SPP를 지원하면서 아두이노에서 널리 쓰이는 모듈은 HC-06입니다.
HC-06

아두이노에서 블루투스 SPP를 사용하다면 관련된 많은 자료와 필요한 부품을 쉽게 구할 수 있습니다.
하지만, 블루투스 SPP는 다음과 같은 어려움을 갖고 있습니다.
  • 블루투스 4.0부터는 SPP를 더이상 지원하지 않습니다.
  • iOS에서는 SPP를 사용할 수 없습니다.

블루투스는 규격을 점차적으로 발전시켜왔는데, 4.0부터 IoT의 대표적 통신 솔루션이 된다는 목표를 두고 큰 변화를 취했습니다.
  • 기존의 1:1 연결 방식에서 1:N 연결을 지원한다.
  • 연결의 절차를 간소화하고 빠르게 만들었다. (패어링 개념을 없앴다.)
  • 전력 소모를 줄였다. (Low Energy 실현)
  • 프로파일의 자유도를 높였다.
이런 변화로 인해서 블루투스 4.0은 이전까지의 블루투스와 다르다는 점을 강조하기 위해 조금 다른 명칭을 사용했는데, BLE(Bluetooth Low Energy) 혹은 블루투스 스마트라는 이름으로 알려지기 시작했습니다.

더군다나 iOS의 경우 기존 블루투스의 경우 자체 규격을 받지 않으면 지원하지 않는 등의 폐쇄적인 정책을 취했는데, 블루투스 4.0은 자체 규격없이 그대로 받아들이기 시작했다는 것입니다.

겉으로 볼 때는 블루투스 4.0이 되면서 아두이노와 같은 사용자 장치 개발에 아주 좋아졌다고 보입니다.
  • 이제 iOS 장치와 무선 통신을 할 수 있게 되었다.
  • 기존에 아두이노 보드 1대만 연결했는데, 여러 대를 연결할 수 있게 되었다.
  • 저 전력으로 인해 전원 공급이 수월해졌다.
위와 같은 장점이 있는 반면에 생각치도 못한 다른 문제가 발생했습니다. 그것은 바로 블루투스 SPP를 더 이상 지원하지 않는다는 것입니다.
블루투스 4.0은 다양한 장치를 위해 프로파일의 자유도를 높이면서 SPP의 필요성을 느끼지 못하고 제거했습니다. 프로파일의 장점은 소프트웨어 개발 없이 하드웨어를 만들 수 있는 것인데, SPP가 사라지면서 아두이노를 이용해서 블루투스 무선 통신을 하려는 경우 직접 블루투스 프로파일을 개발해야 합니다.
물론, 블루투스 4.0에서 IoT 장치를 위한 새로운 프로파일들이 등장했습니다.
하지만, 기존 SPP와 같이 사용하기에는 어려운 점이 많습니다.
이런 문제로 블루투스 4.0이 나왔지만, 아두이노에서는 여전히 블루투스 SPP가 활용되고 있습니다.
블루투스 4.0 통신을 할 수 있는 아두이노용 부품들이 개발되어 판매되고 있지만, 그에 상대되는 앱(App)을 만들기 어려워서 테스트용으로 배포된 앱으로 실험하는 정도에 그치고 있습니다.
아두이노용으로 많이 사용되는 블루투스 4.0 모듈인 HM-10의 경우 SPP와 비슷한 프로파일을 제공하고 있습니다.
아두이노용 블루투스 4.0 모듈인 HM-10

블루투스 4.0을 테스트할 수 있는 앱이 많이 있다.

아두이노에서 무선 통신에 대한 관심이 높아지면서 블루투스 활용에 대해서 많은 연구가 이루어졌습니다. 블루투스를 활용하려면 반드시 앱을 제작해야 하는데, 아두이노에 비해서 앱 개발 환경은 아직 초보자들에게 쉽지 않습니다.
Android Studio 모습

안드로이드 앱 개발에 많이 사용되는 Android Studio의 경우 초보자들이 다루기에 매우 어렵습니다. 임베디드 개발 환경이 아두이노가 나오면서 대중화되었듯이 앱 개발 환경도 대중화되기 위해서는 뭔가 혁신이 필요해 보입니다.


2016년 9월 16일 금요일

전원 공급(Power Supply)

전자 장치가 작동하기 위해서는 전원이 필요합니다.
이 전원은 AC와 DC로 방식을 나눌 수 있습니다.
AC(Alternating Current)는 우리말로 교류 전원이라 불리고, 주로 집에 있는 전기 콘센트가 이와 같은 방식을 사용합니다.
AC 전원 공급 장치

AC는 아주 먼 거리에 전기를 공급할 때 유리하기에 발전소로부터 집까지 전달할 때 많이 사용하는 방식입니다.
DC(Direct Current)는 우리말로 직류 전원이라 불리고 주로 전자 장치들이 이 방식의 전원을 사용합니다. 따라서, AC를 DC로 바꿀 수 있는 장치가 필요한데, 이것을 아답터(Adaptor)라 부릅니다.
AC를 DC로 변환하는 아답터

대부분의 전자 장치는 이 아답터를 사용하거나 내장하고 있습니다.
DC 전원은 전압과 전류로 그 용량을 표현합니다. 예를 들면 12V, 1000mA와 같은 방식입니다.
전기적 힘은 와트(Watt)로 표현하는데, 이것은 전압 x 전류로써 12V, 1A는 12W가 됩니다. 이 뜻은 12V로 회로를 사용할 때 최대 1A까지 공급할 수 있다는 의미입니다.
전원 공급 장치를 선택할 때는 이 와트를 정확하게 알고 결정해야 문제없이 사용할 수 있습니다.

아두이노 보드는 전원 공급을 PC의 USB로 사용합니다.
USB는 한 포트 당 5V, 200mA이므로 5 x 0.2 = 1W가 됩니다.
여러분의 회로에서 필요로 하는 와트가 이보다 작다면 문제되지 않지만, 크다면 USB 포트에 무리를 주어 망가질 수 있음을 주의해야 합니다.

아두이노 보드는 외부 전원을 사용할 수 있는 회로를 내장하고 있습니다. 이 회로는 AC를 DC로 변환하는 아답터가 아니고 5V를 안정적으로 공급할 수 있는 레귤레이터(Regulator) 회로를 갖고 있습니다.
레귤레이터의 역할은 필요로 하는 전압보다 큰 전압이 공급되어도 안정적으로 필요한 전압을 공급합니다.
레귤레이터 부품

아두이노 보드에 이 레귤레이터 회로가 내장되어있기에 6 ~ 20V까지 DC 전원을 공급해도 문제없이 사용할 수 있습니다. (권장 전압은 7 ~ 12V입니다.)
아두이노 보드에 아답터를 연결해서 사용할 수 있다.

아두이노 보드에 배터리를 연결하여 사용할 수 있다.

아두이노 보드에서 사용되는 레귤레이터의 용량은 Uno 보드의 경우 제조사마다 다르지만 대략적으로 5W 정도됩니다. (5V 인가 시 최대 1A까지 사용할 수 있다는 뜻)
만약, 10V 아답터를 사용했다면 0.5A까지 아두이노 보드에서 사용할 수 있다는 뜻입니다.
따라서, 여러분은 아두이노 보드에 회로 구현 시 회로에서 사용되는 용량을 정확히 알고 이에 맞는 전원을 공급해야 문제없이 작동합니다.

그렇다면, 어떤 것들이 많은 전류를 필요로 하는 부품일까요?
주로 모터와 큰 조명 장치가 동작하는데 많은 전류를 필요로 합니다.
큰 조명 장치는 큰 전류를 필요로 합니다.

만약, 아두이노 보드 용량을 넘어서는 전자 장치를 제어하고자 하는 경우 별도의 전원 공급 회로가 필요합니다. 아두이노 보드는 이런 회로를 사용할 수 있도록 Vin이라는 핀을 제공하는데, 여러분은 이 핀을 이용해서 여러분의 장치에 전원을 공급할 수 있습니다.
Vin 핀을 사용해서 큰 전류를 사용하는 장치를 제어할 수 있다.

물론, 아두이노 보드에 연결한 아답터의 용량이 연결된 모든 장치의 W를 커버할 수 있다는 전제하에 Vin 핀이 역할을 한다는 것을 기억해야 합니다.

전원 공급이 문제없이 해결되었다면, 다음으로 해결해야 할 것은 외부 전원으로 구동되는 장치의 제어입니다.
아두이노 보드는 Digital 혹은 PWM 핀을 사용해서 전자 장치를 제어할 수 있습니다. 문제는 별도의 전원으로 연결된 장치는 아두이노 핀을 제어에 사용할 수 없다는 것입니다.
제어의 의미는 공급되는 전원을 On/Off시키는 것을 말하는데, 이미 별도의 전원을 사용하고 있는 장치는 아두이노 보드의 핀과 연결할 수 없기 때문입니다.
이런 경우 사용하는 것이 바로 스위치(Switch)입니다. 스위치는 전원 공급을 On/Off시킬 수 있는 부품이며 사람이 직접 눌러서 제어할 수 있습니다.
스위치는 전기를 차단하거나 공급할 수 있다.

하지만, 스위치는 사람이 직접 제어하는 것이지 아두이노 보드가 할 수 있는 것이 아닙니다. 아두이노 보드가 전기를 차단하거나 공급하게 하려면 특별한 스위치가 필요한데, 이것을 바로 트랜지스터(Transistor)라 부릅니다.
트랜지스터의 모습

트랜지스터는 핀이 3개있는데, 각각 Emitter, Base, Collector라 부릅니다.
  • Collector: 외부 전원(+)에 연결
  • Base: 아두이노 보드 핀에 연결
  • Emitter: GND(-)에 연결


트랜지스터를 사용하면 외부 전원으로 작동하는 전자 부품들을 제어할 수 있습니다. 트랜지스터도 당연히 용량이 있으므로 필요로 하는 용량에 맞게 사용해야 합니다.
좀 큰 용량으로 사용되는 트랜지스터를 FET 혹은 MOSFET이라 부르며, 아주 큰 용량을 제어할 때는 릴레이(Relay)라 부르는 부품이 이 역할을 합니다.
MOSFET은 주로 방열판이 달려있다.

릴레이는 큰 용량(Watt)를 제어할 수 있다.

아두이노 보드에서 Digital 핀을 사용해서 제어하면 On/Off 제어가 가능하고 PWM 핀을 사용해서 제어하면 0V ~ 사용하는 전압까지 출력을 제어할 수 있습니다.


2016년 7월 1일 금요일

아두이노 프로그래밍 기초

아두이노 프로그래밍에 있어서 기초는 다음의 함수 역할을 이해하는 것입니다.
  • setup
  • loop
  • pinMode
  • digitalWrite
  • digitalRead
  • analogWrite
  • analogRead

setup/loop
아두이노 스케치는 항상 다음과 같은 모습으로 시작됩니다.

void setup()
{  
}

void loop()
{  
}

setup은 보드 작동 시 최초 한번만 수행되고, loop는 이후 반복적으로 수행됩니다. 따라서, 주로 setup에는 설정과 관련된 코드를 넣고, loop에는 반복적으로 해야 할 코드를 넣어야 합니다.


pinMode
pinMode 함수는 아두이노 보드의 핀 상태를 결정합니다. (자세한 정보)
pinMode 함수를 사용하기 위해서는 2가지 정보가 필요합니다.
  • pin : 설정할 핀
  • mode : 사용할 용도
mode는 INPUT, INPUT_PULLUP, OUTPUT의 3가지로 선택할 수 있습니다. INPUT과 INPUT_PULLUP은 입력 용도로 동일하지만 PULL UP이란 옵션을 사용하느냐의 차이입니다. PULL UP에 대해서는 향후에 다루겠습니다.
결국 크게 보면 INPUT과 OUTPUT으로 용도를 2가지로 볼 수 있으며, INPUT은 센서 용도이고 OUTPUT은 제어 용도입니다.


Digital과 Analog
먼저, 전자 회로에서 Digital과 Analog의 개념을 이해할 필요가 있습니다.
Digital은 TTL(Transistor-Transistor Logic)에서 나온 개념으로 0V와 5V 2가지 상태로 정보를 교환하는 것을 의미합니다.
Digital은 2진법의 0과 1로도 대체될 수 있으며 부울(BOOL) 대수에 있어서 TRUE, FALSE의 개념으로도 사용됩니다.

반면에 Analog는 0 ~ 5V 사이의 모든 상태를 사용합니다.
0 ~ 5V 사이의 상태를 숫자화하는 것을 양자화(Quantization)라 부르며 양자화의 세밀함을 해상도(Resolution)라 합니다.
전자 회로에서 많이 사용되는 해상도는 다음과 같습니다.
  • 8 bit : 256 단계
  • 10 bit : 1024 단계
  • 12 bit : 4096 단계
정리하면 Digital은 2가지 상태로 정보를 사용한다는 것이고, Analog는 해상도 만큼의 단계로 정보를 사용한다는 의미입니다.


digitalWrite
digitalWrite는 말 그대로 Digital(2가지 상태) 방식으로 Write(OUTPUT)를 하겠다는 뜻입니다.
digitalWrite 함수를 사용하기 위해서는 2가지 정보가 필요합니다.
  • pin : 제어할 핀
  • value : 핀의 상태 값
Digital은 2가지 상태이므로 아두이노에서는 LOW, HIGH로 사용합니다.
digitalWrite를 사용하기 위해서는 해당 핀이 pinMode에 의해 OUTPUT으로 이미 설정되어 있어야 하며, 이 함수를 통해 핀의 상태를 0V, 5V로 바꿀 수 있으므로 회로적으로 연결된 전자 부품을 제어할 수 있는 것입니다.


digitalRead
digitalRead는 Digital(2가지 상태) 방식으로 Read(INPUT)를 하겠다는 뜻입니다.
digitalRead 함수를 사용하기 위해서는 1가지 정보가 필요하며, 반환 값이 있습니다.
  • pin : 사용할 핀
  • 반환 값 : 핀의 상태 값
Digital은 2가지 상태이므로 LOW, HIGH로 값이 반환됩니다.
digitalRead를 사용하기 위해서는 해당 핀이 pinMode에 의해 INPUT으로 이미 설정되어 있어야 하며, 이 함수를 통해 핀에 연결된 다른 전자 부품의 상태를 알 수 있는 것입니다.


analogWrite
analogWrite는 Analog(Resolution 단계) 방식으로 Write(OUTPUT)를 하겠다는 뜻입니다.
이 말은 0V, 5V뿐 아니라 1.7V, 2.45V와 같은 중간 단계도 사용할 수 있다는 의미입니다.
아두이노는 Analog 신호 출력을 위해 PWM(Pulse Width Modulation)이란 특수한 방식을 사용합니다.

이 방식은 진짜 Analog가 아닌 Digital을 이용한 일종의 트릭입니다. 이렇게 하는 이유는 DAC(Digital-to-Analog Converter)라 부르는 하드웨어가 비싸서 아두이노 보드에는 포함되어 있지 않기 때문이며 PWM을 이용해서 Analog 출력을 흉내내고 있는 것입니다.
아두이노 Uno의 경우 PWM Resolution은 8bit이기에 0 ~ 255 범위의 수를 사용합니다.
PWM을 만들 수 있는 핀은 정해져있기 때문에 아무 핀이나 이것을 할 수 없으며 아두이노에서는 ~표시로 PWM이 가능한 핀을 알려주고 있습니다.

analogWrite를 사용하기 위해서는 해당 핀이 pinMode에 의해 OUTPUT으로 설정되어야 합니다.


analogRead
analogRead는 Analog(Resolution 단계) 방식으로 Read(INPUT)를 하겠다는 뜻입니다.
아두이노에는 ADC(Analog-to-Digital Converter)라 부르는 장치가 내장되어 있어서 0 ~ 5V 사이의 상태를 모두 입력받을 수 있습니다.
아두이노 Uno의 경우 ADC Resolution은 10bit이기에 0 ~ 1023 범위의 수를 사용합니다.
ADC를 사용할 수 있는 핀은 정해져있기 때문에 아무 핀이나 이것을 할 수 없으며 아두이노에서는 A표시로 ADC가 가능한 핀을 알려주고 있습니다.

대부분의 센서들은 ADC 핀에 연결되므로 아두이노에서 analogRead 함수를 이용해서 센서 정보를 값으로 받을 수 있습니다.



2016년 6월 30일 목요일

아두이노 회로도

구글 등에서 아두이노를 검색해보면 많은 회로들을 찾을 수 있습니다.
음악의 기본이 악보를 보는 것처럼 하드웨어의 기본은 회로도를 보는 것입니다.
본래, 회로도는 OrCAD와 같은 전용 회로도 작성 프로그램으로 만들어집니다.

이와 같은 형식의 회로도는 비 전문가가 보기 힘들기 때문에 그림 형식의 아두이노 회로도가 널리 사용됩니다.

이런 회로도를 실제 부품을 이용해서 구현할 수 있어야 아두이노를 해볼 수 있습니다.
전자 회로를 전공하지 않은 사람의 경우 무작정 따라하다가 실수를 할 수 있기에 기본 상식을 갖추는 것이 좋습니다.
소프트웨어는 실수를 해도 프로그램이 멈추는 정도로 끝나지만, 하드웨어는 실수로 망가뜨려서 재산 상의 손실이 발생할 수 있으므로 주의하는 것이 좋습니다.


VCC와 GND
모든 회로는 (+)극에서 시작하여 (-)극으로 끝납니다. 전자 회로에서는 (+)극을 VCC라 부르고 (-)극을 GND라 부릅니다.
VCC는 항상 전압 크기를 같이 표기하는데, 예를 들어 VCC(5V) 등으로 표기합니다. VCC를 생략하고 5V로만 표기하는 경우도 있는데 모두 (+)극을 의미합니다.
GND는 Ground라고 발음하며 전압의 크기와 상관 없이 모두 공통으로 사용합니다.
이 말은 회로 상에서 GND1, GND2등의 구별 없이 1개의 GND로만 불리기에 GND라 표기되어있는 것은 모두 연결해야 합니다. 이것을 공통 그라운드(Common Ground)라 말합니다.


5V와 3.3V
디지털 전자 회로는 5V 혹은 3.3V 방식 2가지 중 하나로만 사용됩니다. 아두이노로 사용할 수 있는 대부분의 회로는 5V로 작동하지만, 간혹 3.3V로 작동하는 장치들도 있으니 잘 구분하여 사용해야 합니다.
아두이노는 5V로 작동하며 USB가 5V로 전원을 공급하므로 USB를 전원 장치로 사용하고 있습니다.


외부 전원
간혹, 외부 전원으로 작동해야 하는 경우가 있는데, 여기서 말하는 외부 전원이란 배터리나 어댑터 등을 통해 전원을 공급받는 것을 말합니다. 외부 전원을 사용한다면 USB연결 없이도 아두이노 보드는 독립적으로 작동할 수 있습니다.
아두이노 보드는 외부 전원을 연결하기 위한 커넥터가 존재하며 회로 내부에 안정적인 5V를 공급할 수 있는 레귤레이터란 부품이 있기때문에 5V를 맞춰서 전원을 연결할 필요가 없습니다.
7V ~ 15V까지의 어떤 전압이라도 외부 전원으로 연결 가능합니다.


쇼트(Short)
전자 회로에서 쇼트는 (+)극과 (-)극이 직접 연결되는 것을 말하며 이런 일이 발생하면 회로에 엄청난 전류가 흘러 부품이 타버리는 불상사가 일어납니다.
이런 일이 주로 발생하는 경우는 다음과 같습니다.
  • 전원을 연결한 채로 회로를 구성하다가 실수로 VCC에 연결된 전선과 GND에 연결된 전선이 닿음.
  • 전선의 납땜 부위를 제대로 막아놓지 않아서 서로 붙어버림.
  • 회로 구성을 잘못하여 VCC와 GND가 서로 연결됨.
위 경우의 공통점은 모두 실수와 부 주의라는 것입니다. 하드웨어는 실수가 곧 재산 상의 피해로 이어질 수 있으니 매우 주의해야 합니다.
아두이노 보드는 이런 실수에 대한 피해를 막기 위해 쇼트가 일어나면 자동으로 전원이 차단되는 기능이 들어가있습니다. 이것은 일종의 퓨즈(Fuse)와 같은 것으로 저가형 아두이노 보드는 이런 기능이 제대로 갖춰지지 않아서 실수가 곧 보드가 망가지는 피해로 발생할 수 있습니다.


브레드 보드(Breadboard)
브레드 보드는 납땜없이 아두이노 회로를 꾸밀 수 있는 기판입니다.


브레드 보드에 나와있는 수 많은 구멍들은 서로 연결되어 있기 때문에 연결 배선을 잘 기억해야 올바른 회로를 구현할 수 있습니다.

위 그림과 같이 주로 VCC와 GND의 분배 용으로 사용되는 제일 위와 아래 블럭은 가로로 연결되어 있고, 주로 부품 연결용으로 사용되는 중간 블럭은 세로로 연결되어 있습니다.
이 말은 서로 연결된 구멍에 전선을 꽂으면 회로적으로 연결된 것과 같다는 뜻입니다.


핀 맵(Pin out)
회로에 사용되는 모든 부품은 핀(Pin)이라 부르는 전선을 연결하기 위한 부분이 존재합니다. 소프트웨어적으로 본다면 일종의 인터페이스라 생각할 수 있습니다.

각 핀은 명칭이 있으며 용도가 정해져 있습니다. 현재 사용 중인 부품의 핀에 대한 정보를 알기 위해서는 데이터 시트(Datasheet)라 부르는 문서를 봐야 합니다. 칩이 아닌 LED와 같은 부품들도 핀 맵이 있습니다.

아두이노 보드도 이 핀 맵이 있기에 사용자는 반드시 숙지해야 합니다. 이 핀 맵에 맞게 회로를 연결해야 문제 없이 잘 작동할 수 있습니다.


2016년 6월 24일 금요일

아두이노 스케치(Arduino Sketch)

아두이노 보드를 가지고 있다면, 다음으로 해야 할 일은 아두이노 개발 환경을 PC에 설치하는 것입니다.
아두이노 개발 환경은 Arduino IDE라 부르며, 공식 사이트(www.arduino.org)에서 무료로 다운로드 받을 수 있습니다.
아두이노 보드는 기본적으로 PC와 USB로 연결되기에 USB 드라이버가 필요합니다. 대부분의 호환 보드는 Arduino IDE 설치 시 같이 설치되는 USB 드라이버로 인식되지만, 저가형 중국산 아두이노 보드의 경우는 별도로 USB 드라이버를 구해야 할 수 있습니다.
어찌되었건 Arduino IDE를 설치하면 다음과 같이 실행됨을 볼 수 있습니다.

아두이노 보드도 컴퓨터이므로 프로그램이 있어야 작동합니다.
Arduino IDE의 역할은 바로 이 프로그램을 작성하고 완성된 프로그램을 보드에 옮겨주는 업로드(Upload)란 작업을 해 주는 것입니다.
Arduino IDE에서 작성되거나 수정할 수 있는 프로그램 소스를 바로 아두이노 스케치(Arduino Sketch)라 부릅니다.

아두이노 스케치는 C/C++ 문법으로 작성됩니다.
즉, 이 말은 C 혹은 C++ 문법으로 프로그래밍해야 한다는 뜻입니다.
안타깝게도 C/C++ 문법을 모른다면 약간의 노력을 들여서 공부해야 합니다.

메뉴를 살펴보면 기본적으로 테스트할 수 있는 예제를 제공합니다.

만약, 스케치를 다 작성했다면, 다음으로 할 일은 보드의 종류를 선택하는 것입니다.
아두이노 공식 사이트에서 확인했듯이 아두이노 보드는 종류가 많습니다. 따라서, 현재 작성된 스케치가 어느 보드에서 작동할 것인지 설정할 필요가 있습니다.

보드 선택을 완료했다면, 작성된 스케치에 오류가 없는 지 검사해야 합니다.
메뉴 바의 제일 앞의 체크 표시 버튼을 누르면 작성된 스케치를 검사하고 하단의 콘솔 창에 결과를 보여줍니다.
오류가 없다면 그 다음 단계인 스케치 업로드를 할 수 있습니다.
스케치 업로드를 위해서는 반드시 보드가 PC에 연결되어 있어야 하며, 올바른 포트가 선택되어야 합니다.
포트란, 시리얼 포트를 말하며 메뉴를 통해 선택할 수 있습니다.

이제 메뉴 바의 화살표 표시 버튼을 누르면 업로드가 진행됩니다.
업로드(Upload)란, 작성된 소스가 컴파일되어 기계어로 바뀌고 통신을 통해 아두이노 보드의 메모리에 쓰여지는 작업을 말합니다.
업로드가 완료되면 보드는 전원이 켜지면서 내장된 프로그램으로 항상 작동하게 됩니다.


아두이노(Arduino)란 무엇인가?

아두이노(Arduino)는 하드웨어 전문 개발자가 아니어도 마이크로 컨트롤러를 다룰 수 있게 해주는 솔루션입니다.
먼저, 마이크로 컨트롤러가 무엇인지 잠깐 설명하겠습니다.
하나의 칩으로 만들어진 아주 작은 컴퓨터로써, 메모리, CPU등이 내장되어 전원만 공급되면 독립적으로 작동될 수 있습니다.
여기에 여러가지 전자 부품(LED, 모터 등)을 제어할 수 있는 기능을 내장하고 있기에 우리 주변의 전자 장치에는 이것들이 들어있습니다.

이 기술은 하드웨어에 대한 전문 지식도 많이 필요하고, 별도의 개발 장비들도 필요하기 때문에 관련 분야를 전공하지 않은 사람은 다루기가 힘들었습니다.

하지만, 아두이노는 보드와 전선 몇 개, 그리고 제어할 전자 부품이 있다면 손쉽게 전자 장치를 만들 수 있게 해주었습니다.

이런 보드에도 프로그래밍이 필요한데, 아두이노가 나오기 전에는 데이터시트(Datasheet)라 불리는 전문 용어가 많이 들어간 문서를 읽어야만 했지만, 아두이노는 하드웨어 제어 루틴을 매우 직관적인 함수로 라이브러리화했기 때문에, 조금만 공부하면 프로그래밍할 수 있습니다.
또한, 복잡한 기능이 많이 있는 전문 개발 환경이 아닌, 꼭 필요한 기능만으로 구성하여 간소화시킨 개발 환경으로 다루기 쉽게 해주었습니다.


아두이노는 실제로 하드웨어 전문가가 아닌 예술가들이 자신의 예술 작품에 전자 장치를 만들어 넣으면서 알려지기 시작했으니, 일반인이 쉽게 다룰 수 있다는 점이 증명된 셈입니다.


그렇다면 아두이노를 시작해보려면 어떻게 해야 할지 알려드리겠습니다.
우선, 아두이노 공식 사이트(www.arduino.org)에 방문하면 많은 보드들을 볼 수 있습니다.
참고로, 아두이노 사이트는 arduino.ccarduino.org가 있는데, arduino.cc는 주로 미국내에만 활동하고 국제적으로는 arduino.org가 하도록 나뉘었습니다.
가장 널리 사용되며 초보자들이 접근하기 좋은 보드는 바로 아두이노 우노(Uno)입니다.

아두이노 우노 보드는 국내에서 쉽게 구매할 수 있습니다.
아마 보드를 사려고 검색을 해보면 좀 혼란스러운 생각이 들 것인데, 그것은 호환 보드라는 유사 품들이 너무 많다는 것입니다.
아두이노는 오픈 소스 하드웨어이기 때문에 보드를 만드는데 필요한 모든 소스가 공개되어 있습니다.
또한, 이 공개된 소스를 이용해서 누구나 보드를 만들 수 있고, 심지어 판매도 가능합니다.
바로 이 점 때문에 아두이노 호환 보드가 매우 많은 것입니다.
정품은 arduino.org에서 만든 것이고, 호환 보드는 다른 제조사에서 만들어진 것을 말하며 기능 상에는 차이가 없습니다.
근래에 들어서는 중국산 아두이노 보드가 매우 저렴하게 유입되고 있어서, 오히려 정품보다 더 많이 팔리는 실정입니다.
선택은 여러분이 하는 것이지만, 중국산 보드들의 경우 USB 드라이버의 호환성이나 회로 안전성이 정품보다는 떨어집니다.
대부분 정품 보드들은 회로 보호 장치가 내장되어 있지만, 저가형 보드들은 그렇지 않은 경우가 많습니다.
가격이 저렴한 만큼 약간의 불편과 위험을 감수할 수 있다면, 저가형 보드를 사는 것도 괜찮습니다.

사실 보드만 산다고 뭘 할 수 있는 것은 아닙니다.
회로를 꾸밀 수 있는 브레드 보드와 전자 부품, 그리고 전선 등이 필요합니다.
국내의 대부분의 아두이노 관련 샾들은 이런 부가적인 악세사리들도 같이 판매하고 있습니다.
따로 사는 것이 귀찮다면 Starter Kit이란 이름으로 세트로 된 것도 있으니 검토해보는 것도 좋습니다.