아두이노

보드

아두이노의 보드 아트멜(Atmel)사의 8비트 AVR 마이크로컨트롤러와 프로그래밍 및 다른 서킷들과의 결합을 용이하게 해 주는 부속품들로 구성되어 있다. 공식 보드의 마이크로컨트롤러에는 주로  ATmega8, ATmega168, ATmega328과 같은 megaAVR 시리즈가 주로 사용된다. 보드에는 기본적으로 5V 리니어 레귤레이터와 16MHz 결정 진동자(크리스털)가 내장되어 있으며, 프로그램의 업로드를 용이하게 하기 위한 부트로더가 마이크로컨트롤러에 미리 내장되어 있다.
개념적인 수준에서 볼 때, 아두이노에 프로그램을 탑재함에 있어 모든 보드는 RS-232 직렬 커넥터를 통해 프로그램되지만, 구현되는 방식은 하드웨어의 버전에 따라 달라진다. 직렬 아두이노 보드는 RS-232 수준의 신호를 TTL 수준의 신호로 변환해주는 변환 장치(Shifter)를 내장하고 있다. 지금의 아두이노 보드들은 모두 USB를 통해 프로그래밍 가능하며, FT232와 같은 USB-시리얼 변환 칩을 통해 사용 가능하다.
아두이노 보드는 마이크로컨트롤러 I/O핀의 대부분을 다른 서킷에서도 사용할 수 있도록 공개하고 있다.  Diecimila, Duemilanove, 현재의 Uno와 같은 주요 모델들은 14개의 디지털 I/O핀을 제공하고 있으며, 그 중 6개의 핀은 PWM(pulse-width modulated)신호를, 다른 6개의 핀은 디지털 I/O핀으로 혼용이 가능한 아날로그 입력 단자를 제공한다.

아두이노 업로드

아두이노 우노의 경우 기계어 코드의 업로드는 시리얼 통신을 통해 이루어진다. 우선 개인용 컴퓨터와 USB로 연결되면 ATmega16U2(초기의 FTDI FT232R와 같은 역할로 USB-Serial 변환)에 의해 시리얼로 변환된다. 업로드의 전제 조건은 목표 마이크로컨트롤러(우노의 경우 ATmega328P)에 부트로더가 장착되어 있어야 한다. 부트로더가 동작하면 시리얼 통신으로 부터 오는 기계어 코드를 플래시 메모리에 쓰게 되어, 프로그래밍에 의해 완성된 응용 프로그램 코드가 장착된다. 응용 프로그램의 코드를 변경할 필요가 없다면, 전원 인가와 동시에 마이크로컨트롤러에 장착된 코드가 실행되면서 원하는 동작을 한다. 리셋 신호 입력시 부트로더는 플래시 쓰기를 할 것인지 또는 응용 프로그램을 바로 실행할 것인지를 선택적으로 결정하고 동작한다. 만약 플래시에 코드를 새로 써서 다시 변경할 필요가 없다면 응용 프로그램으로 바로 점프한다. 아두이노 통합 개발 환경에서 업로드가 실행되면, 부트로더가 동작하기 위해 그림의 (1)번 DTR 신호가 타겟 마이크로컨트롤러에 전달되어 리셋되고 부트로더가 실행된다. 리셋 신호를 ATmega16U2에서 전달하기 위해 캐패시터(0.1~0.22uF)를 사용하여 타깃과 연결되어 있다. 코드를 포함한 여러가지 데이터를 전달하기 위한 신호는 그림의 (2)번 선으로 이루어진다.

아두이노 업로드 후 응용 프로그램 실행

업로드가 완료된 후, 다시 리셋 되면 부트로더는 응용 프로그램이 존재하는 메모리의 주소를 선택하여 점프한다. 이 과정을 통해 응용프로그램이 선택되어 동작한다. 응용 프로그램에서 시리얼 통신(Serial 클래스 사용)을 사용했다면 코드가 실행되면서 시리얼 통신이 이루어진다. 이때 그림의 (2)번 선으로 시리얼 통신이 이루어진다. 부트로더 동작 시, 응용프로그램 코드를 플래쉬에 쓰기 위한 코드 데이터 전송 통로와 응용 프로그램의 데이터 전송하는 신호의 통로는 같은 신호 선을 사용하여 전달 된다.

아두이노 부트로더

AVR 칩을 사용한 아두이노의 부트로더는 AVR의 부트로더 체계를 사용한다. 따라서 아두이노의 부트로더는 AVR의 부트로더와 같은 의미이다. 아두이노의 개발 방법은 기본적으로 부트로더가 장착되는 방식을 사용하므로 부트로더를 기본적으로 장착한다. 따라서 퓨즈 비트를 부트로더가 실행 되도록 설정되고, 부트로더에서 플래시에 응용 프로그램 코드를 쓸지 아니면 코드 변경없이 바로 0번지의 응용 프로그램으로 점프해서 실행할지를 결정한다. 개발 과정에서는 수 많은 코드 변경이 필요하므로 부트로더가 수시로 작동 하여야 하기 때문이다. 따라서 부트로더를 아예 장착되어 있고, 코드 실행 위치 벡터 및 크기가 결정되어 레지스터 비트 값이 퓨징 되어있다.
설정되는 비트는 다음 파일에서 확인할 수 있다:
[아두이노 설치 폴더]/hardware/arduino/avr/boards.txt
uno.name=Arduino Uno
...
uno.bootloader.tool=avrdude
uno.bootloader.low_fuses=0xFF
uno.bootloader.high_fuses=0xDE
uno.bootloader.extended_fuses=0x05
uno.bootloader.unlock_bits=0x3F
uno.bootloader.lock_bits=0x0F
uno.bootloader.file=optiboot/optiboot_atmega328.hex

