상세 컨텐츠

본문 제목

부트로더 없는 아두이노?! (Arduino without bootloader)

Arduino

by 한빼 2021. 1. 20. 12:47

본문

부트로더 (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 는 쉽게 다시 업로드 할 수 있으니 언제라도 복구가 가능하다. 그 방법도 뒤에 정리해 두었다. 

 

Source: https://www.electronicwings.com/arduino/basics-to-developing-bootloader-for-arduino

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's ICSP Pinout

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

Source: https://www.arduino.cc/en/Tutorial/BuiltInExamples/ArduinoISP

 

Atmega168 Pins

Source: www.arduino.cc/en/Hacking/PinMapping168

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

~/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 를 복구 시키면 된다.

 

Blink.ino.standard.hex
0.00MB
Blink.ino.with_bootloader.standard.hex
0.01MB

 

결론

이상으로 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/