시리얼 통신(serial communication)은 기기들간 데이터를 주고 받는 방법 중 하나인데 병렬 통신 (parallel communication) 방식에 비해서 통신선의 갯수가 적다는 장점이 있다.  아두이노는 UART (universal asynchronous receiver and transmitter), SPI, I2C 방식의 시리얼 통신을 지원하는데 이중 UART는 주로 아두이노와 PC간의 통신을 하는데 사용된다. 아두이노는 하나 이상의 UART 통신기가 내장되어 있는데  라이브러리와 IDE에 내장된 터미널(terminal, 주고 받는 데이터를 확인할 수 있는 프로그램)을 이용하면 손쉽게 PC와의 통신을  수행할 수 있다.


 아두이노 우노의 경우 0번과 1번핀이 시리얼 통신에 사용된다. 이 핀들은 내부적으로 USB통신을 담당하는 칩과 연결되어서 USB신호로 변환된 후 PC에 전달된다. 반대로 PC에서 보내지는 USB신호는 이 칩에서 시리얼 통신 신호로 변환되어 아두이노의 AVR에 전달된다. 따라서 만약 아두이노가 PC와의 통신을 수행하고 있다면 이 핀들을 다른 용도로 사용하면 안된다. 그리고 통신을 수행할 때에는 TX, RX라고 마킹된 LED가 깜빡인다.  일단 사용자는 아두이노와 PC간에 USB케이블로 연결하면 통신 실습을 할 준비가 끝나게 된다.


  • 시리얼 통신에 사용되는 두 개의 핀(빨간색)과 usb변환 칩(하늘색)

  • 내부적으로 USART 신호는 USB신호로 변환되어 PC에 전송된다.


시리얼 통신 첫 번째 예제

 첫 번째 예제로 아두이노에서 PC로 간단한 데이터를 전송하는 예를 해보도록 하겠다. 단순히 아두이노에게 전원을 인가하면 “I’m ready.” 라는 메세지를 PC에 전송하는 예이다.


void setup() {
 Serial.begin(9600);
 Serial.printl"I'm ready.");
}
void loop() {
}


이 예제를 다운로드 한 후 터미널을 켜고 리셋버튼을 누르면 터미널에 “I’m ready.”라는 문자열이 찍히는 것을 확인할 수 있다. 터미널 실행 버튼을 누르면 아두이노에 자동으로 리셋신호가 걸려서 프로그램이 처음부터 수행된다. 그리고 프로그램 다운로드 중에서는 터미널을 실행시키지 못 한다는 것도 알아두자.



 UART와 관련되 아두이노의 라이브러리는 Serial클래스에 다 모여있다. (자세한 설명을 여기 참조) 일단 이 예제에서 보면 setup()함수내에서 두 개의 함수가 호출되었다.


void Serial.begin(long baud_rate) 함수

  • UART 통신을 초기화 시킨다.

  • 통신 속도(baud rate)를 입력으로 받는다.        

  • 9600, 19200, 57600, 115200 등 여러 baud rate를 지원한다.


long Serial.print(val) 함수

  • 입력값을 ASCII값으로 변환하여 PC쪽으로 출력한다.

  • 전송된 데이터의 바이트 수를 리턴한다. (잘 사용되지 않음)

  • 비동기 통신 방식이므로 데이터가 전송되기 전에 리턴된다.

  • 입력 변수 val은 어떤 데이터 타입도 가능하다. 예를 들면

    • Serial.print(78) gives "78"

    • Serial.print(1.23456) gives "1.23"

    • Serial.print('N') gives "N"

    • Serial.print("Hello world.") gives "Hello world."


  • 두 번째 인수로 출력 형식을 지정할 수 있다. 예를 들면

    • Serial.print(78, BIN) gives "1001110"

    • Serial.print(78, OCT) gives "116"

    • Serial.print(78, DEC) gives "78"

    • Serial.print(78, HEX) gives "4E"

    • Serial.println(1.23456, 0) gives "1"

    • Serial.println(1.23456, 2) gives "1.23"

    • Serial.println(1.23456, 4) gives "1.2346"


첫 번째 예제는 setup() 함수 내에서 UART를 초기화 하고 문자열 하나를 보내는 아주 간단한 예제이다.


아두이노 강좌 전체 목록 (TOP) >>>

C++ 언어 전체 강좌 목록 >>>

c{ard},n{ad012}

Posted by 살레시오
,

 인체감지센서 모듈은 적외선을 감지하는 센서를 장착하고 있으며 약 6미터 이내의 인간이나 동물의 움직임을 감지할 수 있다. 인체나 동물의 몸과 같이 열을 발산하는 곳에서 발생하는 적외선을 감지하는 원리이다.


<그림 1> 인체 감지 센서 모듈


  • 인체나 동물의 몸체에서 발산되는 열적외선을 감지한다.

  • 둥근 캡은 적외선을 증폭하는 효과가 있다.

  • 약 6m 이내의 인체의 움직임을 감지할 수 있다.

