아두이노(arduino)는 AVR이라는 마이크로 컨트롤러를 기반으로 한 오픈소스 원보드 마이컴이다. 예전에는 이런 시스템을 설계하고 다루기 위해서는 전기/전자와 관련된 전문적인 기술이나 지식이 필요했다. 이 보드의 특징은 그러한 어려움을 극복하고자 기술 숙련도가 낮은 디자이너 혹은 예술가들을 대상으로 설계된 것이다. 따라서 비전공자들도 손쉽게 익히고 사용할 수 있다는 큰 장점을 갖는다.


[그림 1] 가장 널리 사용되는 아두이노 우노 R3 보드의 외형과 크기


 그러면 이러한 아두이노 보드를 이용하여 어떤 일들을 할 수 있을까. 간단한 몇 가지 예를 들어보면 다음과 같다.


  • 사람이 접근하면 자동으로 조명이 켜지는 장치.

  • 애완 동물에게 정해진 시간에 먹이를 공급하는 장치.

  • 화분의 습도가 낮아지면 자동으로 물을 주라는 트윗을 보내는 장치.

  • 여러개의 LED를 이용하여 귀걸이나 목걸이의 장식으로 이용.

  • 좀 더 전문적인 응용으로 로봇의 제어 장치.


위의 예들은 단순한 몇 개의 예를 든 것이고 인터넷으로 검색을 해보면 정말 많은 응용 제품들이 만들어지고 있으며 일반인 뿐만 아니라 기업에서도 이것을 이용하여 상용 제품을 출시하며 비즈니스 모델로 이용하고 있는 등 널리 사용되고 있다.


[동영상 1] 아두이노 소개


 대부분의 아두이노 보드들은 AVR 이라는 8비트 마이크로콘트롤러를 기반으로 하고 있으나 최근에는 Cortex-M3를 이용한 제품(Arduino Due)을 비롯한 여러 하이엔드 제품군이 개발되고 있다. 또한 소프트웨어 개발을 위한 스케치(sketch)라는 통합 개발 환경(IDE)이 제공되며 이것 또한 오픈소스로 공개되어 있다. C++ 로 개발이 진행되지만 관련 라이브러리가 잘 갖추어져 있어서 난이도는 낮은 편이다.


[그림 2] 다양한 아두이노 보드들


 앞에서도 언급했듯이 아두이노의 가장 큰 장점은 전기/전자의 깊은 지식이 없이도 마이크로컨트롤러를 쉽게 동작시킬 수 있다는 점이다. 일반적으로 AVR 프로그래밍이 WinAVR로 컴파일하여, ISP장치를 통해 업로드를 하는 등 일반인들에게는 어렵고 번거로운 과정을 거치는데 비해서, 아두이노는 전용 IDE를 이용하여 컴파일된 펌웨어를 USB를 통해 업로드를 쉽게 할 수 있다.


 또한 다른 프로토타이핑(prototyping) 도구들에 비해 비교적 저렴하고, 윈도를 비롯해 맥 OS X, 리눅스와 같은 여러 OS를 모두 지원한다. 아두이노 보드의 회로도가 CCL에 따라 공개되어 있으므로, 누구나 직접 보드를 직접 만들고 수정할 수 있으며 실제로 수많은 유사 (호환) 제품이 존재한다. 특히 요즘에는 중국 심천을 중심으로 하는 초저가 제품들이 쏟아지고 있다.


 아두이노가 인기를 끌면서 이를 비즈니스에 활용하는 기업들도 늘어나고 있다. 인텔, 마이크로소프트, 삼성 등과 같은 대기업들이 아두이노 호완 제품들을 선보이고 있는가하면, 장난감 회사 레고는 자사의 로봇 장난감과 아두이노를 활용한 로봇 교육 프로그램을 학생과 성인을 대상으로 북미 지역에서 운영하고 있다. 자동차회사 포드는 아두이노를 이용해 차량용 하드웨어와 소프트웨어를 만들어 차량과 상호작용을 할 수 있는 오픈XC라는 프로그램을 선보이기도 했다.