쉴드

쉴드(Shield)는 특정 기능을 갖는 보드로, 아두이노와 결합하여 호환 가능한 여러 부가 모듈과 연결하는 커넥터 구조를 포함한 부품이다.  특정 입출력 기능을 담당하는 부품으로, 아두이노에서 중요한 부품 중 하나이다. 아두이노의 입출력 커넥터에 연결할 수 있는 커넥터를 사용하고 각 부분품은 커넥터에 연결함으로써 적층 구조로 서로 연결한다.
아두이노 MCU 보드는 마이크로컨트롤러 기능 만 존재하기 때문에 센서나 기타 입출력 장치가 필요한 경우가 생긴다. 따라서 이 모듈들을 연결하는 방법으로 쉴드를 사용할 수 있다. 쉴드가 연결되면 커넥터를 통해 각 층으로 모든 필요한 핀이 연결된다. 아두이노 쉴드는 보드와 보드를 결합하여 여러가지 기능적 모듈들을 연결하는 방식이다.
연결 핀들이 위와 아래로 연결되면서 각 층에서 모두 사용할 수 있도록 구성되었다. 따라서 각 핀의 기능의 중복은 개발자가 판단하여 각층에서 선택적으로 사용하여야 한다.
몇몇 쉴드는 다른 복잡한 핀들을 거쳐서 보드와 직렬로 연결되지만, I²C 시리얼 버스를 사용하는 경우 고유 주소를 할당받을 수 있기 때문에 병렬로 연결하여 사용할 수 있다.

라이브러리

아두이노는 AVR의 ATmega의 MCU을 기반으로 만들어진 것이므로 ATmega의 내에 장착된 기본 모듈을 함수 화하여 쉽게 접근할 수 있다. 이외에 다른 여러 가지 부품을 적용할 수 있도록 다양한 라이브러리가 존재한다.
아두이노 개발 IDE에 기본적으로 내장된 라이브러리도 있고, 외부의 많은 공개 라이브러리가 존재한다.

표준 함수의 사용 예 : printf

마이크로컨트롤러는 보통 입출력 장치가 컴퓨터와 다르다. PC에서 사용하는 모니터와 키보드를 보통 사용하지 않는다. 시리얼 통신으로 별도의 컴퓨터로 연결하여 사용하는 방식이 일반적이다. 따라서 표준 입력장치가 없을 때, 시리얼 통신을 사용하여 printf 함수에서 완성된 스트링을 출력할 수 있다. 즉, printf 결과를 개발자가 원하는 장치로 연결할 수 있다. 시리얼 통신 뿐만 아니라, 문자-LCD 등 원하는 장치로 출력할 수 있다.
아두이노는 avr-gcc를 사용하므로 이 규칙에 맞추어 사용하면 된다.
#include <stdio.h>// 우선 FILE 선언을 사용하고, UART와 연결하여 사용한다.static FILE uartout = {0} ;// printf에서 완성된 스트링을 한 글자 씩 출력하는 함수가 있어야 한다.// 스트링을 한바이트 씩 출력한다.static int uart_putchar (char c, FILE *stream){
    Serial.print(c);  // 원하는 장치로 출력 한다.
    return 0 ;}void setup(void){
   Serial.begin(9600);  // 시리얼을 시작한다.

   // UART 출력을 위한 FILE 디스크립터를 사용한다.
   fdev_setup_stream (&uartout, uart_putchar, NULL, _FDEV_SETUP_WRITE);
   stdout = &uartout ;  // 표준 출력 STDOUT을 선언한다.}void loop(void){
    float seconds ;

    seconds = (float) millis() /1000.0;
    printf("%d sec\n", (int) seconds);

    delay(1000) ;  // 1초를 기다리고}

상표권 분쟁

상표권 분쟁으로 인해 2015년 5월 Arduino LLC에 의해 "Genuino"란 상표가 등록 되었고 미국 이외에 시장에서 Arduino LLC의 브랜드 이름이다.

예제

전형적인 스케치의 예는 LED를 점멸시키는 "blink"라는 구문이다. Arduino 언어는 사용자가 이와 같이 작성하면 된다.
아두이노 우노 R3에서는 LED가 13번 핀에 연결되어 있다. 따라서 다음과 같이 코딩하면 별도의 하드웨어 추가없이 우노에서 확인할 수 있다.
#define LED_PIN 13void setup () {                     //처음 시작 할때만 실행
    pinMode (LED_PIN, OUTPUT);     // 13번 핀을 디지털 출력 핀으로 설정}void loop () {                        // 아래의 명령문을 반복
    digitalWrite (LED_PIN, HIGH);    // LED 점등
    delay (1000);                   // 1000ms(1초) 대기
    digitalWrite (LED_PIN, LOW);   // LED 소등
    delay (1000);                 // 1000ms(1초) 대기}