부트로더 (Bootloader)
일반적으로 MCU (Microcontroller Unit) 에 Bootloader 를 프로그래밍 할 수 있다. 하지만 Bootloader 는 언제나 필요 한 건 아니다. Arduino Bootloader 는 사용자 (개발자) 에게 별도의 hardware programmer (i.e Arduino ISP, Atmel AVR Dragon, AVRISP-MKII, USBTinyISP, etc.) 없이도 Arduino IDE 가 제공하는 기능을 손쉽게 개발 하여 업로드 할 수 있게 도와 준다. 단, Arduino Library 를 쓰지 않는다면 Arduino Bootloader 는 메모리만 차지 할 뿐 굳이 필요 없다. 여기에서는 Arduino Library 를 사용하지 않고 C standard library 만을 이용할 것이므로, Arduino Bootloader 를 제거하고 Binary 파일을 직접 업로드 하는 방법을 정리하고자 한다. 참고로 Arduino Bootloader 는 쉽게 다시 업로드 할 수 있으니 언제라도 복구가 가능하다. 그 방법도 뒤에 정리해 두었다.
SPI 인터페이스
Arduino 는 Atmel 의 AVR microcontroller 를 사용 하는데 Bootloader 나 Application 을 삭제/저장 하기 위해서는 SPI 인터페이스를 가진 programmer 를 사용 해야 한다. 전문 programmer 를 사용 하면 더 손 쉽겠지만, 우연히 라즈베리 파이 (Raspberry Pi, or RPi) 가 집구석에 돌아다니고 있다면 그것을 사용해 보는 것도 재미 있을듯 하다.
RPi와 Arduino 사이의 Pin 연결
Pin 연결은 아주 간단하다. Atmega168 과 RPi 를 Breadboard 에서 바로 연결 하려고 한다면 아래의 Pinout 표를 잘보고 해당하는 곳에 연결을 하면 된다. Arduino Board 와 RPi 를 연결 한다면 ICSP (Arduino Board) 을 이용하면 무척 손쉽다.
Arduino ICSP VCC <-> Raspberry Pi 5 volt pin
Arduino ICSP GND <-> Raspberry Pi ground pin
Arduino ICSP RESET <-> Raspberry Pi GPIO #26 // 다른 GPIO 를 사용해도 무방하다.
Arduino ICSP SCK <-> Raspberry Pi GPIO #24
Arduino ICSP MOSI <-> Raspberry Pi GPIO #23
Arduino ICSP MISO <-> Raspberry Pi GPIO #18
Arduino Board | Reset/SS | MOSI | MISO | SCK | Level |
Uno or Duemilanove | CE0_N, CE1_N or any GPIO (위 예제에서는 #26 를 사용하였음) | 11 or ICSP-4 | 12 or ICSP-1 | 13 or ICSP-3 | 5V |
Arduino Board SPI Pins
Atmega168 Pins
Avrdude 설치 하기
Arduino 와 RPi 가 하드웨어 적으로 연결이 되었다면 RPi 에 avrdude 를 설치해야 한다. Avrdude 는 Binary 형태로 저장된 프로그램을 RPi 에서 Arduino 로 업로드 하는 일을 한다.
sudo apt-get install avrdude |
arvdude.conf 복사하고 수정하기
Arvdude 를 RPi SPI 에 맞게 사용하려면 avrdude.conf 파일을 수정해야 한다. 원본을 복사하여 (~/linuxgpio.conf) 필요한 부분만 아래와 같이 수정하도록 한다.
cp /etc/avrdude.conf ~/linuxgpio.conf vim ~/linuxgpio.conf |
그리고 아래와 같이 수정하여 준다. 참고로 열 번호는 다를 수 있다.
programmer id = "linuxgpio"; desc = "Use the Linux sysfs interface to bitbang GPIO lines"; type = "linuxgpio"; reset = 26; sck = 11; mosi = 10; miso = 9; ; |
vim 에서 저장하고 나오는 방법
esc 키를 누르고 :wq 를 치고 엔터키를 누른다
Connection Testing
Bootloader 를 지우기 전에 하드웨어가 잘 연결되었고 소프트웨어가 작동을 하는지 확인해 봐야 한다. 아래의 명령문을 RPi 에서 실행 하자.
sudo avrdude -p atmega168 -C ~/linuxgpio.conf -c linuxgpio -v |
바이너리 파일 업로드 하기
이제 프로그래밍만 하여 업도로 하면 된다. 기본적인 명령문은 다음과 같다
sudo avrdude -c linuxgpio -p atmega128 -v -U flash:YOURHEXFILE.hex:i |
Blink
바이너리 파일이 없다면 아래의 파일로 테스트해 보자. Arduino IDE 에서 export 한 파일이다. 첫번째 파일은 부트로드를 지우고 Blink 프로그램만을 업로드 한다. 두번째 파일은 Arduino Bootloader 와 Blink 프로그램 둘 다 업로드 한다. 만약 Arduino 를 USB 로 본인의 컴퓨터에 연결하여 Arduino IDE 를 이용하여 프로그램을 만들 경우라면, 두번째 파일로 Bootloader 를 복구 시키면 된다.
결론
이상으로 Arduino Board 에서 Arduino Bootloader 를 제거하고 다시 복구하는 방법을 정리해 보았다. 그럼 다음에는 Arduino IDE 가 아닌 AVR-GCC 로 Arduino 를 사용 해 보자. 이상 끝.
참고자료
www.arduino.cc/en/Tutorial/BuiltInExamples/ArduinoISP
learn.adafruit.com/program-an-avr-or-arduino-using-raspberry-pi-gpio-pins
www.youtube.com/watch?v=ERY7d7W-6nA
www.martyncurrey.com/arduino-nano-as-an-isp-programmer/
ozzmaker.com/program-avr-using-raspberry-pi-gpio/