본문 바로가기

Electronics

마이크로 컨트롤러란? - 간단한 소개와 사용법

지구라는 별엔 마이크로 컨트롤러라는 것이 있다.


그것은 우리집 보온밥솥에도 하나 들어 있고 세탁기에도 들어 있고 전자레인지에도 들어 있다.  그러면 플러그랑 같은거냐? 물론 아니다.


마이크로컨트롤러는 가전 제품안에서 자동으로 무엇인가를 처리해주는 역할을 하고 있다. 그럼 컴퓨터랑 뭐가 다른가? 컴퓨터는 훨씬 비싸고 빠르고 다양한 일을 할 수 있으나 마이크로 컨트롤러는 싸고 간단한 일을 주로 하고 있다.


너무 뜬구름 잡는것 같은가? 컴퓨터의 CPU와 비교해 보면 마이크로 컨트롤러도 같은 종류의 칩이긴 한데 일단 가격면에서 내가 쓰는 아르뒤노 보드에 들어가는 Atmel이라는 회사의 AVR시리즈 중에 Atmega168이라는 칩이 4,400원이다. 인텔이라는 회사의 코어듀오니 하는 것들과는 비교가 안되게 싸다.


사용자 삽입 이미지

Atmel사의 Atmega 168 마이크로 컨트롤러

그리고, 컴퓨터의 CPU는 혼자서는 아무데도 쓸데가 없으나 마이크로 컨트롤러는 칩 하나에 배터리 저항하나 와 LED만 연결해도 LED깜빡이라는 간단한 장치를 만들어 작동 시킬 수 있다. 메모리가 칩 안에 들어 있어서 프로그램을 스스로 저장할 수 있기 때문이다. 물론 전기 꺼도 안지워지는 플래쉬메모리가 내부에 들어 있다.


대신 속도는 atmega168이 20MHz 정도 되니까 코어듀오의 몇 기가 씩 하는 클럭스피드보다 몇백분의 일의 속도를 자랑한다. 자랑할게 아니라고? 느려도 할일 다 하니까 자랑할만 하다


전기밥솥으로 인터넷 접속해서동영상 보는 일은 없지 않은가? 전기밥솥은 취사버튼을 누르면 정해진 룰에 따라 일정시간동안 히터에 전기를 넣어주고 그 과정이 끝나면 전기를 약하게 주어 보온 모드로 자동으로 가주는 정도만 해주면 칭찬받는다. 그런데다가 코어듀오니 페놈이니 하는 비싼 CPU쓰고 삼성 1GB메모리 넣어주면 바보 소리 듣는다.


마이크로 컨트롤러는 비교적 단순한 분야의 자동화에 쓰이는 CPU라고 봐도 상관없다. 그러기 위해서 메모리 같은 웬만한 기능을 안에 집어 넣고 있고 단순한 기능이다보니 느려도 되고 그러다 보니 싸게 만들 수 있는 것이다.


그렇다고 마이크로 컨트롤러에 예전부터 메모리가 들어 있던 것은 아니다. 정확히는 모르지만 Atmel사의 AVR시리즈에서 플래쉬메모리를 내장하기 시작했다는 것 같다. 아무튼 요즘엔 거의 플래쉬메모리를 내장해서 프로그램을 저장할 수 있다는 것 같다. 그렇다 일일이 조사는 안해봤다 따지지 말자. 그런거  몰라도 만드는데 아무 지장없다.


마이크로 컨트롤러는 마이컴이라고도 불리는데 그건 국적불명의 용어로 마이크로 컨트롤러계의 원로이신 윤교수님도 아주 싫어하시는 용어다. 마이크로컨트롤러를 줄인다해도 마이컨이고, my computer 를 줄인 말이라면 그야말로 개가 웃을 일이다. 자동차 정비계에 '데후' (= differential gear; 차동기어) 같은 용어가 아닐까 싶다. 마이크로 컨트롤 유닛의 약자로 MCU라고 부르거나 풀어서 길게 마이크로 컨트롤러로 쓰던지 해야 맞다.


