아두이노 부트로더

위키배움터

아두이노 체계에서 프로그램 된 코드는 업로드 방식을 사용한다. 업로드는 AVR이나 ARM 등을 기반으로 하는 마이크로컨트롤러를 기반으로 하는 부트로더 방식을 사용한다. 즉, AVR을 사용한 아두이노는 이 칩의 부트로더 방식을 사용하여 업로드가 이루어 진다.

개요[편집]

아두이노의 부트로드는 결국 장착된 마이크로컨트롤러의 부트로더를 사용하므로 새로 만들려면 먼저 부트로더를 장착해야 한다.

만약 어떤 새로 구입한 AVR 칩을 아두이노에서 동작 시키려면 우선 이 칩에 부트로더를 써야하고 이를 통해 시리얼 통신 채널을 통한 업로드가 가능하다.

부트로더가 장착된 마이크로컨트롤러는 UART 통신만 호스트와 연결한다면 아두이노가 되는 것이다.

아두이노 우노의 경우 ATmega328P의 타켓 마이크로컨트롤러의 부트로더에 의해 업로드가 이루어진다.

아두이노 우노 R3, 업로드 구조

부트로더 쓰는 과정[편집]

ISP나 기타 장치로 쓸 수 있으나 기존의 아두이노를 사용하여 다른 칩이나 아두이노 보드의 칩에 쓸수 있다. 아두이노를 이용하여 프로그래머를 만들려면 가장 먼저 필요한 일은 아두이노가 ISP가 되는 것이다. 이것이 장착되면 Arduino as ISP로 이름 붙여진 프로그래머가 된다.

아두이노 우노로 'Arduino as ISP' 만들기[편집]

ATmega8-16P 칩을 사용할 경우, 부트로더는 다른 아두이노를 사용하여 부트로더를 쓸 수 있다.

이제 아두이노 우노를 ISP을 만들어 ATmega8의 굽기 프로그래머로 만드는 과정이다.

아두이노 우노 ArduinoISP 용 스케치 선택
아두이노 우노 ArduinoISP 용 스케치 선택
아두이노 우노 ArduinoISP 업노드 완료
아두이노 우노 ArduinoISP 업노드 완료
아두이노 우노 ArduinoISP 용 스케치 선택 아두이노 우노 ArduinoISP 업노드 완료

아두이노 우노를 사용해 부트로더를 굽는 순서는 다음과 같다:

  1. 아두이노 우노를 호스트에 연결하고
  2. 아두이노 우노를 Arduino as ISP 기능의 프로그래머로 만든다.
    1. 아두이노 IDE에서 메뉴 : 파일 -> 예제 -> ArduinoISP을 선택하여 프로그램을 준비한다.
    2. 컴파일과 업로드를 거치면 아두이노 우노는 프로그래머가 되었다.
  3. 굽기 위한 칩에 맞는 보드가 있는지 검토하고 없다면 보드를 추가(boards.txt 파일에 추가)한다.
  4. 다른 아두이노 보드나 브레드 보드에 해당 칩을 연결하고 프로그래머와 SPI통신을 연결한다.
  5. 만약 칩에 맞는 보드를 추가 했다면, 아두이노 IDE을 다시 실행해야 한다.
  6. '프로그래머'을 Arduino as ISP 선택한다.
  7. 해당 칩의 보드를 선택한다. 여기서의 보드는 업로드할 때와 같은 보드를 말한다.
  8. 부트로더 굽기를 실행한다.

ATmega328P의 경우[편집]

ATmega328P 칩의 경우는 아두이노 우노와 같은 칩이다. 따라서 모든 설정은 우노를 사용하면 된다. 별도의 보드 추가없이 쉽게 진행할 수 있다.

우선 아두이노 우노를 프로그래머로 사용하기 위해 Arduino as ISP로 준비를 했다.

다음으로 브레드 보드에 ATmega328P 칩을 활용한 회로를 구성한다.

브레드보드 아두이노 ATmega328P 연결 모양

회로가 완성되면 아두이노 우노와 연결한다.

ATmega328P 부트로더 프로그래머 연결

부트로더 굽기[편집]

