2008년 6월 9일 월요일

Arduino S3V3 bootloader

Arduino는 시리얼 포트(혹은 USB)를 통해 -ISP가 없이- 프로그램을 심을 수 있습니다. 단 이걸 가능하게 하기 위해 최초 한번 ISP로 AVR에 부트로더를 심어야 합니다. 기 조립된 Arduino를 구입하셨다면 이미 부트로더가 심어져 있으므로 이 과정이 필요 없습니다.

직접 만든 Arduino S3V3 에는 물론 부트로더가 없으므로 직접 심으셔야 합니다.

우선 ISP가 필요합니다. 제 경우, 가장 저렴하고 6pin 케이블이 포함되어 있기에, 페러럴 방식의?NT-ISP를 구입했습니다.



nt-isp_with_arduinos3v3.jpg

ISCP 포트에 1번 핀 위치에 주의하여 위와 같이 연결합니다.

다음은 Arduino Software를 다운 받습니다. "/arduino-0011/hardware/bootloaders/" 폴더에 AVR과 Arduino 종류에 따라 컴파일된 부트로더와 소스가 들어있습니다. Arduino 사이트의 Bootloader페이지를 참조해 보니 Arduino S/W에서 바로 부트로더를 심는 것이 가능합니다.
그런데..?안돼 -_-;

부트로더 소스와 함께 있는 Makefile을 까 보니 usip로 부트로더를 심는 방법을 찾을 수 있었습니다. ㄱㄱㅅ~
그래도.. 안돼 -_-;;

한참을 삽질하다 알아낸 것. NT-ISP는 Arduino사이트에서 말하는 패러럴 ISP와 다르다!! usip의 help를 차근차근 살펴보니 패러럴 ISP만 종류가 -전 다 똑같은 거라고 가정했었는데- 10여가지 되는군요.

패러럴 ISP의 종류를 잘못 지정한 경우 다운로드는 정상적으로 이루어 지는 것 처럼 보이지만 Verify에서 에러가 주루룩 나옵니다.
그래서.. 뭔데? -_-;;;

ISP를 새로 사야 하나? 걱정되었지만 결국 이 녀석으로 부트로더를 심는데 성공하였습니다. 우선 아래와 같이 "burn" 스크립트를 작성하였습니다.

부트로더의 makefile을 참조하였고, dprog를 "dapa"에서 "stk200"으로 수정하였습니다. stk200 찾느라 옵션의 패러럴 프로그래머들을 한번씩 다 해봤다능.

프로그래머(dprog) 옵션을 잘못준다고 망가지지 않습니다. :)

#!/bin/bash
uisp -dpart=ATmega8 -dprog=stk200 -dlpt=0x378 --wr_lock=0xFF
sleep 1
uisp -dpart=ATmega8 -dprog=stk200 -dlpt=0x378 --wr_fuse_l=0xdf --wr_fuse_h=0xca
sleep 1
uisp -dpart=ATmega8 -dprog=stk200 -dlpt=0x378 --erase --upload --verify if=$1 -v=2
sleep 1
uisp -dpart=ATmega8 -dprog=stk200 -dlpt=0x378 --wr_lock=0xCF

이제 다음과 같이 실행 합니다. 패러럴 포트에 직접 접근하기 위해 root 권한이 필요합니다.

/arduino-0011/hardware$ sudo ./burn bootloaders/atmega8/ATmegaBOOT.hex
Atmel AVR ATmega8 is found.
Writing lock bits ...
Reinitializing device
Atmel AVR ATmega8 is found.

Lock Bits set to 0xff
Atmel AVR ATmega8 is found.

Fuse Low Byte set to 0xdf