취미 전자공학에서의 마이크로 컨트롤러는 큰 역할을 하고 있다. 일단 로봇을 만들때 필히 들어간다. 뭐 MCU 잘 안쓰고 아날로그 회로로 거의 때우는 BEAM Bot이라는 로봇류도 있지만, 방구좀 뀐다 하는 로봇은 마이크로 컨트롤러 하나 쯤 써줘야 한다.


예전에 한참 티비에 나오던 미로를 자동으로 찾아가는 마이크로 마우스라는 로봇에도 들어 있고, 요즘에 뜨는 이족보행 로봇에도 들어있다.


그리고 마이크로 컨트롤러는 단독으로도쓰이지만 컴퓨터와 연결해서 쓰기도 한다. 크게 그 두가지의 사용방법이 있다. 컴퓨터는 키보드, 마우스 마이크 외엔 외부로 부터 신호를 받을수 있는 수단이 없기 때문에 컴퓨터의 입력주변기기로 쓰거나  반대로 출력기기로 쓰기도하고 겸해서 쓰기도 하고 맘대로 할 수 있다. 컴퓨터와 연결하면 컴퓨터의 강력한 프로세서를 써서 고속처리도하고 큰 저장공간을 이용해 큰 프로그램을 돌릴 수도 있으니 나름대로 큰 장점이 있다.


마이크로컨트롤러의 자세한 기능을 알아보자.


마이크로 컨트롤러로에는 입력과 출력기능이 있다. 입력은 0v냐 5V냐의 단순한 흑백논리로 세상을 판단하는 디지털 방식의 입력과 0v에서 5v까지의 전압을 1024단계로 세분해서 읽어 들이는 ADC (analog to digital conversion) 방식의 아날로그 입력 두가지 방식이 있다.

1024 단계로 읽어 들이는 ADC는 10bit ADC라고 AVR은 대부분 10bit의 ADC를 가지고 있더라. ADC가 없는 놈도 있으니 살때 잘 골라사야된다. 하지만 디지털 입력이 없는 놈은 아직 못봤다.


ADC는 전자온도계를 만든다거나 할때 쓰인다. 온도를 재는 센서는 온도에 따라 저항이 미묘하게 변화하는 물질을 이용하는데, 저항이 달라지면 전압도 달리지게 되니 MCU에 온도에 따른 전압을 넣어줄 수 있다. 센서쪽의 회로는 아날로그 회로를 알아야 만들수 있다. 아날로그 회로 공부는 별도로 해야한다.


그럼 디지탈 입력은 뭐에 쓰나? 스위치에 쓴다. 내가 스위치를 누르면 빨간 LED를 켜지도록 프로그램을 짰다고 치자. 스위치를 누르면 접점이 연결되면서 MCU(엠씨 유라고 읽으니 유재석이네? 아무튼 )의 특정 다리에 5V의 전압이 가해지고 그 신호를 프로그램이 받아 LED를 켜주는 신호를 내보낸다. 이때 내보내는 신호도 두가지가 있다.


그냥 5V 확 주는건 디지탈 출력, 원하는 전압 만큼 주는건 PWM 출력이다. PWM은 Pulse Width Modulation의 약자로 펄스의 폭을 조절하는 것으로 아날로그의 흉내를 내주는 꽁수의 별칭이다. PWM은 전기를 줬다 안줬다를 반복하는 것인데 주는 시간과 안주는 시간의 비를 조절하는 것으로 출력을 조절한다.


세숫대야에 수돗물을 1초 틀고 9초간 잠그느냐, 아니면 2초 틀고 8초간 잠그느냐에 따라 수량의 차이가 생기지 않겠는가? 그것과 같은 이치이다. 수돗물 펄스는 10초라는 간격을 가지고 트는 시간과 잠그는 시간의 비율을 조절했지만 MCU의 PWM은 훠얼씬 짧은 백만분의 일 초 단위의 시간을 가지고 그런 조절을 해준다는 차이가 있겠다. 기특하지 않은가?