지금까지 준비한 'Arduino as ISP'와 하드웨어가 구성되었다면, 굽기에 들어간다.

ATmega328P 부트로더 굽기
ATmega328P 부트로더 굽기
ATmega328P 부트로더 굽기 완료
ATmega328P 부트로더 굽기 완료
ATmega328P 부트로더 굽기 ATmega328P 부트로더 굽기 완료

부트로드를 굽기위한 설정은 그림과 같이 설정한다:

  1. 보드 : Arduino UNO
  2. 직렬 통신 포트 설정
  3. 프로그래머 : Arduino as ISP

이제 부트로더 굽기를 실행한다.

별 문제 없이 완료되면 화면에 그림 처럼 나타난다. 문제가 있다면 대응을 해야 한다.

응용프로그램 작성 및 업로드[편집]

정상적으로 완료되면 USB2Serial를 사용하여 업로드 준비를 한다. 아두이노 USB2Serial를 사용 하였고, 경우에 FTDI 모듈을 사용하면 된다.

예제 프로그램을 사용하여 업로드를 확인하면:

ATmega328P 브레드보드 아두이노 Blink 업도드 완료

이제 LED가 깜박임이 보인다.

브레드보드 아두이노 ATmega328P와 USB2Serial 연결

ATmega168P의 경우[편집]

참고자료:

  • ATmega168P 부트로더 설정[1]

모델은 ATmega168PA[2]로 동작 주파수는 현재 16MHz을 사용하고 있다.

보드는 다음과 같이 추가하였다.

[아두이노 설치 폴더]/hardware/arduino/avr/boards.txt

##############################################################

atmega168pext.name=Arduino ATmega168P

atmega168pext.upload.tool=avrdude
atmega168pext.upload.protocol=arduino
#atmega168pext.upload.protocol=stk500
atmega168pext.upload.maximum_size=14336
atmega168pext.upload.speed=19200

atmega168pext.bootloader.tool=avrdude
atmega168pext.bootloader.low_fuses=0xff
atmega168pext.bootloader.high_fuses=0xdd
atmega168pext.bootloader.extended_fuses=0x00
atmega168pext.bootloader.path=atmega
atmega168pext.bootloader.file=atmega/ATmegaBOOT_168_diecimila.hex 
atmega168pext.bootloader.unlock_bits=0x3F
atmega168pext.bootloader.lock_bits=0x0F

atmega168pext.build.mcu=atmega168p
atmega168pext.build.f_cpu=16000000L
atmega168pext.build.core=arduino 
atmega168pext.build.variant=standard

부트로더가 굽기가 완료된 후, 아두이노 IDE에서 업로드는 보드 선택을 diecimila로 하면 된다. 경우에 따라 몇가지가 맞지 않는다면 적당한 보드를 선택해야 한다.

적용 예[편집]

  • Rainbow Ring LED 모듈[3]
이때 아두이노 IDE에서의 보드 선택은
Arduino Duemilanove or Diecimila
Arduino Duemilanove or Diecimila w/ ATmega168

ATmega8-16P의 경우[편집]

ATmega8는 동작 주파수가 8MHz가 존재한다. 그러나 현재 대상은 16MHz 칩인 ATmega8-16PU이다. 따라서 주파수가 다른 것을 고려하여 환경 설정을 해야한다.

여기서 사용한 AVR은 ATmega8-16PU[4]이다. 16MHz 주파수로 동작할 수 있는 마이크로컨트롤러이다.

아두이노 보드 추가[편집]

우선 부트로더가 장착되려면 해당 아두이노의 보드가 정의 되어야 한다. 기존에 설정되어 있다면 그대로 사용하면 되지만 없는 경우도 존재한다.

우선 아두이노 보드를 추가하기로 한다. 이를 위해 다음과 같은 파일에 보드 내용을 추가했다.

[아두이노 설치 폴더]/hardware/arduino/avr/boards.txt

##############################################################

atmega8.name=Arduino ATmega8-16MHz

atmega8.upload.tool=avrdude
atmega8.upload.protocol=arduino
atmega8.upload.maximum_size=7168
atmega8.upload.speed=19200

