Communicating with the VESC using UART


Posted on October 9, 2015

Many people have asked me how to communicate with the VESC using UART, but I did not have a good answer since I haven’t written any tutorial about that and the only thing I could refer to was the BLDC Tool code. Now I have created a project for the STM32F4 discovery board that implements UART communication with the VESC where the full interface is implemented. In this post I will try to explain how the code works and how to port it to other platforms.

많은 사람들은 제게 UART를 이용해서 VESC와 어떻게 통신하는지 물어왔습니다. 그러나 저는 그것에 대해서 어떤 가이드를 작성하지 않았기 때문에 좋은 답장을 갖고 있진 않습니다. 제가 참조할 수 있는 유일한 것은 BLDC Tool의 코드입니다. 저는 완전한 인터페이스가 구현된 VESC와 UART 통신을 구현한 STM32F4 discovery 보드에 대한 프로젝트를 만들었습니다. 이 글에서 저는 어떻게 코드가 동작하고 다른 플랫폼으로 어떻게 포팅하는지를 설명할 것입니다.


Getting started

Start by downloading the code from github: 

https://github.com/vedderb/bldc_uart_comm_stm32f4_discovery



If you have a stm32f4 discovery board, you can upload the code to it and test it by following the tutorial in my VESC Post for installing the toolchain. After that, just connect both USB ports of the discovery board (one for the built in programmer and one for the serial terminal) and type make upload from the project directory. Don’t forget to connect rx (PB11), tx (PB10) and gnd from the discovery board to tx, rx and gnd on the VESC. The discovery board will show up as a USB-serial port and you can use a serial terminal such as screen or gtkterm to access a simple command line interface on it. Only a few commands are implemented for the command line interface (type help to list them), but a good exercise is to write more commands in the main file using the provided interface. Doing that with the bldc_interface code should be quite straight forward.

여러분이 stm32f4 discovery 보드를 갖고 계시다면, 여러분은 코드를 업로드 할 수 있고 toolchain을 설치하기 위해서 제 VESC 글에 가이드에 따라 테스트 할 수 있습니다. 그 후에 discovery 보드의 양 USB 포트를 연결하세요(프로그래머에 설치된 하나와 시리얼 터미널에 하나) 그리고 프로젝트 디렉토리로부터 make upload를 치시기 바랍니다. discovery 보드의 rx (PB11), tx (PB10) 그리고 gnd를 VESC의 tx, rx 그리고 gnd를 연결하는 것을 잊지 마십시오. discovery 보드는 USB-serial 포트로 나타나고 여러분은 간단한 command line 인터페이스를 접근하기 위해서 screen 혹은 gtkterm과 같은 시리얼 터미널을 이용할 수 있습니다. command line 인터페이스를 위해서 오직 몇 개의 명령에 대해서 구현되어졌습니다(리스트하기 위해서 help를 치세요), 그러나 좋은 연습은 제공된 인터페이스를 이용해서 메인 파일에 좀더의 명령어를 작성할 수 있습니다. bldc_interface 코드와 그것을 하는 것은 매우 직관적(straight forward)입니다.


Understanding the implementation

The VESC communicates over UART using packets with the following format:

VESC는 다음의 포맷을 갖는 패킷을 사용하여 UART로 통신합니다:


    • One Start byte (value 2 for short packets and 3 for long packets)

    • One or two bytes specifying the packet length

    • The payload of the packet

    • Two bytes with a CRC checksum on the payload

    • One stop byte (value 3)


The higher level of the VESC communication code is the same for the USB, UART and CAN ports, so everything that can be done from BLDC Tool can be done from the other ports as well. Therefore I have abstracted out the higher layer of the communication into separate files so that it can be reused for CAN-bus and USB without modifying the rest of the code later.

VESC 통신 코드의 상위 레벨은 USB, UART 그리고 CAN 포트에 대해서도 동일합니다. 그래서 BLDC Tool로부터 할 수 있었던 것은 모두 다른 포트들에서도 할 수 있습니다. 그러므로 저는 통신의 상위 레이어를 분리된 파일들로 구체화 하였습니다. 그 결과 이것은 CAN 버스와 USB에 대해서 나중에 코드의 나머지 수정 없이 다시 사용할 수 있습니다.


