이글의 전부 또는 일부, 사진, 소스프로그램 등은 저작자의 동의 없이는 상업적인 사용을 금지합니다. 또한, 비상업적인 목적이라하더라도 출처를 밝히지 않고 게시하는 것은 금지합니다.


 

만물상(http://www.manmullsang.com) 사장님께서 주신 atmega32가 여러 개 있습니다. 이것들고 arduino로 사용할 수 있을 것 같아서 작업해 보았습니다. 이 보드를 제작한 것은 벌써 4-5년 된 것 같은데 당시에 광전자의 도트매트릭스를 이용한 간이 전광판 만들기 위해 직접 회로도를 그려 설계를 했었던 보드입니다.

 

회로도는 얼기설기라도 그릴 능력은 되어 그리기는 했는데, PCB 아트워크는 해 본 적이 없어서 만물상 사장님께서 이럭저럭하셔서 완성한 기판입니다. 아주 저렴한 보드이지만 cp2102로 만든 USB-TTL 변환 기판을 내장하도록 설계했고, 모든 IO 핀들을 연결할 수 있도록 핀 홀을 만들어 놓았기 때문에, arduino용으로는 안성 맞춤입니다. atmega32 arduino로 사용하기에는 가성비 최고의 제품으로 생각합니다.

 

이글에서 ATmega32 보드라고 부르는 것은 만물상의 ATmega32 보드를 말합니다.

 

ATmega32 보드를 arduino 보드로 만들기 위해서는 처음에 한 번은 별도의 프로그래머로 ATmega32에 펌웨어를 구워야 합니다. 이를 위해서 AVRISP 등 별도의 AVR 프로그래머가 있어야 합니다. 운영체제는 윈도우즈를 쓰는 것으로 가정하고 기술합니다.

 

 

 

가지고 있는 기판 중에서 상태가 가장 안 좋은 것으로 골랐습니다.

좌측 상단의 cp2102를 이용한 USB-TTL 보드를 여러 번 사용하다가 기판의 동판이 일어나서 겨우 납땜하여  돼지표 공업용 본드로 고정시켜 놓은 상태입니다. 겨우 붙여넣은 배선이 언제 떨어질지 모르지만 우선 시험삼아 해보는 것이니 고장나도 미련을 가지지 않을 것 같아 이것으로 작업을 합니다.

 

통상적으로 AVR의 RESET 신호는 10k옴 저항으로 pull-up하고 0.1uF 콘덴서를 GND와 연결하지만, arduino에서는 RESET 신호선과 GND 사이에 0.1uF의 콘덴서를 사용하면 안됩니다. 대신에 USB-TTL의 DTR 신호를 0.1uF 콘덴서를 통하여 RESET 신호와 연결합니다.

 

스케치 프로그램이 USB-TTL의 DTR 신호를 low로 하여 AVR을 RESET 시키고 작업을 하는데,  RESET 신호와 GND 사이에 0.1uF의 콘덴서가 있으면 이 콘덴서로 인하여 RESET이 제대로 되지 않아 저상 동작하지 못하는 것으로 여겨집니다.

 

하드웨어적 작업은 간단합니다. RESET 신호와 GND에 연결된 0.1uF를 제거하고, USB-TTL의 DTR 신호와 AVR의 RESET 신호 사이에 0.1uF 콘덴서를 넣어 주면 됩니다. 이 작업은 AVR의 RESET 신호에 달려 있는 0.1uF 콘덴서의 GND와의 연결을 끊고, GND 대신에 USB-TTL의 DTR 신호와 연결하면 됩니다.

 

 

위 사진에 노란색으로 표시한 부품이 AVR의 RESET 신호와 연결된 0.1uF짜리 콘덴서입니다. 기판에 C7로 표시되어 있습니다. C7이라는 글자가 표시된 아래쪽이 GND와 연결되어 있습니다. 이 핀을 기판과 분리합니다.

위 사진의 윗 부분에 조그맣게 빨간 색으로 표시한 부분이 USB-TTL 보드의 DTR 신호부분입니다.

 

cp2102의 DTR 신호는 28번 핀입니다. 만물상의 USB-TTL 변환보드는 이 신호를 사용하지 않는 듯합니다. cp2102의 핀 간격이 매우 좁고 핀 길이도 아주 짧아서 납땜할 수 있는 공간이 얼마되지 않습니다. 다른 핀이나 바닥의 홀 등과 연결되지 않도록 세심하게 작업해야 합니다.

 

하지만 다행히 28번 핀이 가장 마지막 핀이라서 맨 위의 맨 좌측에 노출되어 있어서, 다른 핀의 간섭을 비교적 덜 받아 그럭저럭 납땜할 수 있습니다.

 

 

0.1uF 콘덴서를 기판에서 분리하여 점프선과 납땜하였습니다.

 

 

 

 

 

cp2102의 28번 핀(DTR)에 점프선을 납땜하였습니다.

 

하드웨어적 준비는 끝났습니다.

 

cp2102 칩의 제작사인 silabs 홈페이지에서 cp2102 드라이버를 받아서 설치합니다.

드라이버를 다운 받을 수 있는 URL을 링크합니다. 현재 최신 버전은 6.7.3입니다.

http://www.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx

 

드라이버를 설치하는 방법을 자세히 설명하는 것은 주제와 멀어지는 것 같아서 생략합니다. 다운로드 받은 파일은 압축 파일이므로 적당한 폴더에 풀어 놓고 자신의 OS가 32비트면 파일명에 x86 들어 있는 것을, 64비트면 파일명에 x64가 들어 있는 exe 파일을 실행합니다. 이후 화면에 지시하는 바에 따라 드라이버를 설치합니다.

 

드라이버를 설치한 후에 ATmega32 보드를 PC와 연결하고 장치관리자를 엽니다.

장치관리자를 연 후에 [포트(COM & LPT)] 항목을 열어 현재 연결된 포트를 확인합니다.

 

 

위의 사진의 경우 COM6가 ATmega32 보드에 할당된 포트입니다. 이 포트 번호는 나중에 스케치와 연결할 때에 사용해야 하므로 잘 기억해야 합니다.

 

스케치를 실행합니다. 현재 사용하고 있는 스케치는 버전 1.6.13.입니다. 향후 스케치가 업데이트 되면서 방법은 바뀔 수 있습니다.

 

스케치의 [파일] 메뉴에서 [환경설정(Ctrl+commer)]을 선택합니다.

 

 

보드 매니저를 추가하기 위해서 위 사진에 빨간색으로 표시한 버튼을 누릅니다.

 

 

위 사진에 빨간색으로 칠한 부분을 클릭합니다.

 

 

 

위의 사진과 같이 github.com의 비공식적 아두이노 지원 화면이 나오면 Ctrl+F를 눌려서 MightyCore를 찾습니다.

 

 

 

위 사진에 파랗게 선택된 url을 마우스로 드래그하여 선택한 후에 Ctrl+C로 복사합니다.

 

 

 

스케치로 돌아가서 [추가적인 보드매니저 URLs]에 Ctrl+V로 붙여 넣기 한 후에 [확인] 버튼을 누릅니다.

 

 

URL이 추가된 것을 확인하고 [확인] 버튼을 누릅니다.

[툴] 메뉴의 [보드] 항목으로 가서 [보드매니저]를 클릭합니다.

 

 

아래로 스크롤하면 맨 아래에 위 사진과 같이 MightyCore by MCUdude 항목이 나타납니다. 위 빨간 네모 부분을 클릭하면 설치 버튼이 나타납니다. [설치] 버튼을 눌러서 설치합니다.

 

 

설치가 끝난 후에 [툴] 메뉴의 [보드] 항목 위로 마우스를 가져가면 다음과 같이 보드들이 나옵니다.

 

 

맨 아래 쪽에 MightyCore 항목과 그 아래로 ATmega1284, ATmega644, ATmega324, ATmega164, ATmega32, ATmega16, ATmega8535 등 40핀짜리의 AVR 들이 나옵니다. 이 중에서 ATmega32를 선택합니다. 만일 MightyCore가 보이지 않는다면 아래로 가는 화살표 위로 마우스를 가져가면 아래로 스크롤 되면서 나타날 것입니다.

 

이외에도 [Pinout]은 Standard, [Clock]은 16 Mhz external (BOD 2.7V), [Compiler LTO]는 Disabled (default), [포트]는 장치관리자에서 지정 받은 포트로 지정합니다. (위의 경우는 COM6)

 

 

스케치의 툴 메뉴에 있는 부트로더 굽기에서 부트로더를 구울 수 있어야 하는 것 같은데, 에러가 발생하면서 안됩니다. 공식 arduino가 아니라서 그런지, AVRISP mkii가 복제품이라서 그런지, 방법을 몰라서 그런지 모르겠습니다. 하여간 현재로서는 스케치에서는 굽지를 못합니다.

 

Windows 10 64bit 운영체제 하에서 AVRISP mkii 복제품을 이용하여 AVR studio 4.19로 부트로더를 굽는 방법을 설명합니다.

 

AVR Studio를 실행합니다.

 

 

위 사진에 빨간색으로 표시한 버튼을 눌러 프로그래머 선택 화면을 부릅니다.

 

 

 

가지고 있는 프로그래머를 선택한 후에 [Connect] 버튼을 누릅니다.

 

 

 

Device로 ATmega32를 선택하고 [Read Signature] 버튼을 눌러서 Signature matches seleted device 메시지가 나오는지 확인합니다.

 

 

 

[Fuses] 탭을 누른 후에 파란색 네모에있는 숫자와 같이 입력하고 [Program] 버튼을 누릅니다.

 

 

 

 

[Program] 탭을 누른 후에 [...] 버튼을 눌러 부트로더 파일을 선택하고, [Program] 버튼을 눌러 부트로더를 기록합니다. 부트로더 파일이 있는 곳은 다음의 사진을 참조하십시오.

 

 

 

Windows 10의 경우 파일이 있는 폴더는 다음과 같습니다.

C:\Users\사용자명\AppData\Local\Arduino15\packages\MightyCore\hardware\avr\1.0.7\bootloaders\optiboot_flash\atmega32

 

위 폴더에 있는 여러 개의 부트로더 중에서 만물상 ATmega32 보드는 16MHz로 동작하므로 optiboot_flash_atmega32_115200_16000000L.hex 파일을 선택합니다.

 

만일 AppData 폴더가 보이지 않는다면 탐색기 옵션에서 숨김 파일, 폴더 및 드라이브를 표시하도록 변경해야 합니다.

 

부트로더 굽기가 성공하면 만물상 ATmega32 보드를 arduino로 활용할 수 있습니다.

MightyCore arduino ATmega32 보드의 핀 맵은 두 가지가 있습니다.

 

C:\사용자\사용자명\AppData\Local\Arduino15\packages\MightyCore\hardware\avr\1.0.7\variants

폴더 아래에 bobbuino 폴더와 standard 폴더가 있습니다.  그 안에 보면 각각 pins_arduion.h 파일이 있는데 그 안에 핀 맵이 정의 되어 있습니다.

 

다음은 standard 핀 맵입니다.

 

출처(http://www.instructables.com/id/Using-Atmega32-with-Arduino-IDE/)

 

 

 

다음은 bobuino 핀 맵입니다.

 

출처(https://github.com/MCUdude/MightyCore)

 

 

ATmega32 arduino는 표준이 아니라서 제작자에 따라서 핀이 다를 수도 있습니다.

 

어떤 핀 맵을 사용하는지 유심히 살펴봐야할 듯합니다.

핀맵은 스케치의 툴 메뉴에서 정할 수 있습니다. 다음은 standard 핀맵으로 정의한 화면입니다.

 

 

 

 

 

ATmega32 arduino를 완성하였으니 예제를 실행해 봅니다. 누구나 arduino를 처음 접하는 경우에 제일 먼저 실행하는 예제인 Blink로 테스트해 보겠습니다. 이 프로그램은 단순히 led를 켰다 껐다 하는 프로그램입니다.

 

표준 arduino 보드들은 D5 핀에 led를 내장해서 다른 하드웨어 조치 없이 Blink를 실행할 수 있습니다. 그러나 만물상 ATmega32 보드는 애초에 arduino를 가정하고 만들지 않았기 때문에 led가 없습니다.

 

게다가 ATmega32는 D5를 SPI에서도 사용해야 하기 때문에 여기에 led를 달아 놓으면, 나중에 SPI 사용에 막대한 지장을 초래할 수도 있습니다. 그래서 MightyCore에서는 led를 D5에 연결하지 않고 D0 즉 1번핀(PB0)에 연결하고 있습니다.

 

예제 프로그램을 보면 LED_BUILTIN이라는 매크로를 사용해서 led를 제어하는 것을 볼 수 있습니다. 이 매크로는 다음 파일에 있습니다.

C:\Users\사용자명\AppData\Local\Arduino15\packages\MightyCore\hardware\avr\1.0.7\variants\standard\pins_arduino.h

 

#define LED_BUILTIN 0

로 정의 되어 있습니다.

 

ATmega32 보드에 led를 임시로 설치합니다. led의 +극은 PB0에 -극은 GND에 연결합니다. 원칙적으로는 470옴 정도의 저항을 넣어야 하지만, 잠시 사용하는 경우에는 그냥 led만 설치해도 별 문제는 없습니다. led의, +극을 5V에 led의 -극을 PB0에 연결해도 Blink가 실행되는 데는 지장이 없습니다만 표준의 arduino 보드들은 led의 +극을 AVR 포트에 연결하고 led의 -극을 GND에 연결합니다. ATmega32 보드에도 이와 같이 led의 +극은 AVR의 PB0에 led의 -극은 GND에 연결합니다.

 

위의 매크로에서 LED_BUILTIN은 다른 숫자로 바꾸면 led를 해당되는 핀으로 옮겨야 합니다.

 

ATmega32 보드에 전원을 넣고 리셋 버튼을 누르면 led가 빠르게 두 번 깜빡이면 부트로더가 정상으로 동작하는 중입니다.

 

스케치를 실행하고 [파일] 메뉴에서 [예제]를 선택하고 [01.Basics]에서 [Blink]를 선택합니다.

이 예제는 이미 전세계적으로 검증된 프로그램이므로 확인/컴파일 할 필요없이 바로 업로드합니다.  [스케치] 메뉴에서 [업로드]를 누르면 컴파일한 후에 업로드합니다.

 

 

성공적으로 업로드 되었습니다.

 

예제 Blink 를 업로드하여 led가 깜빡이는 과정을 촬영한 동영상입니다.

 

동영상의 촛점이 led에 맞추어져 있습니다. 배경의 노트북에서 Blink를 업로드 시키고 있습니다. 업로드가 되고 난 다음에 led가 깜빡이는 것을 볼 수 있습니다.

블로그 이미지

엠쿠스

Microprocessor(STM32, AVR)로 무엇인가를 만들어 보고자 학습 중입니다.

,