부트로더를 직접 굽는 날이 올줄이야…

아두이노 Pro Mini 보드를 제작할 일이 생겨서 부트로더를 구울 기회(?)가 생겼습니다. 주문했던 ISP Programmer 모듈이 도착하지 않아 부랴부랴 아두이노 UNO 보드를 이용해서 부트로더를 구웠습니다.

burning_bootloader

이리저리 자료를 찾아봤는데.. 맘에 쏙 드는 자료가 잘 없었네요. 가장 유용하게 쓸만한 자료는 아두이노 공식 페이지에서 제공하는 자료입니다.

http://arduino.cc/en/Tutorial/ArduinoISP

(여기서는 아두이노 UNO 보드를 이용해서 아두이노 Pro Mini 3.3v – 8MHz 보드를 굽는 방법을 설명합니다.)

Programmer 보드와 Target 보드

아두이노 보드를 이용해 부트로더를 구울 때 가장 중요한 것은 Programmer 보드와 Target 보드를 구분하는 것입니다.

Programmer 보드는 부트로더를 굽기위해 사용할 아두이노 UNO 보드를 말합니다. Programmer 보드에 일단 부트로더 굽기용 스케치(펌웨어)를 올리고 이것을 이용해 연결된 다른 보드의 부트로더를 굽습니다.

Target 보드는 부트로더를 구울 대상입니다. 직접 제작한 호환 보드일 수도 있고, ATMEL 칩으로 브레드보드 위에 만든 보드일 수도 있겠죠.

사전작업 – Programmer 보드에 스케치 올리기

일단 아두이노 UNO 보드에 부트로더 굽기에 사용할 스케치(펌웨어)를 업로드 해야 합니다. 아래 순서로 진행합니다.

  • 아두이노 UNO를 PC에 연결
  • COM 포트가 잡히면 [도구 – Serial Port] 에서 선택
  • [도구 – Board] 메뉴에서 Arduino UNO 선택 (Programmer 보드)
  • [파일 – 예제 – ArduinoISP] 선택
  • [파일 – 업로드]

아두이노 UNO 보드에 펌웨어를 올려야하니까 보드 종류를 Arduino UNO(Programmer 보드)로 선택해야 합니다. 업로드가 정상적으로 완료되면 일단 UNO 보드와 PC의 연결을 해제합니다.

Programmer 보드 – Target 보드 연결

arduinoisp

위 그림은 아두이노 공식 페이지에서 제공하는 연결 방법입니다. 주의하실 점은 아래가 Programmer 보드이고 위가 Target 보드라는 점입니다!!

5V, GND, D11, D12, D13 (SPI) 핀들이 서로 연결되고, Programmer 보드의 D10 핀이 Target 보드의 Reset 핀으로 연결됩니다.

제 경우에는 아두이노 Pro Mini 3.3v 보드의 부트로더를 굽기 때문에 5V 핀 대신 (3.3v – VCC) 핀을 서로 연결했습니다.

부트로더 굽기

  • 아두이노 UNO 보드를 연결
  • [도구 – Board] 메뉴에서 [Arduino Pro or Pro Mini (3.3v, 8MHz) w/ ATmega328] 선택 (Target 보드 종류를 여기서 선택합니다 !!!)
  • [도구 – Serial Port] 에서 아두이노 UNO 보드의 COM port 선택
  • [도구 – 프로그래머] 에서 Arduino as ISP
  • [도구 – 부트로더 굽기] 실행

부트로더 굽기 완료가 에러메시지 없이 뜨면 성공입니다. 아마 13번 핀에 연결된 내장 LED 가 깜빡일겁니다. 기본으로 간단한 Blink 예제가 올라가 있을테니까요.

주의사항

아두이노 공식 페이지의 설명에서는 아두이노 Duemilanov(단종된 보드;;)를 사용합니다. 아두이노 UNO 보드를 이용해서 부트로더를 올리는 경우는 auto reset 기능 때문에 부트로더 굽기가 실패한다고 합니다. 이 경우는 Target 보드의 GND-Reset 핀 사이에 10uF 커패시터를 달아주면 된다고 합니다.(부트로더 굽기용 펌웨어 올린 후에) ==> 그런데 제 경우에는 이 작업없이도 부트로더 굽는데 성공했습니다. 혹 실패하시는 분은 참고하세요.

Note for Arduino 1.0: 아두이노 UNO 보드에 올릴 펌웨어 (ArduinoISP code)를 약간 바꿔줘야 합니다. heartbeat() 함수를 찾아서 그 안에 있는 “delay(40);” 부분을 “delay(20);” 으로 변경해 줍니다. 이 부분도 조금 이상한게… Arduino 1.o 이 아두이노 IDE 버전을 말하는거 같은데.. 제가 사용한 Arduino IDE v1.0.5 r2 버전에서는 이미 delay(20)으로 되어 있었습니다. 여하튼 문제가 생길 때 참고하세요.