아두이노 강좌 전체 목록 (TOP) >>>

C++ 언어 전체 강좌 목록 >>>

c{ard},n{ad002}


Posted by 살레시오
,

7.1 함수의 개요      [gdoc]       [smts]

 C 언어는 구조 지향 언어(structure-oriented language)라고 한다. 이 구조의 핵심으로 함수(function)가 있는데 C 언어는 함수로 시작해서 함수로 끝난다고 해도 과언이 아닐 정도이다. C++언어는 객체 지향(object-oriented) 언어이지만 C언어와의 하위 호환성을 유지하므로 구조 지향적인 프로그래밍도 가능하다.


 C 프로그램은 하나 이상의 함수들로 구성되어 있으며 각 함수들은 다양한 일들을 수행할 수 있는 독립적인(self-containted) 부프로그램을 일컫는다. 전술했듯이 C++ 의 경우 C 언어에 대해서 하위 호환성이 있으므로 함수에 대한 기본적인 내용을 똑같이 적용된다.


 함수는 식별자 뒤에 괄호()가 반드시 붙는다. 괄호가 붙지 않는 식별자는 변수이며 괄호가 붙은 식별자는 함수이다. 맨 처음부터 다뤄온 예제들에서 프로그램 본체인 main() 도 바로 함수이다. 그리고 scanf(), printf() 도 함수이다.


  • main() 함수 : C 프로그램의 시작점

  • scanf(), printf() 함수: 입출력 함수


 특히 C 언어는 함수에 의한 언어라고 할 수 있다. 아무리 덩치가 큰 C 프로그램이라도 모두 함수를 조합하여 만들어진다. 함수의 사전적인 의미는 ‘기능’이다. 즉 ‘어떤 일을 수행하는 프로그램의 작은 단위’를 함수라고 한다.


  • 함수(function) - 어떤 작업을 수행하는 프로그램의 작은 단위


 프로그래밍 입문자는 왜 하나의 프로그램을 여러 개의 함수로 나누어 작성해야 되는지 궁금할 수 있다. 함수를 사용하는 장점으로 다음과 같은 것들을 들 수 있다.


  1. 덩치가 큰 프로그램을 작고 다루기 쉬운 함수(모듈) 단위로 분할해서 설계하고 구현함으로서 프로그램을 더 쉽게 작성할 수 있다.

  2. 프로그램을 단계적으로 개발할 수 있다.

  3. 어떤 프로그램에서 작성한 함수를 다른 프로그램에서 재사용할 수 있다.

  4. 프로그램 내부에 세부적인 연산이나 작업 등을 함수의 내부에 숨길 수 있어 프로그램을 보기에 간결하게 만들 수 있다.


 C 언어의 함수는 이미 만들어져서 사용할 수 있는 표준 함수와 사용자가 만들어 사용하는 사용자 정의 함수로 구분할 수 있다.


  • 표준 함수 (standard function)

  • 사용자 정의 함수 (user-defined function)


지금까지 사용했던 scanf(), printf() 함수는 모두 표준 함수에 속하며 C/C++ 언어 표준에 포함되어 일반 사용자가 가져다 쓸 수 있는 이미 만들어진 함수이다.


 표준 함수와 사용자 정의 함수를 프로그램 내에서 적절하게 활용하면 중복되는 부분을 상당히 줄일 수가 있으며 프로그램의 크기도 줄일 수 있는 효과를 얻을 수 있다. 덩치가 큰 프로그램을 제작할 때 작은 크기의 모듈을 설계하여 전체를 짜 맞추는 식으로 만들어 가면 개발 시간을 단축할 수 있고 프로그램을 보다 명료하게 구현할 수 있다는 장점이 있다.


Posted by 살레시오
,

1.3 C++ 언어 소개    [DOC]    [SMTS]

 컴퓨터의 속도가 빨라짐에 따라 소프트웨어의 덩치도 커지게 되었고, C 언어로는 규모가 큰 프로그램을 개발할 때 프로그램의 코드를 관리하는데 어려움을 겪게 되었다. 이러한 점을 개선하기 위해서 C 언어와의 하위 호환성을 유지하면서 객체 지향 특성 (object oriented programming) 및 편의 기능들을 추가하여 1983년 즈음에 Bell 연구소의 Bjarne Stroustrup 이 C++ 언어를 개발하였다.