Fuse High Byte set to 0xca
AVR Direct Parallel Access succeeded after 0 retries.
Atmel AVR ATmega8 is found.
Erasing device ...
Reinitializing device
AVR Direct Parallel Access succeeded after 0 retries.
Atmel AVR ATmega8 is found.
Uploading: flash
################################
(total 1002 bytes transferred in 0.66 s (1511 bytes/s)
Polling: count = 16, min/avg/max = 2.24/4.94/8.38 ms
Verifying: flash
################################
(total 1002 bytes transferred in 0.58 s (1742 bytes/s)
Atmel AVR ATmega8 is found.
Writing lock bits ...
Reinitializing device
Atmel AVR ATmega8 is found.

Lock Bits set to 0xcf

이제 ISP 케이블을 제거하고 Reset 버튼을 누르면 LED 13 (사진의 노란색 LED)가 파라라락! 점멸하며 부트로더가 잘 심어졌음을 알립니다.

arduinos3v3_bootloader_on.jpg

?한줄요약 NT-ISP = STK-200

댓글 7개:

  1. Arduino 시작하기...

    마소에서 안윤호님의 'Arduino 보드를 소개하며'라는 글을 읽고 흥미를 가지게 되었는데 인터넷에 관련 글들이 많이 있었다. 특히, Suapapa 님의 Arduino 에서는 기판제작에서 bootloader 심기까지의 ...

    답글삭제
  2. [...] Arduino NG (Atmega 8)과 동일한 부트로더를 사용하면 되므로 이전 포스트에서 소개한 방법대로 부트로더를 심으시면 [...]

    답글삭제
  3. 오오옷! 대단하십니다. 이쪽 전공자신가봐요. ^^
    헐~~ 마냥 부럽다는. ^^ 여기서 많은 가르침을 받아야겠군요

    답글삭제
  4. digitypo님/ 네 이쪽? 관련 전공입니다.
    하지만 이곳에 포스팅하는 글들이 제 전공과 그렇게 관련이 있는지는 모르겠네요 ^^;;

    "네오. 너도 나처럼 곧 알게 될거야. 가야할 길을 아는것과 그 길을 걷는 것의 차이를" - 영화 'Matrix' 中 모피어스

    먼저 걸어가신 digitypo 님에게서 많이 배우고 있습니다.
    앞으로도 좋은 글 부탁드려요 :)

    답글삭제
  5. 어쩌다가 아두이노를 시작하게 되어서 suapapa 님의 게시글을 보고 따라하고 있습니다만... 비전공자라 그런지 세세한 부분에서 많이 막히는군요.
    몇가지 질문을 드리고 싶습니다.
    일단 suapapa 님과 똑같이 pcb 다림질 에칭으로 만든 s3v3와 똑같은 isp를 갖고 있습니다.

    1. tools>board 에서 어떤 보드를 선택해야 합니까?
    (저는 이것저것 다 해봐도 여전히 에러가 나네요;)

    2. dprog를 “dapa”에서 “stk200″으로 수정하였습니다 라고 하셨는데
    dprog 이 뭔지요;;; 일단 폴더 뒤지고 다 열어보니 burnpara.bat 가 같은 내용을 품고 있어 burnpara.bat 의 dapa를 stk200으로 수정했습니다만 맞게 한건지요?

    3. tools>bootloader 의 메뉴를 클릭하지 않고 suapapa님이 쓴 대로
    /arduino-0011/hardware$ sudo ./burn bootloaders/atmega8/ATmegaBOOT.hex
    를 sketch 에 입력하고 verify 해봤습니다만
    error: stray '$' in program
    이런 메세지가 나옵니다. 이유가 뭘까요?;

    답글삭제
  6. pashiran 님/ 사이트 잘 구경 했습니다. DIY 대마왕 님께서 비전공자라 굽쇼? :)

    1. tools>board 에서 "Arduino NG or older w/ ATmega 8"을 선택하세요.

    2. 3. 제가 부트로더를 굽기 위해 사용한 방법은 Makefile과 리눅스가 익숙한 사람을 위한 돌아가는 방법으로 pashiran님은 엉뚱하게 따라하신 듯 합니다. -_-;
    아두이노 스타일의 정석은 '작은태양'님이 소개해주신 바 있습니다.

    http://tinysun.tistory.com/8

    위 링크에서 "P-AVRISP (유저가이드)는 Arduino 의 Parallel Programmer (회로도) 와 다른 종류 이다..." 부분을 찾아 그 밑으로 따라 해 보세요.

    답글삭제
  7. 크.... 작은태양님 블로그도 봤는데 그 아래로는 왜 안읽었을까요;;;
    단박에 해결됐습니다. 감사합니다.

    답글삭제