부트로더를 직접 굽는 날이 올줄이야…
아두이노 Pro Mini 보드를 제작할 일이 생겨서 부트로더를 구울 기회(?)가 생겼습니다. 주문했던 ISP Programmer 모듈이 도착하지 않아 부랴부랴 아두이노 UNO 보드를 이용해서 부트로더를 구웠습니다.
이리저리 자료를 찾아봤는데.. 맘에 쏙 드는 자료가 잘 없었네요. 가장 유용하게 쓸만한 자료는 아두이노 공식 페이지에서 제공하는 자료입니다.
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 보드 연결
위 그림은 아두이노 공식 페이지에서 제공하는 연결 방법입니다. 주의하실 점은 아래가 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)으로 되어 있었습니다. 여하튼 문제가 생길 때 참고하세요.
안녕하세요.
글을 보고 댓글을 달아봅니다.
제가 이 방법대로 여러번 시도를 했는데 성공을 거두지를 못했습니다.
예전에 atmega328p-pu(dip 타입)로 된것은 성공을 거두었는데, Mega328p-au(smd타입)는 계속 실패를 하였습니다. 뭤 때문에 실패를 하는지도 모르겠습니다.
제가 잘 알 수 있도록 조언 부탁드립니다.
atmega328pu 타입과 au타입은 device signature가 다릅니다.
아마 부트로더 업로드시
avrdude: Yikes! Invalid device signature.
Double check connections and try again, or use -F to override
this check.
아래와 같은 에러가 뜰 것입니다.
이를 해결하려면 아두이노 설치경로에서 avrdude.conf 파일을 들어가신 후
atmaga328p부분의 sigmature를
signature = 0x1e 0x95 0x0F;
에서
signature = 0x1e 0x95 0x14;
로 변경하셔야 합니다.
안녕하세요 글 잘앍었습니다.!
그런데 부트로더 업로드중에 저한테 문제점이 있는듯 합니다. ..
저는 atmega328p au를 부트로더 업로드 하는 과정에서
Sk님께서 말씀하신것과같이
avrdude: Yikes! Invalid device signature.
Double check connections and try again, or use -F to override
this check.
이런오류가 나타났습니다.
signature를 수정하려고보니
signature = 0x1e 0x95 0x14; 로 되어 있어서
수정하지 않아도 됐었습니다…
아두이노는 1.8.1을 사용하고 있습니다.
아시는것이 있으시다면 조언 부탁드립니다…
MISO와 MOSI 두 핀이 바뀌면 그런 현상이 나타납니다.
저는 현재
avrdude: Device signature = 0xff00ff
avrdude: Expected signature for ATmega328P is 1E 95 0F
Double check chip, or use -F to override this check.
이러한 오류가 뜨면서 업로드가 불가합니다.
님처럼 셋팅 했는데도 불구하고 이런 오류가 자꾸 나네요.;;;