The important files in the project, which you can use for your implementation, are the following. They are plain C files and don’t have any hardware dependencies.

여러분이 여러분의 구현을 위해서 사용할 수 있는 프로젝트에서 중요한 파일들은 다음과 같습니다. 일반 C 파일이며 어떤 하드웨어 의존성을 갖지 않습니다.


bldc_interface.c and bldc_interface.h


These files can assemble the payload for all the commands that the VESC supports. They can also interpret packets from the VESC and extract the data from them. Notice that only the payload is handled in these files, not the start, stop, length and checksum bytes since these are different for the CAN interface.

이들 파일은 VESC가 지원하는 모든 명령들의 페이로드(payload)를 조립할 수 있습니다. 이들 파일은 또한 VESC로부터 패킷을 번역하고 그들로부터 데이터를 추출할 수 있습니다. 이들은 CAN 인터페이스에서 다르기 때문에 start, stop, length 그리고 checksum bytes가 아닌 오직 페이로드만이 이들 파일에서 다룰 수 있다는 것을 기억하세요. 


datatypes.h


The data structures used by the VESC.

VESC에서 사용된 데이터 구조입니다.


buffer.c and buffer.h


Helper functions for for going between C types and byte arrays. These are used by the bldc_interface files.

C 타입 그리고 byte 배열사이에 Helper 기능들. 이들은 bldc_interface 파일에서 사용됩니다.

crc.c and crc.h


For calculating the CRC checksum

CRC checksum을 계산하기 위함


packet.c and packet.h


For assembling the packets for the VESC with start, stop, length and checksum bytes. These files also have a state machine where one byte received from the VESC can be added at a time to assemble a packet and check the checksum correctness.

start, stop, length 그리고 checksum bytes와 함께 VESC를 위한 패킷의 조립을 위함. 이들 파일은 또한 VESC로부터 수신된 한 바이트가 패킷을 조립하기 위해서 한번에 추가되고 checksum이 올바른지 체크할 수 있도록 하는 state machine을 갖습니다.


bldc_interface_uart.c and bldc_interface_uart.h


Connects packet and bldc_interface to provide a clean UART interface. This is where the user has to make the connection to the UART interface for the platform of choice.

깨끗한 UART 인터페이스 제공하기 위해서 패킷과 bldc_interface을 연결합니다. 이는 사용자가 선택한 플랫폼의 UART 인터페이스로 연결해야 하는 곳입니다.


All of these files rely heavily on function pointers. This might sound complicated at first, but it is actually quite convenient and easy to use. The connection between these files and the UART port is done in the file comm_uart.c, which is the file that you have to implement if you want to port this to a different platform. Also, if you decide to use some other port than UART such as CAN or USB, you only have to re-implement this file and the higher level implementation will work as before.

이들 파일 모두는 함수 포인터에 강하게 의존합니다. 이는 처음에 복잡하게 들려질 수 있습니다, 그러나 이는 실제로 매우 편리하고 사용이 용이합니다. 이들 파일과 UART 포트의 연결은 comm_uart.c 파일에서 이루어집니다. 이 파일은 여러분이 이를 다른 플랫폼으로 포트하기를 원한다면 구현해야만 하는 파일입니다. 또한 여러분이 UART보다 CAN 혹은 USB와 같은 다른 포트를 사용하기로 했다면 여러분은 단지 이 파일을 다시 구현해야 합니다. 그리고 상위 레벨 구현은 전과 같이 동작할 것입니다.


Making the platform-specific UART connection

This should be rather straight forward. The bldc_interface_uart files have three functions that have to be used:

이것은 오히려 직관적일 수 있습니다. bldc_interface_uart 파일은 3가지 함수를 갖습니다:


bldc_interface_uart_init


This is the init function that takes a function pointer to a function that you provide for sending data on the UART. You can use it something like this:

이것은 UART 상에 데이터를 보내기 위해 여러분 제공한 함수로 함수 포인터를 옮겨 놓는 함수의 초기화 함수입니다. 여러분은 이를 다음과 같이 사용할 수 있습니다:


/**

 * A function that will send the bytes in *data with length len on the UART

 */

static void send_packet(unsigned char *data, unsigned int len) {

// Your implementation

}

 

// Your init function

void comm_uart_init(void) {

// Initialize your UART...

 

// Initialize the bldc interface and provide your send function

bldc_interface_uart_init(send_packet);

}


bldc_interface_uart_process_byte


Call this function every time a byte is received on the UART with the received byte. It will run the state machine in the packet assembler and the callbacks in bldc interface will be called when the packets are ready.

UART 상에 한 바이트가 도착할 때마다 이 함수를 호출합니다. 이는 packet assembler에서 state machine을 동작시키고 bldc 인터페이스에서 callback은 패킷이 준비되었을 때 호출될 것입니다.


bldc_interface_uart_run_timer


Call this function every millisecond to reset the packet state machine after a timeout in case data is lost.

데이터를 잃어버린 경우에 대해서 timeout 후에 packet state machine을 리셋하기 위해서 매 ms 마다 이 함수를 호출합니다.


Notice that bldc_interface_uart_process_byte and bldc_interface_uart_run_timer can be omitted it you only plan to send data to the VESC and not read anything.

bldc_interface_uart_process_byte와 bldc_interface_uart_run_timer는 여러분이 VESC에 데이터를 보내고 어떠한 것도 읽지 않을 계획이라면 생략될 수 있습니다.

 

In this example project this is implemented in comm_uart.c. This implementation is a bit more complicated than necessary because it uses threads to run the data processing to not block the UART while running the callbacks and to not run the callbacks from an interrupt scope, but a much simpler implementation can also be done if you don’t have an RTOS. You could call bldc_interface_uart_process_byte directly from an interrupt handler every time you receive a byte.

이 예제 프로젝트에서 이것은 comm_uart.c에서 구현되어졌습니다. 이들 구현은 필요보다 다소 복잡합니다. 왜냐하면 이는 callback이 작동하는 동안 UART를 막지 많고 데이터 프로세싱을 위한 그리고 interrupt scope로부터 callback이 작동하는 것을 막기 위해서 스레드를 사용하기 때문입니다. 그러나 여러분이 RTOS를 갖고 있지 않다면 또한 훨씬 간단하게 구현될 수 있습니다. 여러분은 여러분이 한 바이트를 수신한 때마다 interrupt handler로부터 곧바로 bldc_interface_uart_process_byte를 호출할 수 있습니다.


Using bldc_interface

After you are done with the hardware specific UART implementation, you can use bldc_interface in your application. To set the current, duty cycle etc. just call the corresponding function from the setters e.g.

여러분이 하드웨어에 요구되는 UART 구현을 완료한 후에 여러분은 여러분의 애플리케이션에서 bldc_interface를 사용할 수 있습니다. 예를 들어, 전류와 듀티 싸이클 등을 설정하기 위해서 설정기(setters)로부터 관련함수를 호출합니다.


// Run the motor in current control mode with 10A commanded current

bldc_interface_set_current(10.0);


You can do everything that BLDC Tool can do, including changing the configuration (you should read the old configuration before updating it though). Notice that you have to call these functions at regular intervals to not trigger the timeout in the VESC that will release the motor if no new commands have been received for longer than the configured time for safety reasons. This can be done either by calling the corresponding setters at regular intervals or by calling the bldc_interface_send_alive function.

여러분은 BLDC Tool이 할 수 있는 모든 것을 할 수 있습니다, 설정을 변경(하지만 업데이트 전에 이전 설정을 읽어야만 합니다)하는 것을 포함해서 말입니다. 여러분은 VESC에서 timeout이 작동하지 않기 위해서 정기적인 간격으로 이들 함수를 호출해야 함을 기억하세요! VESC는 안전의 이유로 설정된 시간보다 긴 시간 동안 어떠한 새로운 명령을 수신할 수 없다면, 모터를 통제권을 내려놓습니다. 이는 정기적인 간격으로 관련 설정기를 호출하거나 bldc_interface_send_alive 함수를 호출하는 것에 의해서 해결될 수 있습니다.