Bjarne Stroustrup, Creator and Developer of C++ programming language

[그림 1.3.1] C++ 언어를 개발한 Bjarne Stroustrup


C++에서는 C 언어의 struct 자료 구조를 확장한 class라는 새로운 자료 구조를 이용하여 객체 지향 프로그래밍 방법론을 구축하였으며 이는 다른 현대적인 프로그래밍 언어들에 지대한 기여를 하였다. 이것에 영향을 받아 1991년에는 Guido B.A.가 python의 초기 버전을 발표하였으며, 1995년도에는 C++의 영향을 받은 JAVA라는 언어가 Sum Microsystem 사의 James Gosling 에 의해서 만들어졌다. 또한 2000년에는 Microsoft 가 C++과 JAVA의 장점을 취한 C#이라는 언어를 만들어 ,NET framework의 핵심 언어가 되었다. 이외에도 Javascript, PHP 등 웹프로그래밍 언어들도 C/C++의 영향을 받아서 개발되어 널리 사용되고 있다. 파이썬과 자바 그리고 자바스크립트는 현대의 컴퓨팅환경에서 가장 널리 쓰이는 프로그래밍 언어들이다.


다른 언어들에 비해서 상대적으로 오래된 역사에도 불구하고 C++은 현재까지도 중요한 비중을 차지하고 있으며 속도나 성능이 매우 중요한 임베디드 시스템 개발이나 게임 프로그래밍에 많이 사용되고 있다.  또한 마이크로콘트롤러(microcontroller)나 DSP(digital signal processor)의 프로그래밍에서는 C/C++언어가 아직도 주력으로 사용되고 있으며 특히 아두이노(arduino)와 같은 인기있는 오픈 하드웨어 플랫폼도 C++언어를 사용한다.


 전술한 바와 같이 다른 주요한 언어들이 C/C++언어의 영향을 많이 받아 설계되었으므로 C/C++언어를 익히면 다른 언어로 건너갈 때 훨씬 용이하므로 전산 관련 학과에서 프로그래밍 입문 언어로 C/C++이 많이 사용된다.


Posted by 살레시오
,

 1991년에 핀란드의 대학생 리누스 토발스(Linus Torvalds)는 ‘리눅스’라고 이름지은 운영체제 커널을 개발하기 시작하였다. 리눅스라는 이름도 재밌게도 ‘Linux Is Not UniX’의 글자들을 딴 것이다. (GNU와 유사한 일종의 말장난) 이 커널은 자유로이 수정될 수 있고 매우 유용한 운영체제를 만들기 위해 FSF 산물과 다른 컴포넌트들 (특히 BSD 컴포넌트들의 일부와 MIT 의 X 윈도우 소프트웨어)과 병합될 수 있었다.


[그림 1] 리누스 토발스


 근래에 들어서는 쉬운 설치, 보다 많은 하드웨어 지원, KDE나 GNOME같은 GUI 데스크탑까지 지원 함으로서 일반 컴퓨터에 익숙한 사용자들이 집에서 PC에 설치 하기에도 무리가 없다.


 리눅스 공동체의 여러 조직들은 사용할 수 있는 컴포넌트들을 다르게 조합하였는데 각 조합은 ‘배포판’으로 부른다. 널리 알려진 배포판으로는 데비안(Debian), 우분투(ubuntu), 민트(mint),  레드햇(Red Hat), 페도라 등등이 있다. 인터넷으로 접속하는 많은 서버들의 운영체제가 리눅스이고 안드로이드와 같은 운영체제 역시  리눅스 기반으로 만들어졌으므로 리눅스는 우리 생활 전반에 보이지 않게 사용되고 있다고 할 수 있다.



