Arduino 보드는 몇가지로 구분할 수 있습니다. 첫번째로 입문용 보드(Entry Level)입니다. 입문용 보드는 초급자들이 사용이 용이하여 기초 전자 지식을 쌓고 처음 코딩을 시작하기에 적합하다는 것입니다. UNO, LEONARDO, MICRO, NANO, MINI 보드 등이 여기에 해당합니다. 특히 MICRO, NANO, MINI 보드는 크기를 최소화 한 것으로 프로그램의 업로드시에 별도의 FTDI 케이블이 필요합니다. 뿐만 아니라 보드가 작기 때문에 대부분의 마이크로컨트롤러는 SMD 타입으로 고장시 초보자는 땜질(soldering)로 교체가 어렵습니다.

※ FTDI 케이블 - USB-Serial (TTL) 변환기로 TTL 장치(아두이노 보드)를 쉽게 USB에 연결할 수 있게 합니다. 언듯 보기에 단순 케이블로 보이지만 USB 커넥터안에는 FT232RQ칩 등이 내장되어 있습니다.


※ SMD(
Surface Mount Device) 타입 - 전통적인 DIP(Dual Inline Package) 타입의 부품들은 기판에 홀이 있어 꽂을 수 있지만, SMD 타입의 부품들은 홀이 없이 부품을 동박면에 얹은 상태로 땜질을 하게 됩니다. 예를 들어, SMD 부품의 동박면에 미리 솔더크림을 바르고, 부품을 얹은 다음 고열을 가해 크림을 녹이므로써 단단한 납으로 변하여 고정됩니다. 이는 기존의 타입에 비해서 부품 패키지가 작아지므로 칩 자체의 성능이 개선될 뿐만 아니라, PCB 입장에서도 홀이 없어 배선이 용이하고 부품의 실장 개수도 증가하며 전반적으로 성능이 개선됩니다.


두번째는 중급용 보드(Enhanced Features)입니다. 향상된 기능과 빠른 성능을 요구하는 좀 더 복잡한 프로젝트에 적합합니다. 이러한 이유로 입출력 핀은 입문용 보드보다 훨씬 많습니다. 대표적인 보드로는 MEGA, DUE, MEGA ADK, PRO, M0 등이 있습니다.

세번째는 사물인터넷(Internet of Things; IoT)에 쉽게 이용할 수 있는 보드로 인터넷에 연결할 수 있는 기능을 제공합니다. 예를 들어, YUN, ETHERNET, TIAN, Industrial101, MKR1000, YUN Mini 보드 등이 여기에 해당합니다. 이외에도 교육 목적이나 Wearable, 3D printing 용도의 보드들도 선보이고 있습니다.

위와 같은 보드(board) 이외에도 모듈(module)과 쉴드(shield)가 있습니다. 모듈과 쉴드는 보드와 흡사하지만 차이가 있습니다. 먼저 모듈은 사용자의 보드에 장착할 수 있도록 핀헤더가 마련된 것이 대부분이고, 이 모듈은 사용자가 원하는 기능을 업로드하여 자체적으로 동작합니다. MICRO, NANO, MINI 보드가 모듈에 해당합니다.

반면에 쉴드는 아두이노 보드에 장착할 수 있는 사용자의 확장 보드로 스스로 동작할 수는 없습니다. 예로써 MOTOR Shield는 아두이노 보드를 이용하여 실제 모터를 구동하기 위해서 제작한 응용 보드입니다. 때로는 사용자가 전자 회로를 직접 꾸밀 수 있도록 PROTO Shield도 제공하는데 이는 PCB만 제공하는 것으로, 핀아웃(Pinout) 배열이 같아 아두이노 보드에 Stack 형태로 장착할 수 있으며 몇가지의 footprint를 만들어 놓아 IC나 저항 등과 같은 소자들을 쉽게 남땜할 수 있습니다.

다음은 대표적인 Arduino 보드를 비교하였습니다.

보드

Microcontroller

동작전압

디지털 I/O

PWM

아날로그I/O

Flash[KB]

SRAM[KB]

EEPROM[KB]

Clock[MHz]

크기[mmxmm]

 특징

Uno

 ATmega328

5

14

6

6

32

2

1

16

