'시리얼 통신'에 해당되는 글 2건

  1. 2017.03.18 아두이노의 시리얼 통신
  2. 2017.03.11 Arduino Uno R3의 개요
Embedded Lecture/Arduino2017. 3. 18. 12:51


사람도 다른 사람과 의사소통을 위해서 말을 주고받듯이 Arduino Uno도 주변 장치와 소통을 위해서 소위 통신이라는 것을 해야 합니다. Ardunio Uno 보드가 PC나 주변 장치와 유선 통신을 하기 위해서는 지원하는 시리얼 통신(serial communication) 방법이 있습니다. '시리얼'이란 직렬로 병렬 통신과 구분되는 용어로, 병렬(parallel) 통신은 과거 PC가 프린터와 통신하던 방법으로 다수의 선을 이용하여 통신하기에 단위 시간에 많은 데이터를 주고 받을 수 있는 장점이 있습니다.


그러나 병렬 통신은 도로의 폭에 비유할 수 있는 다수의 선을 이용하기에 장치와 거리가 먼 경우에 비용이 커지게 된다는 것입니다. 하지만 최소한의 선로로 빠르게 데이터의 송수신이 가능하다면 가성비는 커지기에 근래에 시리얼 통신 방법이 보다 다양하게 사용되고 있다는 것입니다. Arduino Uno 보드에서는 몇가지 시리얼 통신 방법을 지원하는데 우선 USART를 이용하는 방법입니다. 시리얼 통신은 크게 동기와 비동기 방식으로 구분됩니다.


동기 통신이란 데이터를 전송시 클럭(clock)을 함께 전송하여 받는 쪽에서 이 클럭을 기준으로 미리 정해진 통신 규격(protocol)에 따라 데이터를 취하는 방식입니다. 따라서 데이터의 양방향 통신을 위해서 송신과 수신에 각각 한가닥의 선을 할당하고 클럭을 위한 선을 고려하면 3가닥으로 직관적인 통신이 가능하다는 것입니다. 이를 USRT(Universal Synchronous Receiver and Transmitter)라 명명합니다.


뿐만 아니라 비동기 방식이 있는데 이는 클럭이 필요없이 오직 2가닥으로만 통신하는 방법으로 선로에 대한 비용을 더 감소시킬 수 있지만 하드웨어가 복잡해지는 단점이 있습니다. 그러나 동기식 처럼 수신 쪽에서 항상 대기할 필요 없이 다른 일을 하다가 데이터의 송수신이 가능하므로 MCU의 속도가 빠르게 개선되는 요즈음 필요한 방식이라는 것입니다. 이를 UART(Universal Asynchronous Receiver and Transmitter)라 부릅니다.


USART는 USRT와 UART 방식을 모두 지칭하는 것으로 Arduino Uno 보드는 동기식과 비동기식을 모두 지원합니다. 참고로 RS232, RS485는 시리얼 통신을 위한 전기적 혹은 하드웨어의 규격을 나타내는 말입니다. 이 보드에 사용하는 UART는 주로 Arduino IDE와 같은 PC와의 통신에 사용됩니다. 0번(Rx)과 1번(Tx) 핀을 사용하며 데이터는 MCU로부터 USB 통신을 담당하는 칩을 경우하여 USB 신호로 상호 변환된 후 PC와 송수신하게 됩니다. 또한 아두이노가 PC와의 통신을 수행하고 있다면 이 핀들을 다른 용도로 사용하면 안되며, 통신을 수행할 때에는 TX, RX라고 표시된 LED가 점멸함을 확인할 수 있습니다.



UART와 관련되 아두이노의 라이브러리는 Serial 클래스를 확인하시기 바랍니다. 다음은 UART의 예제입니다. PC에서 문자 하나를 받아서 그것이 '0'이면 LED를 끄고 '1'이면 LED를 켜는 프로그램으로, 아두이노는 데이터가 사용자로부터 들어올 때까지 대기 상태로 있다가 데이터가 입력되면 수행하게 됩니다.


#define LED 13
  void setup() {
 pinMode(LED, OUTPUT);
 Serial.begin(9600);
}
void loop() {
 if ( Serial.available() ) {
   char command = Serial.read();
   if (command == '0') {
     digitalWrite(LED, LOW);
     Serial.println("LED off.");
   }
   else if (command == '1') {
     digitalWrite(LED, HIGH);
     Serial.println("LED on.");
   }
     else {
     Serial.print("Wrong command :");
     Serial.println(command);
     }
  }
}


Serial.begin(long baud_rate) 함수는 UART 통신을 초기화 시키고, 통신 속도(baud rate)를 지정합니다.


Serial.available() 함수는 수신되어 내부 버퍼(64 byte)에 저장된 데이터의 개수를 반환합니다. 만일 버퍼가 비어있다면 0을 반환합니다.


Serial.read() 함수는 수신되어 내부 버퍼(64 byte)에 저장된 데이터 중 가장 첫 번째 데이터(ASCII코드)를 읽어서 반환합니다. 이 함수가 수행되면 내부 버퍼의 크기는 하나씩 줄어들며, 내부 버퍼가 비었다면 -1을 반환합니다.


Serial.print(val) 함수는 입력값을 ASCII값으로 변환하여 PC에 출력하며, 전송된 데이터의 바이트 수를 반환합니다. 비동기 통신 방식이므로 데이터가 전송되기 전에 반환하게 됩니다. 인수 val은 어떤 데이터 타입도 가능합니다.다. 예를 들면,


