안녕하세요. 번개쥐 입니다. 올해초쯤에 미적분학 시리즈를 올렸었던 번개쥐 입니다. 이번에는 제가 연구,전공 하고 있는 분야인 제어에 대해서 글을 써볼려고 합니다.

예전에 고전 제어에서는 아날로그 회로를 이용한 제어들이 거의 대부분이 었는데요 현대에 와서는 거의 디지털 제어로 넘어 오게 되었습니다. 간단히 말해 지금 여러분이 들고 계신 스맛폰, 데스크탑, 태블릿 피씨, 랩톱에서 부터 냉장고 로봇 등등 모든것은 디지털적인 제어를 통해 이루어 지고 있습니다.

여러분 소프트 웨어라는 말을 다들 들어 보셨지요? 소프트 웨어라는 개념은 언제부터 생겼을까요? 최초의 컴퓨터라고(논란은 다소 있지만) 알려져있는 애니악의 경우는 소프트 웨어가 없었답니다. 모든 명령어를 케일블로 일일히 연결하여 컴퓨터를 동작시키는 굉장히 무식한 물건 이었지요. 하지만 폰 노이만이 폰 노이만 구조(아키텍쳐)를 제안한 이래 이러한 컴퓨터 명령어는 천공카드(구멍을 송송 뚫어서 구멍이 뚫린부분은 1 , 막힌 부분은 0으로 처리하는 방식)를 거쳐 현재 우리가 보고있는 hdd(하드디스크 드라이브),ssd(솔리드 스테이트 드라이브) 라는 부기억 장치와 메모리라는 주기억 장치를 통해 구체화 되었답니다.

인텔 i7,i5,i3, 펜티엄 amd, 페넘,apu 등등 이런 씨피유에 대해서는 들어 보신 분들이 많으실 겁니다. 우리는 지금도 스맛폰을 쓰며 pc를 쓰며 이러한 씨피유들을 마구 부려먹고 있는데요. 과연 이 cpu들은 어떻게 우리의 명령을 알아 듣고 있을까요? 사람이 쓰는 언어는 흔히 자연어라고 합니다. 그리고 기계가 쓰는 언어는? 기계어라고 합니다. 흔히, 매트릭스 같은 영화를 보면 나오는 (0101011110110101101010101101110110)같은 언어를 말이지요. 그런데 아무리 천재라도(폰 노이만은 기계어를 자유자재로 구사했다고 합니다. 괴수?) 기계어 자체를 맘대로 쓰는건 힘든 일이지요. 그래서 어셈블리어라는게 만들어 집니다. 어셈블리어는 기계어와 1대1 대응이 되는 언어 입니다.

    

arm 어셈블리어   x86어셈블리어

그리고 기계어라는 것은 당연하게도 arm, x86등 기반이 되는 구조(아키텍쳐)가 뭐냐에 따라서 똑같은 내용이라도 (위의 두 어셈블리어는 완전히 같은 동작을 의미하는 것입니다. 1+2를 하라는 거에영) 쪼끔 다르게 생겨먹었습니다. ㅎ

그래서 옛날 옛적에 기계제어를 위해서 어셈블리어를 쓰던 사람들은 각종 아키텍쳐 별로(pic 라던가 avr이라던가 arm이라더가 등등등) 의 모든 어셈어를 다 알고 있었다고 하네요....(저도 pic,avr,arm,x86 다 공부했답니다 으어어어엌....) 이렇듯 어셈어가 모두 다르게 생겨 먹어서 프로그래머들이 고통에 신음하고 있을때 그들은 생각하게 됩니다. 우리가 어떤 공통의 언어를 쓰고 그걸 아키텍쳐별로 어셈어로 번역을 해준다면 우리가 편하게 살수 있지 않을까??

그것이 바로 컴파일러라는 것을 만들게 된 계기 이지요. 그렇게 해서 c언어라는게 만들어 지게됬습니다.(B언어라던가 뭐 뒷얘기가 더 많지만 그건 딱히 중요하지 않으니 넘어가죠) C언어는 고급언어들 중에도 중급 언어라는 평가를 종종 듣습니다. 힐단 그건 좀있다가 후술하고, 왜 C언어와 어셈어 이 두언어는 제어에서 거의 절대적인 언어 입니다.(매트랩을 쓰지 않느냐? 랩뷰는? 라고 말하는 사람이 있을 수 도있지만 얘네둘은 결국 c 언어 만드는 프로그램일 뿐입니다.)