atmega8.bootloader.tool=avrdude
atmega8.bootloader.low_fuses=0xdf
atmega8.bootloader.high_fuses=0xca
atmega8.bootloader.path=atmega8
atmega8.bootloader.file=atmega8/ATmegaBOOT-prod-firmware-2009-11-07.hex
atmega8.bootloader.unlock_bits=0x3F
atmega8.bootloader.lock_bits=0x0F

atmega8.build.mcu=atmega8
atmega8.build.f_cpu=16000000L
atmega8.build.core=arduino
atmega8.build.variant=standard

이렇게 추가하고 저장하면 아두이노 IDE을 새로 실행해야 추가한 보드가 보인다.

아두이노 보드와 칩에 연결하고 굽기[편집]

이제 ATmega8과 우노를 SPI 통신이 되도록 연결한다.

연결이 완료 되었으면 부트로더 굽기 단계를 실행한다.

아두이노 부트로더 - 프로그래머 선택
아두이노 부트로더 - 프로그래머 선택
아두이노 부트로더 목표 보드 선택
아두이노 부트로더 목표 보드 선택
아두이노 부트로더 목표 보드 선택 아두이노 부트로더 - 프로그래머 선택

이제 굽기 실행한다.

아두이노 부트로더 굽기 실행 - ATmega8-16PU

문제없이 완료 되었다면 다음과 같다.

아두이노 부트로더 굽기 완료

오류의 예 및 처리 방법[편집]

플랫폼 설정에서 굽기 파라메터 설정 문제 - efuse설정[편집]

부트로더 굽기에서 ATmega8의 efuse 설정 문제

이 문제는 arduino IDE 1.6.5에서 efuse설정 파라메터가 존재하므로 이것을 제거한다. ATmega8에서는 필요없는 파라메터이다.

[아두이노 설치 폴더]/hardware/arduino/avr/platform.txt

##############################################################

# Arduino AVR Core and platform.
# ------------------------------
#
# For more info:
# https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.5---3rd-party-Hardware-specification

name=Arduino AVR Boards
version=1.6.8

# AVR compile variables
# --------------------- 

 ...

# AVR Uploader/Programmers tools
# ------------------------------

tools.avrdude.erase.params.verbose=-v
tools.avrdude.erase.params.quiet=-q -q
tools.avrdude.erase.pattern="{cmd.path}" "-C{config.path}" {erase.verbose} -p{build.mcu} -c{protocol} {program.extra_params} -e -Ulock:w:{bootloader.unlock_bits}:m -Uefuse:w:{bootloader.extended_fuses}:m -Uhfuse:w:{bootloader.high_fuses}:m -Ulfuse:w:{bootloader.low_fuses}:m

AVR Uploader/Programmers tools항의 tools.avrdude.erase.pattern="{cmd.path}" "-C{config.path}" {erase.verbose} -p{build.mcu} -c{protocol} {program.extra_params} -e -Ulock:w:{bootloader.unlock_bits}:m -Uefuse:w:{bootloader.extended_fuses}:m -Uhfuse:w:{bootloader.high_fuses}:m -Ulfuse:w:{bootloader.low_fuses}:m

이 부분을 제거하고 -Uefuse:w:{bootloader.extended_fuses}:m 저장한다.

그러나 이렇게 고치고 나면 다른 칩이나 아두이노 보드 적용에 문제될 수도 있다. 끝나면 복귀하는 것이 좋을 것이다. 다른 방법은

tools.avrdude.

을 다른 툴을 만들면 된다.

tools.avrdude1.

등으로 이름을 정하고 전체 내용을 복사한 다음 필요한 부분만 수정하면 된다.

boards.txt에서 위에 설정한 툴을 사용할 수 있다:

atmega8.bootloader.tool=avrdude1


잘못된 아두이노 보드(AVR 칩) 선택 문제[편집]

아두이노 부트로더 굽기에서 잘못된 AVR 칩 선택 오류

이 문제는 칩이 보드 선택이 잘못 되었다. 다시 선택하고, 굽기 실행한다.

같이 보기[편집]

각주[편집]

  1. ATmega168P 부트로더 설정
  2. Atmel 8bit AVR
  3. Rainbow Ring LED 모듈
  4. Atmel AVR-ATmega8