AVR에서는 PWM 출력은 256단계로 전압을 조절해줄 수 있다. 그런 방법을 쓰면 빨간 LED를 아주 희미하게 불이 들어 오도록 시작해서 점점 밝아지도록 해줄 수도 있다. 물론 같은 방법 으로 일반 DC모터의 속도 내지 힘도 조절할 수 있는 것이다.


그러나 아주 작은 모터가 아니면 MCU의 힘 역시 엠씨 유재석 처럼 약하기 때문에 직접돌리는 건 기본적으로 무리다. 모터드라이브 IC 등 별도의 증폭회로를 거쳐야 모터를 지~대로 돌려줄 수 있음을 명심하자. 날 밝으면 커튼을 자동으로 걷어주는 장치 같은거 만들때나 로봇을 만들때나 모터로 가는 전류에는 증폭회로가 필요하다는 말이다.


일단 MCU는 위와 같은 입력 출력 포트를 가지고 있는데, MCU라는 것이 특정한 분야에서 한가지 임무만을 평생 수행하다가 생을 마감하는 방식이기 때문에 각각의 분야에 맞는 스펙으로 다양한 제품이 나와있다.


디지털 입출력 포트가 2개에 ADC가 없고 PWM도 없는 간단한 놈부터 (가만 저런게 있나?..있다 치자 패스)  디지털 입력이 10개에 ADC5개 PWM4개가 있는 놈도 있고 거기에 동작속도, 내장메모리크기, 작동 전압 등이 MCU선택시 고려사항이 되겠다.


온도 측정해서 전기 장판의 온도를 조절하고 싶다면 ADC가 필수 있테고 출력은 세밀하게 제어하려면 PWM을 쓰고 단순하게 껐다 켰다 하면서 제어를 하려면 디지탈 출력만으로도 가능할테니 XXX 모델을 사면 되겠구나 하는 식으로 골라 쓰는게 MCU되겠다.


디바이스마트에서 파는 AVR시리즈 종류만 봐도 40가지 정도 된다. PIC라고 다른 회사것도 있고 그 외에도 너무나도 많은 회사들이 MCU를 만들어내고 있다. 취미 분야에서나 일반적으로 보나 AVR이 많이 쓰인다고 한다. 하지만 영원한 강자는 없는 법. 경쟁이 심한 분야이니 만큼 혁신도 활발해서 우리를 기쁘게 해준다.


이번엔 MCU에 프로그래밍 하는 법에 대해 알아보고 마치기로 하겠다. 이글을 읽는 사람이라면 임베디드 프로그래밍이라는 말을 들어본 적이 있을 것이다. 못들어봤어도 자신에게 실망하진 말자.


MCU에 프로그래밍 하는걸가지고 임베디드 프로그래밍이라고 부른다. 지금까지 내 감으론 그렇다. 아 나도 취미로 전자공학 독학하기 시작한지 얼마 안됐다. 이제 겨우 다섯달째에 접어 든다. 내말 너무 믿지 말기 바란다.


MCU만 가지고는 프로그래밍 못한다. 컴퓨터가 필요하다. 컴퓨터랑 비교할때 큰 차이가 주변기기들이었듯이, 애가 주변이 없어서 프로그래밍은 컴퓨터에 의존 할 수 밖에 없다. 내가 마이크로 컨트롤러를 공부하기 시작하면서 가장 큰 혼란을 겪은 부분이 프로그래밍 부분이다.


일단 용어가 난무한다. ISP니 JTAG이니 당췌 뭐의 약자인지도 어디에도 안써 있고 당연한듯이 지들끼리는 다 안다는 듯이 그렇게 써 놓고 팔고 사고 물어보고 대답하고 자시고 하고 있어서 나 혼자 참 외로웠다.