Serial.print(78) -> "78"

Serial.print(1.23456) -> "1.23456"

Serial.print('N') -> "N"

Serial.print("Hello world.") -> "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"


Serial.println() 함수는 출력 문자열의 끝에 줄바꿈 기호 '\r\n' 가 자동으로 붙는다는 점 외에는 Serial.print()함수와 동일한 동작을 수행합니다.


이 예제에서 내부 버퍼란 전송된 데이터가 일시적으로 저장되는 내부 메모리를 말하며 데이터가 전송된 순서대로 저장됩니다. Arduino Uno의 내부 버퍼의 크기는 64 byte인데, 수신된 데이터를 사용하려면 내부 버퍼에서 이 데이터를 읽어내야 하는데 이때 사용되는 함수가 Serial.read() 함수입니다. 가장 먼저 전송된 데이터 하나를 읽어낸 후 그 데이터는 버퍼에서 삭제되며, 만약 버퍼가 비었다면 -1을 반환합니다. 따라서 버퍼에 읽어낼 데이터가 있는지 없는지를 먼저 검사하는 것이 일반적이고 이때 사용되는 함수가 Serial.available()입니다.



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

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


Arduino Uno R3는 가장 널리 사용되는 입문용 기본 보드로 R3는 세번째 버젼을 의미합니다. 이 보드는 8-bit 마이크로 콘트롤러인 ATmega328P을 탑재하며 PC와 USB로 연결할 수 있어 프로그램 다운로드 및 시리얼 통신에 가능합니다. 그 밖에도 ATmega16U2의 또 다른 마이크로 콘트롤러를 내장하는데, 이는 기존 보드들에서 사용하던 FTDI FT232R USB-to-Serial 드라이버 칩을 대체하기 위한 것으로 USB-to-Serial 변환 프로그램이 들어 있습니다. ATmega328P는 1KB의 부트로터(Bootloader)용을 포함한 32KB의 Flash 메모리와 2KB의 SRAM, 1KB의 EEPROM을 갖고 있으며, 클럭 속도(Clock speed)는 16MHz입니다.


5V로 동작하는 이 Uno 보드의 전원공급은 두 가지 방법이 있는데, 첫번째는 USB로부터 제공되는 5V를 그대로 사용할 수 있으며, 두번째로는 7~12V의 AC 어댑터를 잭에 꼽아 외부에서 공급하는 방법인데 이는 Uno 보드가 내부적으로 5V를 정류하는 레귤레이터(Regulator)를 내장하고 있기 때문이며 위의 두 가지 전원이 모두 연결되어 있다면 외부 전원이 우선이 됩니다.



디지털 입출력 핀 14개 (0번~13번)

디지털 입출력 핀들을 이용해서 외부의 이진 신호를 읽어들어나 또는 이진 신호를 내보낼 수 있다. 디지털 입출력으로 사용되면서 또한 다른 기능을 가지는 핀들이 있는데, 이 기능들은 한 핀으로 두가지를 다 사용할 수는 없으며 다른 기능은 다음과 같습니다.

    • 0번~1번: 시리얼 통신에 사용되어 USB로 PC와 통신을 할 수 있습니다.

    • 2번~3번: 인터럽트(interrupt) 기능을 갖습니다.

    • 3, 5, 6, 9, 10, 11번 핀은 PWM 기능을 가지며 아날로그 출력을 흉내낼 수 있다.


아날로그 입력 핀 6개 (A0~A5)

외부의 아날로그 입력값을 읽어들여 ATmega328P칩 내부의 ADC(Analog to Digital Converter)를 이용하여 0~1023 사이의 숫자로 변환합니다. 이때 필요한 기준 전압은 5V 이지만 1.1V의 내부 전압이 사용될 수 있으며 AREF핀으로 기준 전압을 직접 인가할 수도 있습니다. 그리고 아날로그 핀은 디지털 입출력 핀으로도 사용할 수 있습니다.


아날로그 출력핀 6개 (3,5,6,9,10,11번 핀)

아날로그 출력핀은 0~5V사이의 전압 값(256레벨)을 가질 수 있으며 이는 PWM(Pulse Width Modulation) 방식으로 동작하므로 흉내를 내는 것입니다.


인터럽트 (2, 3번 핀)

2번과 3번 핀에 가해진 외부 이벤트를 감지하여 사용자가 원하는 방향으로 이를 처리하기 위한 기능으로 이를 인터럽트 처리(interrupt handling)라 부르는데, 즉 이 핀들에 변화가 있는면 하드웨어는 즉각적으로 알리고 이때 사용자가 원하는 정해진 동작을 코딩하여 사용합니다.



ICSP for ATmega328 : 기존의 ATmega328P에 ICSP(In Circuit Serial Programming)를 위한 SPI 통신용 6핀 포트입니다. ICSP는 전통적으로 마이크로 컨트롤러에 직접 펌웨어를 프로그래밍하기 위해 마련된 것입니다.


ICSP for USB interface : 기존의 ATmega16U2에 ICSP(In Circuit Serial Programming)를 위한 SPI 통신용 6핀 포트입니다. 


TWI(I2C) 통신 : A0, A1 핀




Posted by Nature & Life