68.6x53.4

가장 보편적

Leonardo

 ATmega32u4

5

20

7

12

32

2.5

1

16

68.6x53.3

 컴퓨터 주변장치 인식 가능

Micro

 ATmega32u4

5

20

7

12

32

2.5

1

16

48.0x18.0

 

Nano

 ATmega328

5

22

6

8

32

1

0.51

16

45.0x18.0

 

Mini

 ATmega328

5

14

 

6

32

2

1

16

30.0x18.0

작지만 업로드시 별도의 FTDI 모듈 필요 

Due

 Atmel SAM3X8E

3.3

54

12

12

512

96


84

102.0x53.3

 강력한 프로세싱

Mega

 ATmega2560

5

54

15

16

256

8

4

16

102.0x53.3

다수의 장치 연결 가능 

M0

 Atmel SAMD21

3.3

20

12

6

256

32


48

68.6x53.3

 

Yun Mini

 Atheros AR9331

3.3

20

7

12

32

2.5

1

400

71.1x23.0

Ethernet과 WiFi 가능

Ethernet

 ATmega328

5

20

4

6

32

2

1

16

68.6x53.4

 

Tian

 Atmel SAMD21,

Atheros AR9342

5

20

12


16000

64000


560

68.5x53.0

 

Mega ADK

 ATmega2560

5

54

15

16

256

8

4

16

102.0x53.3

 안드로이드 연결 가능

M0 Pro

 Atmel SAMD21

3.3

20

12

6

256

32


48

68.6x53.3

 

Industrial 101

 ATmega32u4,

Atheros AR9331

5

7

2

4

16000

64000

1

400

51.0x42.0

 

Leonardo Ethernet

 ATmega32u4,

W5500

5

20

7

 12

 32

 2.5

 1

 16

 68.6x53.3

 

MKR1000

 ATSAMW25

3.3

8

12

 7

 256

 32

 

 48

 64.6x25.0

 


자세한 비교 정보는 다음의 링크를 참조하시기 바랍니다.

https://www.arduino.cc/en/Products/Compare



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


This table is the comparison result between AVR and STM32 series in terms of only flight controllers or ESCs for Drone. Recently STM32 series of Microelectronics is mainly employed.


다음 표는 오직 드론(Drone)의 비행제어기(FC) 혹은 ESC의 설계를 위한 자주 사용되는 Atmel사와 최근 사용이 두드러지는 STMicroelectronics사의 Microcontroller의 비교자료입니다.


 Manufacturer

 Atmel (8-bit)

 STMicroelectronis (32-bit)

 Microcontroller

AVR8

AVR328P

STM32F103

STM32F205

STM32F407

STM32F446

 FPU

 

 

 

 

 

 YES

 F.max [MHz]

 16

20 

 72

120 

 168

180

 SRAM [Bytes]

 1K

2K 

 20K

?128K 

?192K (CCM 64K)

128K

 EEPROM [Bytes]

 512

1024 

 

512

 

 

 Flash [KB]

 8

32 

 64 or 128

1M

1M

512K

VCC [V] 

 4.5~5.5

1.8~5.5 

2.0~3.6

1.8~3.6

1.8~3.6 

1.7~3.6

 8bit timer(counter)

2

2

-

-

-

-

16bit timer(counter) 

1

1

3

12

12

12

32bit timer(counter)

 

 

 

2

2

2

 16bit motor control PWM timer

-

-

1

 

 

 

SysTick timer 24bit downcounter

-

-

1

 

 

1

watchdog timers

 

 

2

 

 

2

 PWM channel

3

6

?6

 

 

 

 ADC

8 (10-bit)

8 (10-bit) 

 16 (2 x 12-bit)

24 (3 x 12-bit)

24 (3 x 12-bit)

24 (3 x 12-bit)

 DAC

 

 

 

2 x 12-bit

2 x 12-bit

2 x 12-bit

 Analog Comparator

YES

YES

 

 

 

 

 TWI(I2C)

YES

YES

YES

YES

YES

YES

 USART

YES

YES

YES

YES

YES

YES

 SPI

YES

YES

YES

YES

YES

YES

 CAN

 

 

YES

YES

YES

YES

 USB 2.0

 

 

YES

YES