누구하나 초보를 위해 처음 부터 자세히 써 놓은 놈이 없었다. 그렇다고 전자공학과 학생들이 그런걸 다 아는것도 아니더라. 요즘은 전자공학 관련 카페에 보면 졸업작품 만든답시고 질문 올리는 전자공학과인듯한 학생들의 질문을 보면 가관이 아니다. 대학의 교육이 그만큼 현실과 괴리되어 있다는 증거가 되겠다.


다시 돌아와서, 마이크로 컨트롤러는 예전엔 전용 프로그래밍 기기에 칩을 쏙 꽂아서 프로그래밍을 했다. 그 전용 프로그래밍 기기라는게 가격이 무지 비쌌었다. 그러나 요즘엔 그런게 필요없어 졌다. 세상 좋아진다는 말이 나오는 대목이다. 그냥 내가 꾸민 회로에 칩을 납땜한채로 칩의 특정 다리에 전선을 연결하고..등등 회로 좀 꾸며주면 바로 컴퓨터 시리얼 포트나 USB포트에 연결해서 프로그램을 다운로드 할 수 있다.


그걸 가지고 ISP라고 부른다. In system Programming 시스템안에 둔채로 프로그래밍하기, 여기서 시스템이란 것이 바로 회로기판이라고 이해해도 된다. MCU를 기판에 그대로 꽂아 둔채로 프로그래밍을 할 수 있다는 것은, 안해본 사람은 그게 뭐 그리 대수인가 하겠지만, 해본 사람은 그 큰 차이에 눈물을 흘릴지도 모른다.


프로그램을 짜본 사람은 알겠지만 한번에 돌아가는 프로그램이 세상에 어딨나? 고치고 고치고 수없이 고치고를 반복하는데 그럴때마다 칩을 뽑아서 라이터라고 부르는 프로그래밍 장치에 꽂아서 프로그램 다운로드 하고 다시 기판에 꽂아서 돌려보기를 반복하려면 여간 짜증나는 일이 아닐 것이다. 나도 그렇겐 안해봤다.


아무튼 ISP는 그런 뜻이고 ISP를 하기 위한 장치를 ISP라고 부르기도 한다. ISP기기는 한쪽은 컴퓨터의 시리얼 포트나 USB포트에 꽂고 한 쪽은 MCU보드의 프로그래밍 포트에 꽂아서 쓴다. 프로그래밍 포트는 별거 아니고 곧장 MCU의 프로그래밍을 위한 다리에 연결되어 있다.


컴퓨터에서 프로그램을 짜서 컴파일하여 ISP를 통해 MCU에 프로그램을 다운로드 하여 실행시킨다..가 전체적인 과정이 되겠다. 그런데 헷갈리는게 아르뒤노 같은 경우는 오픈소스 하드웨어 인데 고유의 부트로더라는 작은 프로그램이 일단 심어져 있어서 그 경우는 특이하게 ISP기기가 없어도 MCU가 시리얼 내지 USB 변환 칩만 거치면 바로 컴퓨터에 연결되어 프로그램도 다운로드 받을 수 있고, 또 컴퓨터와 연결하여 데이타를 서로 주거니 받거니 할 수도 있는 것이다.


아르뒤노 보드에는 그래서 프로그래밍 포트와 시리얼내지 USB포트가 같이 달려있다. 이 점이 나를 무지 헷갈리게 했다. USB나 시리얼도 이왕 연결하는건데 게다가 프로그래밍도 된다고 하면서 왜 프로그래밍 포트가 다로 달려있느냐 하는 것이다. ISP라는 놈도 결국 USB나 시리얼 포트에 꽂으니 더 그 구분이 애매했다.


그러나 그 차이는 MCU에 연결되는 다리가 달랐다는 단순하면서도 큰 차이였다. 그러나 단순한 차이기에 프로그래밍 포트와 시리얼 내지  USB를 쓰는 통신 포트는 공유 될 수도 있는 것이었다. 다만 약간의 배선과 부품의 추가로 가능은 한일이라는걸 나중에야 알게되어 그 답답했던 가슴 속의 응어리를 씻어낼 수 있었다. 


