아두이노(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 살레시오
,

 비트 이동(shift) 연산자는 방향에 따라 두 가지가 있는데 <<연산자는 왼쪽 이동 연산자이고 >>는 오른쪽 이동 연산자이다. 쉬프트(shift)는 비트의 자리를 이동시킨다는 용어인데 이 연산자의 오른쪽에 적인 숫자의 자리수만큼 순차적으로 이동시킨다. 사용 문법은 var<<n (혹은 var>>n) 이며 변수 var을 n비트 좌측(혹은 우측)으로 이동시킨다.


unsigned char uca = 0b01101100;

unsigned char ucb = uca >> 2; // 각 비트를 오른쪽으로 두 자리씩 이동

unsigned char ucc = ucc << 3; // 각 비트를 왼쪽으로 세 자리씩 이동


비트들이 자리 이동을 하게 되면 밀려나서 버려지는 비트들이 있으며 반대로 채워야되는 자리가 생기게 되는데 두 가지 경우가 약간 차이가 있다. 먼저, 왼쪽으로 비트들을 이동시키는 << 연산자의 경우 비트들이 왼쪽으로 자리를 이동하게 되면 비는 공간을 0으로 채우게 되며 자리 이동으로 인해 밀려나가는 비트들은 모두 버려지게 된다.


반면, 오른쪽으로 비트들을 이동시키는 >>연산의 경우는 오른쪽으로 밀려나가는 비트들은 버려지지만 좌측에 생기는 빈 공간에는 부호가 없는 데이터형이면 0으로, 반대로 부호가 있는 데이터형은 부호를 유지시키기 위해서 원래 변수 값의 최상위비트(MSB)로 채운다. (주의할 것)


 예를 들어 (unsigned char) ucx=5 라면 ucx<<= 2 명령에 의해 원래 (0b00000101)이 (0b00010100) 십진수로 20이 된다. 왼쪽으로 쉬프트는 2를 곱하는 효과가 있으므로 2번 쉬프트하면 4를 곱한 효과가 난다.


unsigned char ucx = 0b00000101;

ucx <<= 2; // 0b00010100 이 된다.


반대로 ucx>>=2 는 결과값이 (0b00000001)이 된며 오른쪽으로 쉬프트하는 것은 2로 나눈 효과가 있게 된다. 이 경우 ucx변수가 부호가 없는 데이터형이기 때문에 최상위비트는 0으로 채워진다.


unsigned char ucx = 0b00000101;

ucx >>= 2; // 0b00000001 이 된다.


 만약 부호가 있는 데이터형 변수 (char) ca=-2 이라면 2진수로 표현하면 0b11111110 이다. 이것을 cA>>=1 연산을 한 결과는 0b11111111이 된다 (십진수로는 –1이다.). 이 경우는 부호가 있는 데이터형이기 때문에 최상위 비트가 원래 부호비트값인 1로 채워지는 것이다.


char ca = -2; // 이진수로 0b11111110 이다.

ca >>= 1; // 0b11111111 (십진수로 -1) 이 된다.


 다음 예제를 입력하고 결과를 확인해 보자.


#include "stdio.h"
typedef unsigned char uchar;
int main()
{
  uchar ucA = 0x05, ucB, ucC;
  ucB = ucA << 3;
  ucC = ucA >> 1;
  printf("ucA : 0x%x\n", ucA);
  printf("ucB : 0x%x\n", ucB);
  printf("ucC : 0x%x\n", ucC);
}


ucA : 0x5
ucB : 0x28
ucC : 0x2


이진수로는 0b00000101, 0b00101000, 0b00000010 에 각각 해당된다.


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


c{c++},n{c0054}

'프로그래밍언어.Lib > C,C++' 카테고리의 다른 글

C언어의 표준안들 개요  (0) 2015.05.24
1.4 C 프로그램 개발 과정  (0) 2015.05.24
C/C++의 bitwise-not 연산 (~)  (0) 2015.05.20
C/C++의 bitwise-xor 연산 (^)  (0) 2015.05.20
C/C++의 bitwise-or 연산자 (|)  (0) 2015.05.20
Posted by 살레시오
,

 bitwise - not 연산자 ~ 는 단항 연산자로 각 비트를 반전(toggle)시킨다. 즉 1은 0으로, 0은 1로 바꾼다.


표 3.5.4 비트not연산

x

~x

0

1

1

0


이 연산은 전체 비트에 대해서 수행된다. 예를 들면 다음과 같다.


unsigned char uca = 0b10101100, ucb;

ucb = ~uca; // 0b01010011 이 대입된다.


 다음 예제는 위의 네 가지 비트 연산(&, |, ^, ~)을 수행한 결과를 16진수로 보여주는 예제이다. 전 절에서도 소개한 바와 같이 printf()함수에서 정수를 16진수로 표시하는 서식 문자는 ‘%x’이다. 연습을 위해서 16진수 하나하나를 이진수로 바꾼 다음 손으로 연산을 수행해 보기를 권한다.


#include <stdio.h>
typedef unsigned char uchar;
int main(void)
{
  uchar ucA1 = 0xfa;
  uchar ucB1 = 0x3a;
  uchar ucC1 = 0xc1, ucC2;
  uchar ucD1 = 0xbb, ucD2 = 0xa8, ucD3;
  ucC2 = ~ucC1;
  ucD3 = ucD1^ucD2;
  printf("0x%x & 0xf0 = 0x%x\n", ucA1, ucA1 & 0xf0);
  printf("0x%x | 0x8c = 0x%x\n", ucB1, ucB1 | 0x8c);
  printf("~0x%x = 0x%x\n", ucC1, ucC2);
  printf("0x%x ^ 0x%x = 0x%x\n", ucD1, ucD2, ucD3);
}


0xfa & 0xf0 = 0xf0
0x3a | 0x8c = 0xbe
~0xc1 = 0x3e
0xbb ^ 0xa8 = 0x13


여기에서 typedef 명령에 의해서 unsigned char 형은 uchar 로 줄여서 사용할 수 있다. 즉, main()함수 내의 uchar 은 unsigned char 와 같다.


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


c{c++},n{c0053}

Posted by 살레시오
,