YES

YES

 In-System Programming

YES

YES

 

 

 

 

8- to 14-bit parallel camera interface

 

 

 

48 Mbytes/s 

54 Mbytes/s

54 Mbytes/s

Package

 TQFP 32

TQFP 32

 

 

 

 



'Embedded Programming > STM32 Cortex-M4' 카테고리의 다른 글

STM32 MCU 누클레오 보드  (0) 2018.01.12
Discovery vs. Nucleo board  (1) 2018.01.11
STM32F4 시리즈의 소자 구별 방법  (0) 2018.01.03
STM32F405xx 스펙 요약  (0) 2017.11.17
왜 STM32가 유리한가?  (0) 2015.12.02
Posted by Nature & Life


ESC(electronic speed controller)를 설계할 때 왜 STM32가 유리한가요?


  • High side와 low side에 PWM이 automatic dead-time이 추가를 허용하는 일차적인 FET 제어기로서 TIM1을 사용할 수 있고 다른 이득 등을 제공합니다.

  • 저 비용의 개발 툴

In-Circuit Debugger/Programmer

  • 컴파일러로써 ARM GCC

  • SWD 프로그래밍/디버깅

  • I2C, CAN 지원

  • PWM 제어

  • 클럭 정밀도

정밀한 클럭은 일부 외장 오실레이터(oscillator) 타입을 요구합니다. STM32 내부 오실레이터의 정밀도는 1% 이내입니다. 이는 closed loop 실제 속도, PWM 주파수 정밀도 그리고 timing에 연관된 어떤 보고된 값들에 영향을 줍니다. 또한 이는 UART 최대 통신 속도에 어떤 밀접한 관계를 갖을 것입니다.

일차적인 클럭 속도는 72MHz의 외장 부품을 사용할 수 있지만 내부 오실레이터를 사용할 때 64MHz로 제한됩니다. 이는 64MHz에서 보드상에 프로세싱 파워가 충분하기 때문에 문제가 되질 않습니다.

  • UART

오픈 소스 커뮤너티에서 요구하는 것처럼 USART에 완전한 FTDI 접근을 합니다. 이를 사용하여 CLI(시리얼 터미널과 같은 Command Line Interface)가 구현될 수 있습니다.

  • 모든 FET 상에 게이트 저항

이는 FET turn-on 특성에 정밀한 제어를 할 수 있습니다. FET를 천천히 켜는 것(높은 게이트 저항)은 FET 상에 손실을 증가시킵니다. 그러나 전압 버스에 고주파 잡음을 엄청나게 줄일 수 있습니다. FET를 빠르게 켜는 것(낮은 게이트 저항)은 FET의 손실을 감소시키지만 전압 버스 상에 엄청난 잡음을 증가시킬 것입니다. 이것은 마이크로컨트롤러의 reset, 버스 커패시터 사이즈 그리고 다른 잡음 관련된 설계 결정 이슈에 큰 영향을 줍니다. Dead-time에 관련하여 너무 짧다면, 느린 FET는 실제로 위험할 수 있습니다.

  • 최근에 AVR 시리즈와 같이 STM32 시리즈도 Arduino 환경을 지원합니다.

  • 특히 Cortex M4 경우에 100% C 언어 프로그램이 가능합니다. 고성능의 high end 급의 소형 마이크로컨트롤러로 RISC, Pipeline 등의 구성으로 사실상 assembly 코딩이 불가능하지만, 다른 마이크로컨트롤로 달리 C 언어를 완벽하게 지원하여 assembly의 이해가 필요 없다는 것입니다. 기존의 마이크로컨트롤러는 C 언어를 지원하여도 최상의 성능을 위해서는 assembly 코딩이 불가피하지만 Cortex M4는 의미가 없으며 C 언어에서 지원하지 않은 명령어에 대해서는 intrinsic 함수로 assembly 코드로 1:1 변환하며, 디버깅 시에 C 언어 소스 코드가 의도한 assembly 코드로 올바르게 컴파일 되었는지 확인할 수 있는 정도의 assembly 언어 지식이 요구됩니다.



'Embedded Programming > STM32 Cortex-M4' 카테고리의 다른 글

