이번 포스팅에서는 Atmega 328(P) 칩에 아두이노 부트로더와 스케치를 업로드 하는 방법에 대해서 이야기 하려고 한다. 인터넷에 있는 수 많은 포스팅과는 엄연히 차이가 있는데, Arduino UNO 가 필요 없다라는 것이다. 정말 순수하게 Atmega 328 칩만(?) 사용하는 방법이다.

 

이게 말이야 방구야?

 

이렇게 기존 MicroController 를 제거할거면,, 뭣하러 복잡하게 회로 연결을 하나..? -_-a 그냥 해당 슬롯에 삽입하고 말지..

 

 

부트로더 업로드

 

아두이노의 부트로더는 AT 의 수 많은 칩들과 마찬가지로 ISP 프로토콜을 이용한다. 매우 쉽다. 간단하다. Attiny MicroController 에 부트로더 올릴때와 동일하다. 그래서 부트로더를 업로드 하는 방법에 대해서는 간결히 설명하고, 스케치를 올리는 방법에 대해서는 다소 자세히 다루겠다.

 

 

 

준비물

 

Atmega 328 은 Attiny 와 비교했을때, 약간의 준비물이 필요하다.

- Crystal 16Mhz 1개

- 22pF 세라믹 커패시터 2개

- Arduino 아무거나~ (ISP 프로그래머로 사용 예정)

 

반드시 세라믹 커패시터일 필요는 없는데, 22pF 와 같이 매우 작은 용량의 경우 대부분 세라믹이더라...

크리스탈이 꼭 필요한가? 라는 의문을 갖는다면 그러하다. 왜냐면,, 기본적으로 구매한 Atmega328 시리즈 대부분 초기에 External Clock 으로 세팅되어 있다. 그래서 외부 클럭(crystal)이 반드시 필요하다. 이것 없이 어떻게든 해 보려고 했는데 안되더라.

혹시라도 crystal 없이 시도했고, 성공한 케이스가 있다면 공유해 주면 감사하겠다.

 

 

 

Arduino as ISP

 

굳이 이것까지 설명해야 하는가 싶지만, 그래도 순서상 설명해 본다.

 

해당 샘플을 불러온 후, 연결된 임의의 Arduino 에 스케치를 올린다.

끗.

 


배선방법

 

별것 없다. 인터넷에 나오는 수 많은 그림과 같이 하면 된다.

다시 말하지만, Arduino UNO 가 아니어도 된다. 필자의 경우에는 Arduino Nano 로 진행하였다. AtMega256 이든 Leonardo 든 뭐든 무관하다.

 

참고로 1번핀에 PullUp 저항이 달려 있는데, 굳이 필요 없다. (내부 PullUp 으로 동작하는것으로 예상)

 

 

 

부트로더 올리기

 

아두이노 IDE 에 아래 URL 을 추가하여, Boards Manager 를 추가한다.

https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json

 

그 후에 Boards Manager 에서 MiniCore 를 검색하여 추가한다.

 

준비가 끝났다. 이제 아래와 같이 설정하고, Burn Bootloader 를 클릭하면 정상적으로 BootLoader 가 Atmega328 에 올라간다. 필자의 경우 Atmega328P 라서 아래와 같이 설정하였다. 그리고 Clock 은 External 16 MHz 로 설정하였다.

 

 

 

여기까지는 큰 문제없이 잘 된다. 쉽다. 인터넷에 수 많은 자료가 있으니까ㅡ

 

 

매번 연결하기 귀찮으니, 이렇게 해 두면 편하다. 배선은 믿지 말자(잘못 연결해서 기판 뒤에 땜빵했음)

 

 

 

 

스케치 업로드

 

자, 이제 Atmega328 에 아두이노 부트로더를 올렸다. 스케치는 어떻게 올려야 할까? 앞서 이야기한대로 인터넷에 나온 자료는 온통 보유하고 있는 Arduino UNO 에 MicroController 를 제거한 후, Atmega328 과 연결하든 꼽든 하라고 한다. 아니;;; 찌..발..

나는 Arduino UNO 가 없다니까???

 

 

준비물

 

당연히 부트로더를 올릴때와 마찬가지로 아래 것들이 필요하다.

- Crystal 16Mhz 1개

- 22pF 세라믹 커패시터 2개

- Arduino 아무거나~ (필자의 경우 Nano 를 사용)

 

 

배선방법

 

예전에 ESP8266 의 펌웨어 업그레이드때와 비슷하다.

https://crystalcube.co.kr/215

 

요컨데 보유한 Arduino 보드를 UART to TTL 로 사용할 것이다.

 

Atmega328
Arduino Nano

 

1. Arduino Nano 의 +5V 를 Atmega328 의 VCC 와 연결한다.

2. Arduino Nano 의 GND 를 Atmega328 의 GND 와 연결한다. (위 사진상 우측의 GND)

3. Arduino Nano 의 RESET(좌측)을 Arduino Nano GND(좌측)에 연결하여, 항상 RESET 상태를 유지하도록 한다. UART to TTL 로 사용하기 위한 목적.

4. Arduino Nano 의 RX 를 Atmega328 의 RX 와 맞물린다. (RX-TX 연결이 아닌 RX-RX 임에 주의)

5. Arduino Nano 의 TX 를 Atmega328 의 TX 와 맞물린다. (TX-RX 연결이 아닌 TX-TX 임에 주의)