Reading data

Reading data is done with getter functions and callback function pointers. For example, to get realtime data from the VESC, first set a callback to your function for handling the data using bldc_interface_set_rx_value_func and then request the data with bldc_interface_get_values. It can look something like this:

데이터를 읽는 것은 getter 함수와 callback 함수 포인터들과 함께 이루어집니다. 예를 들어, VESC로부터 실시간 데이터를 얻기 위해서 우선 bldc_interface_set_rx_value_func 함수를 사용해서 데이터를 핸들링 하기 위해서 여러분의 함수로 callback을 설정하세요 그리고 나서 bldc_interface_get_values 함수로 데이터를 요청합니다. 이는 다음과 같이 보여집니다:


// Your callback function for the received data. In this case you simply

// print it using printf.

void bldc_val_received(mc_values *val) {

printf("Input voltage: %.2f V\r\n", val->v_in);

printf("Temp:          %.2f degC\r\n", val->temp_pcb);

printf("Current motor: %.2f A\r\n", val->current_motor);

printf("Current in:    %.2f A\r\n", val->current_in);

printf("RPM:           %.1f RPM\r\n", val->rpm);

printf("Duty cycle:    %.1f %%\r\n", val->duty_now * 100.0);

printf("Ah Drawn:      %.4f Ah\r\n", val->amp_hours);

printf("Ah Regen:      %.4f Ah\r\n", val->amp_hours_charged);

printf("Wh Drawn:      %.4f Wh\r\n", val->watt_hours);

printf("Wh Regen:      %.4f Wh\r\n", val->watt_hours_charged);

printf("Tacho:         %i counts\r\n", val->tachometer);

printf("Tacho ABS:     %i counts\r\n", val->tachometer_abs);

printf("Fault Code:    %s\r\n", bldc_interface_fault_to_string(val->fault_code));

}


// Somewhere in your init code you can set your callback function(s).

bldc_interface_set_rx_value_func(bldc_val_received);


// Every time you want to read the realtime data you call the corresponding getter.

// This will send the get command to the VESC and return. When the data is received

// the callback will be called from the UART interface.

bldc_interface_get_values();


Have a look at main.c to see some examples of this.

예제를 보기 위해서 main.c를 보세요


That’s it! I hope this is enough to get started with UART communication to the VESC.

VESC로의 UART 통신을 시작하기에 충분하기를 희망합니다.



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 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



근래에 PC와 랩톱, Portable 장치들에서는 RS232C 포트가 사라진지 오래되었습니다. 기존의 RS232C 포트는 기구적으로 소형화에 걸림돌이기도 하며, 넓은 대역폭으로 빠른 전송 속도와 Plug & Play 등의 장점을 앞세운 USB 포트로 대체되었습니다.


하지만 아직도 AVR을 비롯한 많은 MCU들은 여전히 기존 시리얼 통신 방법을 채택하고 있습니다. 한편 이런 MCU와 PC간의 interactive 제어나 수행 결과를 모니터하기 위해서는 USB 통신을 지원하는 범용 툴을 사용하거나 사용자가 Win32 Application을 직접 제작하여야 한다는 것입니다.


이렇듯 사용자는 PC의 USB 포트로 통신하는 Win32 Application을 기존의 시리얼(RS232C) 통신 프로그램과 마찬가지로 ReadFile(), WriteFile() 혹은 DeviceIoControl() 함수를 이용하여 구현하게 됩니다. 그런데 USB 통신에서는 물리적인 장치에 접근하기 위해서 드라이버(예를 들어, *.sys)가 필요하게 되는데, 좀더 구체적으로 MS Windows 환경하에서는 Windows가 장치에 접근하기 위해서 Windows Driver Model(WDM) 드라이버가 필요하다는 것입니다.


USB 드라이버는 어떻게 해야 할지요?


