마소에서 안윤호님의 '
Arduino 보드를 소개하며'라는 글을 읽고 흥미를 가지게 되었는데 인터넷에 관련 글들이 많이 있었다. 특히,
Suapapa 님의 Arduino 에서는 기판제작에서 bootloader 심기까지의 과정을 자세히 보여 주었고 STK200 호환의 패러렐 ISP 를 사용하기위한 고급수준의 방법도 소개하였다.
이것 저것을 보다가 Digitypo님의
Bootloading for a board as an Arduino 를 읽어 보고선 나도
Avrmall 의 ATmega168 보드를 구입하여 여기에 Arduino 부트로더를 심어보고 싶어졌다. 명성높은 Arduino Diecimila 를 큰 맘먹고 구입하고, Avrmall ATmega168 Board 는 물론 부트로더를 Burnning 하기위해 P-AVRISP 도 같이 구입하였다.
Arduino Diecimila (왼쪽) 와 Avrmall ATmega168 Board V2.1 (오른쪽)
Arduino Diecimila 밑면엔 이탈리아 지도가 그려져 있다.
앞의 Digitypo 님께서 사용한 USBISP V3.0 보다는 저렴하다. 하지만 이것은 패러렐포트용 이라서 PC 에 패러렐포트가 붙어 있는지 확인해야 한다.
MrKiss 님의 USBTiny 에서 USB용 ISP를 자작한 내용을 볼 수 있다. USBTinyISP 는 ATTINY2313 칩을 사용하는데 MrKiss 님은 이 칩을 프로그램하기위해 다른 ISP를 사용하였다고 한다. Arduino 사이트에
Parallel Programmer 의 자작방법이 나와 있지만 그냥 P-AVRISP 를 사버렸다. 그런데 지금보니 비슷하게 생긴
youknow 님의 ISP 가 LED 도 있는 것이 더 좋아 보인다.
Avrmall ATmega168 Board 의 ISP 연결 사진
컴퓨터가 책상밑에 있기 때문에 같이 딸려 나오는 20cm 짜리 케이블로는 어림도 없었다. 확장케이블을 따로 구매했는데 10pin x 1m 짜리밖에 없었다. 보드의 커넥터는 6pin 이지만 10pin 용 케이블을 잘 사용하고 있다.
Avrmall ATmega168 Board V2.1 는 Digitypo님이 선택했던 것에 비해 더 저렴하고(\12,000) 빠른 클럭의 보드이지만 serial chip 이 없으므로 RS-232C 를 직접연결할 수 없다. 때문에 RS-232C <-> RS-232.TTL 변환기 또는 USB <-> RS-232.TTL 변환기가 있어야 Arduino 환경에서 작성한 코드를 시리얼로 업로드 할 수 있다. Digitypo님은 DIP232RL V1.0 을 사용하였고 인터넷을 보니 더 저렴한 것도 있었는데 집에 있던 USB <-> RS-232C 를 분해하여 쓸 생각으로 아무 것도 구매하지 않았다.
arduino.cc 다운로드 페이지 에서 윈도용 Arduino 환경을 다운받아 적당한 위치에 압축을 풀면 바로 실행을 할 수 있다.
Arduino 개발환경 초기화면
Arduino Diecimila 보드를 USB 로 연결하니 FT232칩 관련 드라이버를 설치하는 화면이 나오고 난 후 COM 포트가 새로 생겼다. Arduino 환경에서 새로 생긴 COM 포트를 사용한다.
Arduino 개발 환경에서 COM7 이 추가된 모습
Sketch 로 샘플 소스를 열고 Upload to I/O Board 아이콘을 클릭하면 잠시 후 Arduino Diecimila 에서 실행되는 것을 볼 수 있다.
Sketch 소스 (LED 점멸)
Arduino Diecimila 의 LED가 켜져있는 사진
이제 Sketch 로 작성된 것을 Avrmall ATmega168 Board 에서도 같은 방식으로 돌려보겠다. 우선, Avrmall ATmega168 Board 에 P-AVRISP 를 사용하여 Arduino 부트로더를 심어야 한다. Avrmall ATmega168 Board 의 clock 은 Arduino Diecimila 나 Arduino Mini 와 다르게 20MHz 로 되어 있으므로 이것에 맞게 새로 빌드한 부트로더와 보드설정을 사용한다.
arduino 개발환경이 설치된 곳의 hardware 디렉토리에 boards.txt 라는 파일이 있다. 맨 끝에 다음을 추가한다.
##############################################################
avrmall.name=Avrmall ATmega168 Board V2.1
avrmall.upload.protocol=stk500
avrmall.upload.maximum_size=14336
avrmall.upload.speed=19200
avrmall.bootloader.low_fuses=0xff
avrmall.bootloader.high_fuses=0xdd
avrmall.bootloader.extended_fuses=0x00
avrmall.bootloader.path=atmega168
avrmall.bootloader.file=ATmegaBOOT_168_avrmall.hex
avrmall.bootloader.unlock_bits=0x3F
avrmall.bootloader.lock_bits=0x0F
avrmall.build.mcu=atmega168
avrmall.build.f_cpu=20000000L
avrmall.build.core=arduino
##############################################################
f_cpu 값이 20MHz 에 맞추어 졌고 bootloader.file 에 지정된 파일명이 Arduino Diecimila 의 설정과 다르다. 아래 ATmegaBOOT_168_avrmall.hex 를 다운로드 하여 hardware\bootloaders\atmega168 디렉토리에 복사한다.
참고로, 이 hex 파일은 atmega168 디렉토리의 Makefile 을 아래와 같이 고친 후 cygnus 쉘에서 make avrmall 을 실행하여 만든 것이다.
##########################################
#AVR_FREQ = 16000000L
AVR_FREQ = 20000000L
avrmall: TARGET = avrmall
avrmall: CFLAGS += '-DMAX_TIME_COUNT=F_CPU>>3' '-DNUM_LED_FLASHES=3'
avrmall: $(PROGRAM)_avrmall.hex
##########################################
Arduino 개발환경 메뉴에 Avrmall 보드가 표시된다.
P-AVRISP (
유저가이드)는 Arduino 의 Parallel Programmer (
회로도) 와 다른 종류 이다. P-AVRISP 를 Arduino 환경에서 사용할 수 있도록 hardware 디렉토리의 programmers.txt 파일의 맨 끝에 다음을 추가한다.
#####################################
stk200.name=P-AVRISP(STK200)
stk200.communication=parallel
stk200.protocol=stk200
#####################################
Arduino 개발환경 메뉴에 P-AVRISP 가 표시된다.
이제 P-AVRISP 를 연결해서 Avrmall ATmega168 V2.1 에 arduino bootloader 를 burnging 할 차례다. Arduino 환경의 Tools / Board 에서 Avrmall ATmega168 Board V2.1 을 선택한 후 Burn Bootloader 에서 w/ P-AVRISP(STK200) 을 선택한다. Digital 13번(PB5) 핀에 LED 를 연결해 놓았다면 LED가 깜박이는 것으로 부트로드가 버닝되는 순간을 확인할 수 있다.
다운로드 되는 것을 확인하기위한 LED 연결
그런데 LPT1 을 열 수가 없다는 에러가 발생하면 별도의 드라이버(giveio.sys)를 설치해주어야 한다. hardware\tools\avr\bin 디렉토리에 가면 install_giveio.bat 가 있다. 이것을 탐색기에서 더블클릭 하여 실행한다. 아래는 실행결과를 보기 위해 도스창을 열어서 실행한 화면이다.
패러렐포트 사용을 위한 giveio.sys 설치
Guide to the Arduino Mini 의 Connecting the Arduino Mini and a regular Arduino 에 나온대로 가지고 있는 Arduino Diecimila 보드를 USB<->RS-232.TTL 변환기 대용으로 사용해 보았다.(리셋핀 연결은 필요없다) Arduino 환경에서 Upload 하는 순간에 맞추어 Avrmall ATmega128 Board 의 Reset 버튼을 눌러줘야 한다. Arduino Diecimila 보드에 내장된 RX, TX LED가 깜박여서 업로드 되고 있음을 확인할 수 있다.
Arduino Diecimila 를 USB<->시리얼 컨버터로 사용
이제 Arduino 가 두 개 생겼다. 하나는 Arduino Diecimila 정품, 하나는 Arduino Mini 짝퉁(?). 하지만 더 빠르고(16MHz -> 20MHz) 귀여운 Arduino 이다.