C언어는 왜 중급 언어인가? 고급언어와 하급언어에 대한 개념에 대해서 먼저 알아야 합니다. 고급언어는 자연어에 가까운 즉 우리가 평소에 쓴는 언어의 형태에 가까운 언어를 말합니다. 대표적으로 베이직, 자바, 매트랩, 파이썬, C#등이 있지요. 그리고 저급언어는 기계어, 어셈블리어가 있습니다. 그런데 왜 C는 중급 언어인가? 현대 고급언어들의 특징은 프로그래머가 직접 기계를 제어하는것을 싫어합니다. 왜냐하면 기본적으로 현대 고급언어들은 프로그래머를 신뢰하지 않고 만들어낸 결과물의 안정성을 절대적으로 보장해주고 싶어해서 그렇습니다.

그런데 C언어는 그렇지 않습니다. 메모리에 직접 접근하는 것 뿐만 아니라 데이터 형에도 굉장히 관대해서 다른 데이터 형끼리도 대입해도 아무런 제재가 없을뿐더러, void 포인터, 힙 접근 등등 굉장히 프로그래머를 신뢰하는 언어 입니다. 그렇기에 현대 프로그래밍 언어중에 가장 가볍고 실행 속도가 빠릅니다. 그리고 어떻게 보면 단점일 수도있지만 쓰레기 수집(가비지 컬렉팅)또한 전혀 해주지 않는다고 보면 됩니다.(수동으로 하면 할 수있다는 의미 입니다. 자동으로 안되는 것을 말합니다.) 현대 대부분의 언어가 프로그램이 기능 수행후에 생긴 찌꺼기들(예를들면 동영상 보고 끌때 동영상이 여전히 메모리속을 떠돌아 다니면 곤란할 수도있으니)을 자동으로 삭삭 정리해 주지만, c에서는 그런 기능을 일부러 추가 하지 않는다면 메모리 속을 떠다닐수도 있다는 것이죠.

c(c++도 가능하긴 하지만 c++은 일단 제쳐두죠)는 이렇듯이 기계를 직접 제어하는 수준의 프로그램 작성이 가능하고, 이는 처음에 c를 데니스 리치가 os를 만들기 위한 언어로 짜서 그렇습니다. 그가 만들고자 한 언어는 사실 프로그래머가 편하기 위해서 만들었다기 보다는 어셈블리어 중에서 중요한 기능을 살려 놓고 귀찮은 기능들을 없애기 위해서 이러한 언어를 만들었기 때문에(os를 짤때 편하기 위해서, 애초에 태생이 제어를 위해서 태어났음) 심지어 짜다가 어셈어도 집어넣을수 있는등 어셈과 아주 밀접한 관련이 있습니다.

기계제어를 할때 이러한 배경 상식을 두고 짜면 좀더 심도 깊고 수준 높은 제어를 할 수있을 겁니다. 그렇다면 제어를 할때는 어떠한 재료가 필요한지에 대해서 알아 보지요.

 
위에 보이는 두 자그마한 보드는 아두이노 UNO 라고 부르는 건데요..(왼쪽은 짭, 오른쪽은 정품) 인터넷 쇼핑몰에 검색해 보시면 만원 정도에 파는 짭들이랑 삼만원 정도의 정품들을 보실수 있을겁니다. 대부분의 기계제어 입문자들이 많이 쓰는(C언어 초보자들이 선호합니다. C언어를 잘 아시면 ATMEGA128이 더 재밌긴 하지만요.)보드 입니다. 그리고 이를 이용해서 기계를 제어 해볼 뿐만 아니라 이러한 기판 부터 만드는 방법까지 모두 글을 쓸 예정입니다. (혹시 따라하고 싶으신 분들을 위해 말씀 드리면 ATMEGA 8칩, 브레드보드, 16MHz의 XTal과 22pF의 콘덴서 2개를 이용하여 제작할겁니다.)

그리고 아두이노에 관하여 진행이 많이 되고 그뒤에는 라즈베리파이나 비글본 블랙을 이용하여 직접 미니 PC를 제작하고 아두이노와 연동하여 그럴듯한 작품을 만드는 글까지 쓸 예정입니다.  DIY에 관심이 있고, 컴퓨터, 전자기기에 관심이 많으신 분들이 제글을 많이 읽어 주셨으면 좋겠습니다. 나중에가면 어셈으로 직접 디버깅, 기계 제어까지 하는 글도 올릴 수도 있으니 기대 해주시면 감사하겠습니다.