[그림 2] 리눅스 배포판의 종류들


 리눅스의 특징은 다음과 같다.


  • 다중  플랫폼 지원. (인텔CPU, ARM, Sun Sparc, PowerPC 등)

  • 다양한 하드웨어 장치 지원.

  • 이식성이 뛰어남. (C언어 기반으로 프로그래밍과 포팅이 용이)

  • 다중 사용자(multi-user)가 동시에 사용할 수 있는 환경 제공.

  • 다중 작업(multi-tasking) 환경 제공.

  • 트리 형태의 계층적으로 구성된 파일 시스템.

  • 풍부한 소프트웨어 개발환경 제공 - 거의 모든 프로그래밍 언어 지원.

  • 강력한 네트워킹 기능 제공.

  • 오픈소스이고 무료로 제공되어 사용하는데 아무런 제한이 없다.


특히 리눅스는 서버(server) 영역과 임베디드(embedded) 시스템 영역에서 막강한 영향력을 가지며 모바일 운영체제와 최근에는 데스크탑 운영체제로도 주목을 받고 있다. 개인 PC용으로는 우분투(ubuntu)와 민트(Mint)가 널리 알려져 있으며  소형 임베디드 시스템에서 상대적으로 가벼운 데비안(Debian)이 많이 사용된다.


 Linux는 이미 검증받은 안정성으로 인하여 PC, 서버, 모바일기기 등의 OS로 널리 사용되고 있으나 초보자들이나 혹은 윈도같은 특정 GUI환경에만 익숙한 사용자들이 진입하기에는 다소 어렵게 느껴질 수 있다.


리눅스 강좌 전체 목록 >>>


c{linux},n{ln0004}

'맥,리눅스,윈도' 카테고리의 다른 글

리눅스의 파일 시스템  (0) 2015.05.16
리눅스의 커널(kernel)과 쉘(shell)  (0) 2015.05.16
자유 소프트웨어 재단 (FSF)의 설립  (0) 2015.05.16
유닉스(unix) 소개  (1) 2015.05.16
운영체제 개요  (0) 2015.05.16
Posted by 살레시오
,

 컴퓨터는 원래 수치 계산(numerical calcuation)을 빠르고 정확하게 수행할 목적으로 개발되었다. 수치 계산과는 다르게 기호식 계산(symbolic calculation)은 대수 기호가 들어간 수식을 다루는 것으로서 유한수로 정확히 표현되지 못하는 무리수를 기호로 표현하거나 또는 대수 기호가 포함된 방정식 등을 다루는 것이다. 사람이 이러한 개념을 사용하기는 어렵지 않으나 컴퓨터가 이러한 일을 하는 것은 전통적인 수치 계산 알고리듬보다 훨씬 더 어려운 일이다.


 예를 들어서 sin(x)/x의 x에 대한 미분을 구하려고 한다면 다음과 같이 간단하게 구할 수 있다.(다음은 live.sympy.org에서 수행한 것임)


 다른 예로 exp(x)*sin(x)의 정적분을 구하려고 한다면 이것 역시 심파이로 간단하게 수행할 수 있다. (손계산을 하려면 부분적분 공식을 적용해야 한다.) 다음은 winpython 의 ipython쉘에서 수행한 결과이다.



 이것은 기호식 계산의 한 가지 예일 뿐이고 실제로는 이것보다 훨씬 더 복잡한 수식과 문제들을 다룰 수 있다.


 이러한 시스템은 보통 CAS (Computer Algebra System)으로 불리며 심파이도 CAS 중 하나이다. CAS의 잘 알려진 다른 예로 Mathematica (상용 프로그램), Maxima, Sage  등이 있다. 심파이의 가장 큰 장점은 무료로 제한 없이 사용할 수 있는 오픈소스 모듈이라는 점이며 순수한 파이썬으로 만들어져 파이썬에 익숙하다면 배우는데 많은 시간이 걸리지 않는다.


 심파이(sympy)는 기호식 계산을 수행하기 위한 파이썬 모듈이며 현재(2015년 5월) 버전은 0.7.6 으로 활발하게 개발이 진행되고 있으며 많은 사용자들이 있다,




Posted by 살레시오
,