STM32 MCU 누클레오 보드  (0) 2018.01.12
Discovery vs. Nucleo board  (1) 2018.01.11
STM32F4 시리즈의 소자 구별 방법  (0) 2018.01.03
STM32F405xx 스펙 요약  (0) 2017.11.17
AVR vs. STM32 comparison for Drone  (0) 2015.12.04
Posted by Nature & Life



Assembly어의 문장 형식

- AVR Assembly어 문장은 총 4부분으로 나누어집니다.

- Comment를 제외하고 120문자까지 사용할 수 있습니다.



1) Label(레이블)

- ':(콜론)'으로 끝납니다.

- 점프할 곳이나 서브루틴의 위치, 데이터 메모리와 RAM에서 데이터가 저장된 위치(주소)의 이름입니다.

- 내부적으로는 label은 16비트 주소값을 갖는 포인터 변수입니다.


2) Instruction(명령어)

- mnemonic(니모닉)과 directive(지시어)로 구별됩니다.

    • mnemonic - 실질적인 명령을 수행하는 명령어입니다(예제1을 참고).

    • directive - 주변 환경변수 등을 지정하는 명령어입니다(예제2를 참고).


3) Operand(오퍼런드)

mnemonic에 대응하는 피연산자입니다.

- 숫자 상수 혹은 directive에 사용되는 수식 등이 옵니다.

- 명령어에 따라서 연산자의 갯수가 0~2개가 되며, 2개 연산자를 사용할 경우 ',(쉼표)'로 분리합니다.


4) Comment(코멘트)

- ';(세미콜론)'으로 시작되며 컴파일시 Assembler는 이를 무시합니다.

- 프로그램에 대한 주석을 넣는 부분입니다.

- C-언어와는 달리 Assembly어는 특히 가독성이 떨어짐으로 비록 스스로 짠 프로그램일지라도 나중에 유지 및 관리를 위하여 반드시 주석을 다는 습관을 들여야 합니다.







'Embedded Programming > Assembler' 카테고리의 다른 글

식별자와 상수  (0) 2014.06.16
Assembler의 장점  (0) 2014.06.14
Posted by Nature & Life



식별자 (identifier) : 변수명이나 label 명으로 사용할 수 있는 단어입니다.

- 사용가능한 문자들은 A~Z, a~z, 0~9, 그리고 _(underbar) 입니다.

- 식별자의 첫 자는 숫자를 사용할 수 없습니다.

- 255문자까지만 사용할 수 있습니다.

- C 언어와 달리 대소문자를 구별하지 않습니다.





상수를 표기하는 규칙입니다.

- 특별히 지정하지 않은 숫자는 10진수로 취급합니다.

- ASCII 문자는 인용부호(')로 시작해서 인용부호(')로 마칩니다.

- 문자열로 사용할 수 있는 문자는 프린트가 가능한 문자와 공백문자로 한정됩니다.

- 10진수가 아닌 경우는 아래와 같이 첨자로 표기합니다.



참고로 16진수의 경우에 0x와 $ 모두 16진수를 가리키는 첨자로 사용되며 0x의 0은 알파벳 'O'가 아닌 숫자 zero입니다. C 언어와 다르게 어셈블러에서는 간편함으로 $가 자주 사용됩니다.





'Embedded Programming > Assembler' 카테고리의 다른 글

Assembly어의 문장 형식  (6) 2014.06.26
Assembler의 장점  (0) 2014.06.14
Posted by Nature & Life
Embedded Programming/AVR 2014. 6. 14. 19:05



다양한 AVR 칩의 Package 타입의 실물 사진입니다.







'Embedded Programming > AVR ' 카테고리의 다른 글

변수 vs. 메모리  (0) 2014.04.20
AVR의 메모리 구조  (3) 2014.04.20
AVR이란?  (0) 2014.03.11
부트로더란?  (0) 2012.12.10
Posted by Nature & Life



과거에는 PC DOS 응용프로그램 개발시 어떻게 메모리를 효율적으로 관리하느냐가 관건이었던 적이 있습니다. 당시에는 메모리 집적기술의 한계로 PC에 1Mbyte를 설치하였다면 큰 자랑꺼리였으며 가격도 비쌌던 시절였습니다. 그러므로 응용프로그램은 DOS가 사용하는 영역의 나머지인 상위메모리를 사용하곤 하였습니다.