6. 부트로더를 올릴때와 마찬가지로 Atmega328 에 Crystal 과 커패시터를 연결한다.

 

 

 

스케치 업로드

 

우선 아래처럼 설정하고, Blink Example 스케치를 올려보자.

 

응~ 당연히 안돼~

 

주의할점은 Programmer 을 더 이상 Arduino as ISP 로 하면 안된다. 알다시피 지금 연결한 Arduino Nano (꼭 Nano 일 필요는 없음)는 더 이상 ISP 로 동작하는게 아니다. UART to TTL 로서 동작하는 것이다. 그냥 Bypass 를 위해 연결된 장치일 뿐이다. 그러므로 AVRISP mkll 로 선택한다.

 

이렇게 하고 스케치를 올리면, 당연히 안된다. 헤헤..

아마 Retry 를 10번 수행 후, 실패할 것이다.

 

 

중요한게 있는데, 바로 Reset 이다. 스케치를 올리기 위해서는 해당 Micro Controller 를 RESET 해 주어야 한다.

 

즉, Atmega328 의 RESET(1번핀)을 적절한 타이밍에 GND 와 연결/제거해 주어야 한다. 필자의 생각에는 Arduino Nano 의 어떤 핀과 적절히 연결해 주면 될것 같은데, 아직 찾지 못했다. 혹시 알고 있다면 공유해 주길 바란다. 아무튼 나는 그래서 수동으로.... 적절한 타이밍에... 직접 RESET 과 GND 를 연결해주었다가 땐다. -_-

 

이 타이밍을 잡는게 다소 어려운데, 여러번 하다보면 감이 잡힌다.

 

대략적으로라도 타이밍에 대한 설명을 하자면 다음과 같다.

아두이노 IDE 에서 Ctrl+ U 를 누르고 나면, 컴파일 후에 업로드가 진행된다. 이때 로그를 보면 다음과 같다.

 

 

빨간색으로 박스친 'Compiling core...' 출력 후, 잠시 뒤에 아래 녹색 영역이 출력된다.

 

 

타이밍은 다음과 같다.

1. Atmega328 의 RESET(1번핀)와 GND(22번핀)을 점퍼로 연결한다.

2. Alt + U 를 누른다.

3. Compiling core...이 출력되는것을 확인한다.

4. 다음 녹색 영역이 출력되는 순간, 1의 점퍼를 제거한다. (정확히는 Compiling 이 끝나고 Uploading 프로세스 진행 직전)

 

타이밍에 대한 좀 더 정확한 정보는 아래 유튜브 영상을 참고.

https://youtu.be/cvyq-qohljg?si=TkTl60iH7jV_CldZ&t=170

 

 

짧은 파란색 점퍼와 같이 RESET 과 GND 에 연결해 두었다가, 서술한 타이밍에 제거한다.

 

 

 

그러면 아래와 같이 문제없이 스케치가 Atmega328 에 올라간다. 배선에 문제가 없다면 분명히 된다. 포기하지 말고 시도하자...ㅎ.

 

 

 

기판으로 만들면 이렇게 된다.

Sketch Programmer

- Atmega328 에 올릴 경우에는 아래 스위치를 통해 USB to TTL 로 전환하고, Ctrl+U 로 업로드

- Attiny 에 올릴 경우에는 아래 스위치를 통해 ISP 로 전환하고, Ctrl+Shift+U 로 업로드

 

 

 

동작 확인

 

Atmega328 의 경우, 소스코드에 정의된 LED_BUILTIN 는 PB5 (19번핀)이다. LED 를 연결하면, 정상적으로 1초 주기로 깜빡이는 것을 확인 할 수 있다.

 

LED 가 1초 주기로 깜빡인다.

 

 

 

 

마무리

 

우선 타이밍을 맞춰서 RESET 연결하는 방법에 대해서는 좀 더 고민해 봐야겠다. 추후 알게되면 해당 포스트에 추가로 코멘트 하도록 하겠다.

 

아무튼 이렇게해서 Atmega328 칩만 구매하여, 독립적인 회로를 구성할 수 있게 되었다. 정확하지 않지만 개당 2천원 내외로 구매했던것 같은데, Attiny85 랑 가격 차이가 별로 없어 보인다. 크기가 작아서 Attiny가 비싼걸까..? 핀 수는 Atmega328 이 훤씬 더 많은데...

 

 

 

+추가내용

 

Arduino Nano 의 경우 Atmega328 칩을 사용한다. 그리고 해당 포스팅에서는 다른 Atmega328 칩에 sketch 를 업로드 하는 방법에 대해 설명하고 있다. 그러다보니 단순히 Upload Sketch 를 수행하면, 다른 Atmega328 이 아닌 Arduino Nano 에 sketch 가 올라가는 문제가 발생했다. 그래서 Arduino Nano 를 USB to TTL 로 만들고, 적절한 타이밍이 RESET 을 점프 시켜서 sketch 를 올렸다.

그러나 부트로더를 올릴때와 동일한 회로 구성을 이용하여 스케치를 올리면, Atmega328 에 정상적으로 올라간다. 하지만, 치명적인 문제가 있는데 연결된 Arduino Nano 에도 스케치가 동일하게 올라간다. 즉, Arduino as ISP 스케치가 삭제되고 두 Micro Controller 에 동일한 스케치가 덮어써진다.