Software | Arduino Nano Bootloader 를 update 해보자

|

1. upload 가 이상해


어느때 부턴가 arduino 에 sketch 를 upload 하면 다음과 같이 에러를 냈습니다. 뿜뿜~.



뭐지? 하고 찾아보다가 보니 bootloader 가 새롭게 업데이트 되면서 발생한 문제라고 하는군요.

Arduino IDE 가 업데이트 되면서 자동으로 바뀐것 같습니다.


기존에 선택되어 있던 "Processor : ATmega328P" 이 아니라...



아래와 같이 Processor 의 종류를 "ATmega328P (Old Bootloader)" 로 바꾸어서 upload 하면 해결 됩니다.


Tools > Processor > ATmega328P (Old Bootloader)



찾아보니 이런 내용이 올라와 있네요.

제가 즐겨 쓰는 arduino nano 버전에 사용되는 ATmega328P 에만 관련이 있어 보입니다. (Uno 도 마찬가지?)


* Getting Started with the Arduino Nano

- https://www.arduino.cc/en/Guide/ArduinoNano



일단 해결은 되었으니, 당시에는 급하게 Bootloader 까지 업데이트 할 필요는 없었습니다.





2. Bootloader 를 업데이트 해보자


새로 올라온 Nano 용 Bootloader 는 몇가지 장점이 있다고 합니다.


* Arduino Nano ATmega328P bootloader difference

https://arduino.stackexchange.com/questions/51866/arduino-nano-atmega328p-bootloader-difference


1. Optiboot will not go into an endless reset loop after a watchdog reset. ATmegaBOOT will.


2. Optiboot expects the upload communication at 115200 baud. ATmegaBOOT, 57600.

This is the reason why the old boards don't work with the Tools > Processor > ATmega328P selection and vice versa.


watchdog 을 리셑 후, 무한루프에 빠지는 문제와, 통신 속도가 달라졌다고 합니다. (저는 못느꼈던 부분....)


추가로 Bootloader 가 작아지면서, 더 많은 소스를 올릴 수 있게 되었다지만, 여분의 부분을 사용하게끔은 아직 안되었다고 하네요.

여분의 메모리 공간 활용을 위해서, 새 Bootloader 는 Optiboot 는 Uno 와 동일하므로,

Nano 이지만, 편법으로 Uno 로 설정하고 Bootloader 를 입히면 된다 합니다.


아직 큰 소스를 제작하지도 않는지라, Uno 용으로 Bootloader 를 입히는 것은 나중에 해보겠습니다.





3. Arduino as ISP 로 연결


궁금하니 새로운 Bootloader 를 올려보기로 합니다.


Bootloader 를 입히는 방법은 여러가지가 있습니다만,

저는 여분의 Arduino Nano / Micro 를 상호 사용하여 Bootloader 를 입히는 방법으로 진행합니다.


이때 사용되는 interface 는 ICSP header 를 사용합니다.



지금까지 arduino 를 사용하면서, 이 ICSP header 가 필요할까? 했는데, 이럴 때 필요하네요.



새롭게 Bootloader 를 입힐 arduino 는 ICSP 에 연결하고,

PC 와 연결되는 arduino 는 ISP 모드로 사용됩니다.


그럼 하나하나 진행해 볼까요.





4. Pin 연결


ISP 모드로 연결되는 arduino 를 SOURCE 라고 칭하고, 새로운 Bootloader 가 입히게 될 arduino 를 TARGET 이라고 하겠습니다.

TARGET 의 ICSP header 와 SOURCE 의 pin 이 어떻게 연결되는지 표로 만들어 봤습니다.


아래는 Arduino Micro 가 SOURCE 로 했기 때문에,

Nano 나 다른 기존일 때에는 거기에 맞는 FUNCTION pin 을 찾아서 연결해 주면 됩니다.


Function | SOURCE (Micro) | TARGET ICSP (Nano)
----------------------------------------------
  MISO   |      MISO      |       1
  5V     |      5V        |       2
  SCK    |      SCK       |       3
  MOSI   |      MOSI      |       4
  RESET  |      D10       |       5
  GND    |      GND       |       6
----------------------------------------------


각 Nano 및 Micro 의 pin 의 FUNCTION 과 ICSP header 정보는 다음 그림을 참고해 보세요.