전원과 신호를 전달하는 세 핀을 가지고 있고 5V 전원을 받아서 인체가 감지되면 신호선은 약 3.3V 전압을 띠게된다. 따라서 신호선을 아두이노의 디지털 핀에 연결하면 쉽게 인체감지 여부를 알 수 있게 된다.


 또한 인체가 감지되었을 때 high 신호를 유지하는 시간을 설정하는 조절기가 내장되어 있어서 이 시간을 0,3초~18초 사이로 조절할 수 있다. 이 조절 기능을 이용하면 인체가 감지되었을 때 점등되는 시스템을 아주 간단하게 구현할 수 있다. 모델에 따라서 열적쇠선 센서의 감도를 조절하는 조절기가 내장된 경우도 있다.


 고휘도LED가 5번 핀에 연결되어 있고 인체 감지 센서 모듈의 신호선이 A0핀에 연결되어 있다고 가정하자. 이 예제에서는 아날로그 핀을 디지털 핀으로 사용하는 예제이다. 전술한 바와 같이 디지털 핀의 숫자가 모자랄 경우에는 아날로그 핀을 디지털 핀으로 사용할 수 있다.


#define HLED 5
void setup() {
   pinMode(A0, INPUT);
   pinMode(HLED, OUTPUT);
}
void loop() {
   digitalWrite(HLED, digitalRead(A0) );
   delay(100);
}


이 예제를 실행해 보면서 인체가 감지되는 거리 범위와 고휘도LED가 켜지는 시간을 조절하여 보자.


아두이노 강좌 전체 목록 (TOP) >>>

C++ 언어 전체 강좌 목록 >>>

c{ard},n{ad011}

Posted by 살레시오
,

 택스위치(tact switch)는 기계적인 접점을 가지는 스위치로서 누르면 접점이 닫히고 누르지 않은 상태에서는 접점이 열려있는 소자이다.

[그림 1] 택(tact) 스위치

택스위치는 다리가 2개인 것과 4개인 것이 있다. (왜 궂이 다리가 4개가 필요할까 의아하겠지만 스위치 배열 회로를 꾸밀때 유용하다.)


 다음과 같이 아두이노의 디지털핀과 연결하여 접점의 상태를 읽을 수 있다. 일단 2번 핀에 스위치의 한 쪽 다리를 연결하고 GND에 다른 쪽 다리를 연결해야 한다.


[그림 2] 택스위치 결선도

아두이노 우노는 2번 핀이 INT0 이고 3번 핀이 INT1 으로서 외부 인터럽트를 사용할 수 있다.


 이렇게 회로가 구성되었다면 pinMode() 함수를 이용하여 스위치가 연결된 핀을 입력으로 설정해야 하는데 다음과 같이 두 가지 방법이 있다.


pinMode(2, INPUT ) ;     // 2번 핀을 입력으로 설정
pinMode(2, INPUT_PULLUP);// 2번 핀을 입력 + 내부 풀업 저항 연결


첫 번째 방법은 단순히 2번 핀을 입력으로 설정하는 것이다. 두 번째 방법은 2번 핀을 입력으로 설정한 후 내부 풀업(pull-up)저항까지 연결하도록 하는 것이다.


 기계적인 스위치를 핀에 연결할 때는 보통 내부 풀업저항을 연결해서 사용한다. [그림 2]의 회로 동작은 간단하다. 내부에 풀업 저항이 연결되어 있으므로 안 눌렸다면 2번 핀으로 HIGH신호가 나오고, 눌렸다면 LOW 신호가 나온다. 따라서 이 디지털 신호를 읽으면 택스위치가 눌렸는지 아닌지를 판별할 수 있다.


  • 스위치가 눌렸다면 LOW 신호

  • 스위치가 안 눌렸다면 HIGH 신호


이 핀값을 읽을 때는 digitalRead()함수를 사용하면 된다.


digitalRead(2); // 2번 핀의 값을 읽는다


예를 들어서 이 값을 변수에 저장할 수도 있다.


byte bySwitchIn = digitalRead(2);


 첫 예제로 버튼을 누르고 있으면 내장된 LED가 켜지는 간단한 기능을 구현해 보자. 누르고 있는 동안에만 켜져 있고 누르지 않고 있다면 꺼지도록 하는 것이다.


#define SW 2
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(SW, INPUT_PULLUP); // 내부 풀업 저항을 연결한다.
}
void loop() {
 digitalWrite(LED_BUILTIN, !digitalRead(SW));
}


여기서 digitalRead()함수 앞에 논리 not (!) 연산자가 붙어있다. 이렇게 해서 스위치가 누르면 digitalRead() 은 0값이 나오는데  !digitalRead() 은 1이 되어 LED에 불이 켜지게 된다.


아두이노 강좌 전체 목록 (TOP) >>>

C++ 언어 전체 강좌 목록 >>>

c{ard},n{ad010}


Posted by 살레시오
,