하지만 근래에는 메모리가 부족하여 응용프로그램을 실행하지 못하는 경우는 거의 없습니다. CPU의 속도와 메모리 용량 그리고 대용량 하드디스크의 발전은 더이상 가독성이 떨어지는 낮은 수준(low level)의 언어 사용은 물론 엄격한 메모리 관리의 부담을 덜어주게 되었습니다.


그러므로 언제부턴가 어셈블러(ASM)나 C-언어가 아닌 사용자에 즉, 사람에게 친숙한 높은 수준(high level)의 언어인 비쥬얼베이직(Visual Basic), C++ 언어 등이 대세가 되었습니다. 그럼에도 불구하고 AVR이나 PIC계열의 마이크로콘트롤러(MCU)에서는 여전히 낮은 수준의 프로그램 언어를 사용하고 있습니다.


MCU의 속도나 메모리 용량 등과 같은 성능의 발전과 avr-gcc와 같은 컴파일러의 지속적인 향상에 힘입어 요즈음은 어셈블러보다는 C-언어를 선호하게 된 것도 사실입니다. C-언어로 작성해 굳이 오버헤드(overhead)가 있을지라도 속도와 메모리 같은 개선된 MCU 성능으로 적용하는데 크게 문제가 되지 않은다는 것입니다.


하지만 아직도 상업적인 용도의 AVR 펌웨어(firmware)는 여전히 어셈블러를 사용하고 있습니다. 고성능의 MCU를 사용하여 단가를 높이기 보다는 합리적인 성능의 자원에 펌웨어를 어셈블러로 정교하게 작성하고 최적화하여 시장 경쟁력을 얻는다는 것입니다.





그러므로 어셈블러는 적어도 한번은 다루어봐야 하는 언어로 C-언어와 비교하여 다음과 같은 장점을 갖습니다.


1) 새로운 언어를 배운다는 스트레스는 문법을 익혀야 한다는 부담일 것입니다. 하지만 어셈블러는 문법이 C-언어에 비해서 매우 간단하다는 것입니다. 어셈블러는 원하는 코드 구현 자체가 까다로운 것이지 문법을 처음 익히기는 매우 쉽다는 것입니다. 


구현이 까다롭다는 것은 하드웨어에 대해 일일이 알아야 한다는 것과 아마도 120여개에 이르는 다양한 AVR 명령어가 존재하기 때문일 것입니다. 그러나 다양한 명령어는 기능이 유사한 소위 파생된 명령어로 인하여 용도별로 분류하면 사실상 몇 종류가 되지 않으며, 필요시 그때 그때 가져다 사용하면 됩니다.


2) 어셈블러를 다루면 특히 메모리 영역과 같은 하드웨어를 자세하게 익힐 수 있으며 이러한 지식은 향후 C-언어로 구현시 최적화된 코드를 생성할 수 있는 기회를 제공한다는 것입니다.


기존의 C-언어에서는 하드웨어를 자세히 다룰 필요는 없었습니다. 왜냐하면 사용코자 하는 AVR를 지정하면 컴파일러가 알아서 해주기 때문입니다. 메모리가 부족하면 컴파일러는 이를 사용자에게 일러주고 사용자는 불필요한 변수를 삭제해주면 되었기 때문입니다.


3) 정밀한 타이밍을 요구하는 펌웨어를 작성할 수 있습니다. 


어셈블러 명령어는 1~2 사이클의 클럭을 필요로 하며 사용자는 이를 직접 보면서 다루기 때문입니다. 하지만 C-언어를 사용할 때는 해당코드가 컴파일 후에 얼마의 클럭을 요구하는지 알 수가 없고, 알아낸다 하더라도 1us 정도의 정밀한 타이밍은 사실상 불가능하다는 것입니다. 예를 들어, 브러쉬리스(brushless) 모터를 제어시에 C-언어로 작성된 펌웨어는 고속 회전 영역에서 제어 불능상태가 될 수 있다는 것입니다.







'Embedded Programming > Assembler' 카테고리의 다른 글

Assembly어의 문장 형식  (6) 2014.06.26
식별자와 상수  (0) 2014.06.16
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