Micro 는 Nano 와 조금 다른 pinout 을 가지므로 주의해야 합니다.



회로도는 다음과 같습니다.



실제로 연결한 사진은 다음과 같습니다.






5. SOURCE 에 올리는 sketch


다음으로, ISP 모드로 연결될 SOURCE 는 "ArduinoISP" sketch 가 올라가 있어야 합니다.

이 소스는 Arduino IDE 가 설치되어 있으면, 기본으로 가지고 있는 소스 입니다.


File > Examples > 11.ArduinoISP > ArduinoISP



저의 경우는 SOURCE 가 Arduino Micro 이므로, 이 micro 에 upload 해주었습니다.



위처럼 Programmer 를 "AVRISP mkII" 에서 "Arduino as ISP" 로 바꾸어 줍니다.


Board      | Arduino Nano
Processor  | ATmega328P
Port       | COM6 --> Port connected arduino as a SOURCE
Programmer | Arduino as ISP


위의 그림과 조금 다르지만, 새로운 소스는 이제 Old Bootloader 가 아니므로

Processor 에서 "ATmega328P" 로 정의해 주면 됩니다.


추가로 주의할 점은,

Programmer 에서 비슷하게 생긴 "ArduinoISP" 항목이 있지만, 속지 말고 "Arduino as ISP" 을 선택해줘야 합니다.


이제 준비가 완료 되었습니다.





6. 쉽게 끝나지 않는다


그렇죠... 이렇게 쉽게 끝나면 아쉽죠.

모든 글을 참조하여 잘 따라 했는데도 불구하고 실패합니다.



"Device signature = 0x000000" 이라는 문구가 중국 복제품이라서 그런가? 라는 생각도 해봤습니다.

중국 복제품은 아래처럼 Unknown board 라고 표시가 되거든요.



그래서, 이 부분을 강제적으로 메모리에 덮어 씌울 수 있는 방법이 없는가도 찾아 봤습니다.

없더군요... (Atmel Studio 라는게 있지만 잘 안됨...)



그래도 안되길래, ICSP header 접속시 1번 pin 을 잘못 인식하여 5V 를 엄한데 꽂아버려

chip 이 타버렸나 생각해 보기도 했습니다. 그렇게 되면 얼마 하지 않지만 또 구입해야 하니까 매우 번거럽게 됩니다.


참고로, 여러 troubleshooting 하면서 알게된 글이 아래 사이트 입니다.

발생할 수 있는 모든 가능성에 대해, 그에 따른 대응방법을 자세하게 적어 놨습니다.


Bootloader 관련하여 문제가 생겼을 시, 어떻게 조치해야 하는지를 알려주는 성지와 같은 글 입니다.


* Have I bricked my Arduino Uno? Problems with uploading to board

https://arduino.stackexchange.com/questions/13292/have-i-bricked-my-arduino-uno-problems-with-uploading-to-board




7. 심기 일전


다시 처음부터 시작한다는 마음으로

다음날 아침 일찍, 배선도 다시하고 ArduinoISP 도 새로 올려보고, 모든 과정을 다시금 천천히 해봤습니다.



음?!!!!!!!!!!

성공 했네요?!

"Done burning bootloader" 문구가 뜹니다.


성공한 로그를 첨부합니다.


Bootloader_update_201812.txt


축하 동영상 올라 갑니다. 아래와 같이 SOURCE 와 TARGET LED가 서로 사이좋게 끔뻑끔뻑 하면 됩니다.



확인해봐야 겠죠?

Processor 를 "ATmega328P" 로 변경하고, 아무 sketch 나 올려 봅니다.



잘 되네요.

로그를 첨부합니다.


Sketch_upload_201812.txt



첫날 연속 실패의 원인은, pin 을 잘못 연결하지 않았나로 추측해 봅니다.

역시 이 취미는 차분하게 해야 합니다.





8. 여러가지...


IDE 가 업데이트 되면서 지 맘대로 Bootloader 도 업데이트 할 수 있게 되었다면,

필시 그 파일이 존재할 터, 찾아봅니다.


C:\Program Files (x86)\Arduino\hardware\arduino\avr\bootloaders\optiboot



요놈!


Atmel Studio 를 잠깐 사용해 보면서 느낀 것은,