가장 좋은 방법은 사용자가 직접 자신이 사용할 드라이버를 드라이버 제작 툴(예를 들어, Jungo社의 WinDriver)을 이용하여 만드는 것입니다. 하지만 그리 쉬운 작업이 아니므로 두 번째 방법인 USB 드라이버 칩 제조사가 제공하는 드라이버를 가져다 사용하는 것입니다. 예를 들어, CypressFTDI Chip의 칩셋을 사용하는 경우 각 에서 제공하는 드라이버를 무료로 사용할 수 있습니다.





이러한 드라이버는 범용이기에 필요없는 오버헤드로 인해 다소 느릴 수는 있지만, 대부분의 USB 통신에서 만족할만한 결과를 얻을 수 있을 것입니다. 그러나 최신 아두이노(Arduino) 보드에서는 위와 같은 칩셋을 사용하지 않고 ATmega16U2를 사용하니 세 번째 방법인 직접 드라이버를 일일이 제작해야 합니다.


하지만 다행이도 아두이노는 다음과 같이 설명합니다.

http://arduino.cc/en/Main/arduinoBoardUno


The Uno differs from all preceding boards in that it does not use the FTDI USB-to-serial driver chip. Instead, it features the Atmega16U2 (Atmega8U2 up to version R2) programmed as a USB-to-serial converter.

우노는 FTDI USB-to-serial 드라이버 칩을 사용했던 모든 이전 보드와 다름니다. 대신에 USB-to-serial 컨버터로써 프로그램된 Atmega16U2를 사용합니다.


The '16U2 firmware uses the standard USB COM drivers, and no external driver is needed. However, on Windows, a .inf file is required. The Arduino software includes a serial monitor which allows simple textual data to be sent to and from the Arduino board. The RX and TX LEDs on the board will flash when data is being transmitted via the USB-to-serial chip and USB connection to the computer (but not for serial communication on pins 0 and 1).

'16U2 펌웨어는 표준 USB COM 드라이버를 사용합니다. 그리고 어떤 외부의 드라이버도 필요하지 않습니다. 그러나 Windows 상에서 *.inf 파일이 요구됩니다. 아두이노 소프트웨어는 간단한 텍스트 기반의 데이터를 아두이노 보드로 송수신하기 위한 시리얼 모니터(serial monitor)를 포함합니다. 보드상에 RX와 TX LED들은 컴퓨터의 USB와 USB-to-serial 칩을 경유하여 데이터가 전송될 때 반짝일 것입니다(pin 0 그리고 pin 1 상에 시리얼 통신을 위한 것이 아닙니다).


A SoftwareSerial library allows for serial communication on any of the Uno's digital pins.

SoftwareSerial 라이브러리는 우노의 디지털 pin들이 시리얼 통신을 가능하게 합니다.


The ATmega328 also supports I2C (TWI) and SPI communication. The Arduino software includes a Wire library to simplify use of the I2C bus; see the documentation for details. For SPI communication, use the SPI library.

ATmega328은 또한 I2C(TWI)와 SPI 통신을 지원합니다. 아두이노 소프트웨어는 I2C 버스의 사용을 간단화하기 위한 Wire 라이브러리를 포함합니다. 자세한 사항은 문서를 확인하세요. SPI 통신에 대해서는 SPI 라이브러리를 사용하세요.


그러므로 아두이노 보드는 별도의 USB 드라이버를 사용하지 않고 표준 USB COM 드라이버를 사용하므로 기존의 RS232C 통신과 동일한 Win32 함수로 데이터를 송수신하는 사용자 전용 통신 프로그램을 제작할 수 있습니다. 간단히 모니터를 위한 것이라면 아두이노 IDE 환경에서 제공하는 '시리얼 모니터'로도 충분하리라 생각됩니다.







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


 

아두이노(Arduino)는 오픈 소스(Open Source)를 기반으로 한 단일 보드(board) 마이크로 컨트롤러입니다. 2005년 이탈리아 사람에 의해서 최초 만들어지기 시작한 프로젝트로 현재에도 진행 중에 있으며 Arduino는 이탈리아어로 영어의 'Best Friend'와 같은 의미를 가진다고 알려집니다.

 