결국, 부트로더를 일단 깔아 두면 프로그래밍 포트를 통하지 않고도 통신 포트만으로 프로그램도 다운로도 받고 그 다음에 프로그램을 돌리면서 컴퓨터와 MCU보드가 서로 데이타도 주고 받을 수 있는 것이다. 이 점 역시 임베디드 프로그래밍에서의 혁신중의 하나로써 보드에 이선 저선 꽂지 않고 한가닥만 꽂아서 프로그래밍과 통신을 해결할수 있는 편리함을 준다.


그러나 부트로더를 내가 직접 깔고 싶다면 프로그래밍 포트를 처음에 한번은 써야한다. 부트로더 업그레이드 시에도 물론 써야한다.


그럼 프로그래밍 언어에 대해 알아보자.


MCU는 어셈블러 내지 기계어라고 부르는 것만을 알아듣는다. 그래서 컴퓨터에서 그걸 만들어서 다운로드 해줘야 한다. C로 짜서 컴파일 하면 기계어로 번역이 된다. 기계어를 직접 짜는 사람도 있다. 거의 암호와 비슷하기 때문에 권장하고 싶지 않다.


아르뒤노는 C언어를 쓰긴 하지만 암호처럼 어려운 부분을 사람이 알아보기 쉽도록 변경해 놓은 것을 쓰기 때문에 훨씬 쉽다. 아르뒤노라는 프로그램을 다운받아 컴퓨터에 깔고 실행시키면 노트패드 비스무리한 간단한 프로그램이 뜬다. 거기에 직접 코드를 때려 넣는 방식으로 프로그램을 하여 컴파일 클릭, 다운로드 클릭 해주면 아르뒤노 보드로 프로그램이 다운로드 되는데 이때 아르뒤노 보드의 리셋버튼을 눌러줘야된다.


사실 리셋이 자동으로 되는 버전의 부트로더와 보드인데 웬지 제대로 작동을 안한다. 되다 말다 하는 전형적인 골치아픈 문제라서 그냥 리셋버튼 누르고 있다. 언젠가 해결해야할 과제이다.


컴퓨터에서 실행시키는 아르뒤노라는 프로그램을 개발환경이라고 부르는데, Atmel사에서 만든 AVR Studio라는 것도 있고, 몇가지 있는것 같은데 난 아르뒤노만 써 봐서 다른건 잘 모르겠다. C도 안쓴다. C로 프로그램을 하려해도 암호 비슷한 포트기호들과 16진수들이 난무하

기 때문에 취미로 하는 사람들에겐 아르뒤노를 권하고 싶다.


아르뒤노는 16진수도 안나오고 암호같은 포트기호도 없다. 포트는 그냥 1번부터 차례로 숫자로 매겨져 있을 뿐이다. 거의 베이직 수준의 난이도를 가지기 때문에 프로그래밍을 조금만 해본 사람이라면 그냥 쉽게 짤 수 있다. 간단한건 그렇다는 말이다 ^^


그러나 복잡한것이라도 라이브러리라는게 있으니 적절한것만 골라서써주면 어려운것도 아주 쉽게 마무리 할 수도 있다. 인터넷이 발달하면서 좋은 것이 이런게 아닌가 싶다. 글로 된 지식뿐 아니라 프로그램 소스들을 라이브러리 형태로 공개 해 놓은 것이 많아서 정말 큰 도움이 된다.


서보모터나 스텝퍼 모터의 구동 같은 경우도 라이브러리 화일 이름을 프로그램 초기에 한줄 써주기만 하면 아주 간단하게 복잡한 신호를 줘야하는 모터들을 구동해줄 수 있다.


이상 간단하게 쓰려고 시작했으나 길어져 버린 마이크로 컨트롤러에 대한 소개와 사용법을 마치고 다음엔 아르뒤노의 사용법에 대해 써보기로 하겠다.