기존에 보유하고 있는 Arduino 의 상태에 대해 알아둘 필요가 있었습니다.


예를 들면, memory 크기나, 인식하는 code, Signature, Fuse bit 같은 것들.

아래 소스를 사용하면 ATmega 시리즈를 사용하는 Arduino 의 chip 현황을 자세하게 알 수 있습니다.


* nickgammon/arduino_sketches

https://github.com/nickgammon/arduino_sketches

- arduino_sketches-master.zip


특히 "Atmega Board Detector" 를 사용하면 Bootloader 소스 뿐만 아니라 거의 모든 정보를 알 수 있습니다.

여기서도 연결은 Arduino as ISP + ICSP header 조합입니다.


우선 Arduino Nano 의 정보 입니다.

Arduino_Nano_result.txt


Atmega chip detector.
Written by Nick Gammon.
Version 1.20
Compiled on Dec 10 2018 at 21:28:36 with Arduino IDE 10803.
Attempting to enter ICSP programming mode ...
Entered programming mode OK.
Signature = 0x1E 0x95 0x0F 
Processor = ATmega328P
Flash memory size = 32768 bytes.
LFuse = 0xFF 
HFuse = 0xDA 
EFuse = 0xFD 
Lock byte = 0xCF 
Clock calibration = 0x87 
Bootloader in use: Yes
EEPROM preserved through erase: No
Watchdog timer always on: No
Bootloader is 2048 bytes starting at 7800

Bootloader:

7800: 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 
7810: 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 
...


이대로 끝나면 아쉬우니, Arduino Micro 도 확인해 봅니다.

Micro 는 ICSP header 의 1번 pin 자리가 살짝 다르니 주의해야 합니다. (아래 그림)



후후, 정상으로 돌아온 Arduino Nano 를 SOURCE 로 하고 Arduino Micro 를 확인해 보는 사진입니다.



Arduino Micro 의 정보 입니다.

Arduino_Micro_result.txt


Atmega chip detector.
Written by Nick Gammon.
Version 1.20
Compiled on Dec 10 2018 at 21:28:36 with Arduino IDE 10803.
Attempting to enter ICSP programming mode ...
Entered programming mode OK.
Signature = 0x1E 0x95 0x87 
Processor = ATmega32U4
Flash memory size = 32768 bytes.
LFuse = 0xFF 
HFuse = 0xD8 
EFuse = 0xCB 
Lock byte = 0xEF 
Clock calibration = 0x71 
Bootloader in use: Yes
EEPROM preserved through erase: No
Watchdog timer always on: No
Bootloader is 4096 bytes starting at 7000

Bootloader:

7000: 0x5F 0xC0 0x00 0x00 0x78 0xC0 0x00 0x00 0x76 0xC0 0x00 0x00 0x74 0xC0 0x00 0x00 
7010: 0x72 0xC0 0x00 0x00 0x70 0xC0 0x00 0x00 0x6E 0xC0 0x00 0x00 0x6C 0xC0 0x00 0x00 
...


Micro는 Bootloader 가 훨씬 크네요.

USB 연결을 위한 chip 도 built-in 되어 있고, 나중에 나온 CPU 이니 확장이 많이 되어있는 듯 합니다.





FIN


뭐가 달라졌을까요?

Old Bootloader 를 일부러 선택하지 않아도 된다는 정도?


또한 가장 눈에 띄는건 Baud Rate 입니다.

19200 --> 115200 으로 바뀐걸 아래와 같이 알 수 있네요.


기존


         Using Port                    : COM6
         Using Programmer              : arduino
         Overriding Baud Rate          : 19200
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53



NEW


         Using Port                    : COM6
         Using Programmer              : arduino
         Overriding Baud Rate          : 115200
         AVR Part                      : ATmega328P
         Chip Erase delay              : 9000 us
         PAGEL                         : PD7
         BS2                           : PC2
         RESET disposition             : dedicated
         RETRY pulse                   : SCK
         serial program mode           : yes
         parallel program mode         : yes
         Timeout                       : 200
         StabDelay                     : 100
         CmdexeDelay                   : 25
         SyncLoops                     : 32
         ByteDelay                     : 0
         PollIndex                     : 3
         PollValue                     : 0x53



And