아두이노는 대부분 Atmel社의 ATmega8이나 ATmega32U4, ATmega168, ATmega328, ATmega2560 등을 탑재한 보드로 이들 마이크로 컨트롤러에 탑재할 펌웨어(Firmware)를 개발하는 환경에서부터 컴파일 및 독립적으로 작동할 수 있도록 업로드 과정이 편리하여 최근에 전 세계적으로 인기를 끌고 있습니다. 

 

2011년에는 구글의 안드로이드(Android)가 아두이노를 하드웨어 파트너로 선택한 이유도 이런 확장성과 편리함 때문에 상호간에 시너지 효과를 기대해 보자는 것으로 풀이되며, 이러한 추세에 힘입어 얼마전에는 Intel社에서도 아두이노 플랫폼에 자사의 Quark Processor를 탑재한 갈릴레오(Galilo)를 출시하였는데, 이러한 것도 내내 동일한 맥락이라는 것입니다.

 

갈릴레오 보드

 

하드웨어에 서툰 사람들조차도 아두아노에 관심을 가지게 만드는 이유는 요구하는 제품이 기존의 AVR의 개발환경에 비하여 뚜렷하게 간소화됨으로 말미암아 편리함일 수도 있지만, 이러한 과정들이 복잡하지 않아 소프트웨어 제작이나 다양한 하드웨어 DIY(Do It Yourself)를 즐기는 사람들에게 호기심을 불러 일으키기에 충분하였기 때문일 것입니다.

 

그럼 아두이노는 어떤 장점이 있는지 요약하여 봅니다.

 

1) 소프트웨어 개발을 위한 통합 환경(IDE)이 간소화 되었다는 것입니다.

가장 큰 장점으로 기존의 AVR 프로그래밍은 WinAVR로 컴파일하여 별도의 ISP 장치를 통해 업로드 해야하는 번거로운 과정을 거쳐야 하는데, 아두이노는 컴파일된 펌웨어를 보드 내 USB 포트에서 PC의 USB 포트로 케이블을 연결하는 것만으로 쉽게 업로드 할 수 있다는 것입니다.

 

2) Windows를 비롯한 Mac OS X 및 Linux와 같은 다양한 OS 환경을 지원합니다.

 

3) 다양한 소프트웨어와 연동이 가능하다는 것입니다.

사용자들이 기존에 즐겨 사용하여 익숙했었던 Flash나 Processing, Max/MSP, Android, Object C, Labview, Pure Data 등과 같은 소프트웨어를 연동할 수 있다는 것입니다.

 

4) 가격이 저렴합니다.

사실 마이크로컨트롤러를 배우고 싶어서 강좌를 듣거나 데모보드를 구입하려면 최소한 수 십만원 정도 이상을 호가하는데, 이에 비해 아두이노 보드는 상대적으로 매우 저렴하다는 것입니다.

 

5) 아두이노는 오프 소스입니다.

아두이노는 보드의 회로도가 공개되어 있으며 개발환경 조차도 오픈 소스이고 이로 인해 각종 회로도나 펌웨어 소스가 웹상에서 다량 공유되어 있다는 것입니다. 뿐만 아니라 여러 개발자들이 만들어 놓은 라이브러리 조차도 공유되어 개발 시간을 단축시키고 있다는 것입니다. 

 

다음은 아두이노 포럼입니다.

 

http://forum.arduino.cc/

 

 

현재 가장 많이 사용되는 아두이노는 보드는 기본형 우노(Arduino UNO)로써 손바닥만한 크기를 가지면서 ATmega328을 탑재하고 있는데 6개의 아날로그 입력단자와 14개의 디지털 입출력단자를 지원합니다. 이러한 입출력 단자들은 우노 보드에 위로 쌓아(Stack-up) 연결된 확장보드(Shield 보드, Shield-up 보드)에 서로 연결되고, 사용자는 1개 이상의 이들 확장보드에 주변회로를 직접 꾸며주게 됩니다.

 

 

 

Posted by Nature & Life