안녕하세요~!


이번에 새로 구매하게된 인텔 리얼센스(Real sense) 제품을 소개하고자 합니다^^



먼저 Real sense는 흔히 Depth Camera라고 하는 깊이측정 카메라(?)의 한 종류입니다.

기존에 LEAP Motion이나, 마이크로소프트사에서 출시됬던 Kinect도 일종의 Depth Camera중의 하나였죠ㅎㅎ


이번에 나온 인텔의 Real sense는 상당히 작은 크기의 하드웨어구성으로 큰 관심을 받고 있다고 합니다...!

길이는 딱 13cm이고, 폭은 2cm 내외로 아담한 사이즈 입니다.



제가 구매한 제품은 Real sense중에서도 R200이라는 제품입니다.

크게는 F200 (Face) SR300 (Short-range) 과 R200 (Long-range) 세 제품으로 나뉘게 되는데 실질적으로 F200의 상위 버전이 SR300이구요, 인텔관련 업체의 얘기에 따르면 R200 이 후에는 LR300이라는 모델로 나온다고 하네요.(확실하진 않습니다...!) 

아무튼 이번에는 R200에 대해서만 얘기해보도록 하죠ㅎㅎ


먼저 케이스에서 R200을 꺼내시고 컴퓨터에 연결을 해주세요!

윈도우 컴퓨터라면 아마 자동으로 드라이버를 설치하게 될 겁니다.


그 후 실질적인 프로그래밍을 원하신다면 아래 링크로 가셔서 SDK를 다운받으시면 됩니다.

https://registrationcenter.intel.com/en/forms/?productid=2383

메일과 국적을 입력하면 본인 메일로 설치관련 방법이 전달됩니다.


그럼 메일에서 SDK다운로드링크를 누르셔서 아래 페이지의 Download Now를 클릭!

(단! 개발을 목적으로 사용하시려면 Visual studio가 설치되어있어야합니다.)



설치파일을 실행하시면 아래와 같은 SDK툴을 선택할 수 있는데, Speech Recognition을 보아하니 음성인식도 지원하나봅니다....ㄷㄷ


아무튼 혹시 모르니 english를 설치해두겠습니다.


그 다음 설치경로를 지정해주시구요~


Next!


이제 Depth camera를 사용하기 직전..!


자! 이제 모든 설치가 완료되면, 윈도우 탐색기에서 "Camera Explorer" 라는 프로그램을 검색하셔서 실행하시면 아래와 같은 화면이 나옵니다!!!

.


저희는 R200만 연결했기에 R200만 뜨지요...ㅠ


그치만 누르고 나면 신세계.....! 일줄 알았지만 뭔지 잘 모르겠죠...?

그래서 몇몇 옵션들을 설정해보았습니다.



Color View를 클릭하고, Depth view도 클릭했더니,

멋지네요....!!ㅎㅎ

카메라의 2D 정보와 공간정보를 Overlay해서 3차원 텍스쳐 이미지를 만들어냅니다 ㅎㄷㄷ 



하지만 이 카메라는 설명에 나와있다싶이 Long Range라서, 단거리에서는 Depth Camera가 제역할을 하지 못합니다ㅠㅠ 조금만 물체를 가져다 대도 상당히 흐리게 나오죠.


그래서! SR300을 마저 테스트해보았습니다ㅎㅎ


SR300은 R200과는 반대로 멀어지면 인식이 제대로 안된답니다. 아마 이전 모델명이 F200인걸 감안하면 안면인식을 위한 컴퓨터나 테블릿의 전면부 카메라 목적이지 않을까 생각이 되네요ㅎㅎ


사실 거리를 결정하는것은 카메라 렌즈의 배율과 다른 특성들이 있겠지만, Real sense의 경우 세개의 카메라로 구성이 되어있습니다.

하나는 일반 RGB카메라, 나머지 두개는 IR 카메라(?)일겁니다.

두 IR카메라가 떨어진 거리와 렌즈의 배율에 따라 3차원적 Reconstruction에 제한이 걸리기 때문에 최적의 거리가 정해져 있는거죠.

마치 정면을 응시하면서 안구가 좌우로 안움직이게 고정하고 미간 사이에 손가락을 가까이 가져다대면 상이 두개로 보이면서 손가락을 제대로 인식하지 못하는 경우와 비슷하다 볼 수 있겠네요.


아무튼 혹시나 개발자 분들이나, 프로젝트를 진행하는 학생들에게 어떤 카메라를 사는게 유리할지 좀 도움이 됬기를 바랍니다.


그럼 이만...!


Be Different Developer :)

'잡담 > Review' 카테고리의 다른 글

아이로드 i7 스탠드 STL 파일  (27) 2017.04.04
전동 킥보드 아이로드 i7  (0) 2017.04.03
Onion 5불짜리 리눅스 서버  (0) 2017.03.27
펜 플러스(ADP-611) 사용기  (1) 2017.03.18
아이폰7 로즈골드 구매후기  (0) 2017.03.04

아두이노기반 압력센서 개발 [2]



지난시간에 제작했던 압력센서를 이용해 아두이노와 프로세싱에서 값을 읽어보겠습니다.


자 먼저 아두이노기반 압력센서 개발 [1] 에서 만들었던 수정된 예제파일을 이용해 값을 볼 수도 있지만, 저희만의 프로그램을 짜보도록 합시다.


먼저 아두이노에서 코드를 더 수정해서 센서값만 받아와보도록 할까요?


/************************************************************************/

#include <Wire.h>

#include "Adafruit_MPR121.h"


// You can have up to 4 on one i2c bus but one is enough for testing!

Adafruit_MPR121 cap = Adafruit_MPR121();


void setup() {

  while (!Serial);        // needed to keep leonardo/micro from starting too fast!

  Serial.begin(9600);

  

  if (!cap.begin(0x5A)) {

    Serial.println("MPR121 not found, check wiring?");

    while (1);

  }

}


void loop() {

  for (uint8_t i=0; i<12; i++) {

    Serial.print(cap.filteredData(i)); Serial.print(" ");

  }

  Serial.println();

  // put a delay so it isn't overwhelming

  delay(100);

}

/************************************************************************/

이 코드를 입력하고나면 시리얼 모니터에서는 아래와 같이 데이터들이 쭉 나열되서 확인이 될겁니다.


그럼 끝 아닌가요??


네 데이터만 받아보는거는 이렇게만 하면 끝입니다. 다만 값을 0 - 1023까지 값이 아닌 실제 압력이나 무게로 변환하기 위해서는 보정(Calibration) 작업이 필요합니다.


보정방법은 단순히 측정 무게의 추를 올려서 무게를 측정하는 방법으로 진행했습니다.


무게와 센서값을 엑셀에 잘 정리하면 하나의 그래프를 그릴수 있습니다. 

저는 Matlab을 이용하여 그래프를 나타내고, fit() 함수를 사용하여 센서값과 최대한 근사된 다항함수를 이용하여 보정을 했습니다.


%%%%% Matlab Code %%%%%%%%

data = [0, 470;

        5.4, 433;

        10.8, 420;

        16.2, 380;

        21.6, 357;

        27.0, 342;

        32.4, 330;

        37.8, 315;

        43.2, 295;

        100.0, 203;

        200.0, 150;

        300.0, 137;

        400.0, 128;

        500.0, 130;

        1000.0, 72;

        1500.0, 53;

        2000.0, 63;

        2500.0, 45;

        3000.0, 33;];

    

force = data(:,1);

voltage = data(:,2)/1023*5;

 

figure();plot(force, voltage);

set(gca,'xscale','log');

hold on;

 

filtY=fit(force,voltage,'exp2');

plot(filtY, force, voltage);

hold off;


%%%%%%%%%%%%%%%%%%%%%%%


실제로 피팅하면 아래와 같은 보정 그래프를 볼 수 있고, 이를 통해 압력을 알 수 있습니다.


그럼 보정하는 다항식을 아두이노에 넣을건가? 

실시간으로 아두이노 모니터를 통해 보신다면 그게 좋지만, 혹시나 프로세싱이나 안드로이드 등 다른 프로그램을 통해 압력값을 본다면, 아두이노에서는 그냥 0 - 1023의 데이터를 보내고, 프로세싱, 안드로이드에서 보정을 해주는 것이 효율적이다!


그럼 프로세싱으로는 어떻게 값을 읽어올까?


먼저 아두이노에서 값을 던질때,


387 396 410 419 421 422 419 422  412 399  388 379

387 396 410 419 421 422 419 422  412 399  388 379

387 396 410 419 421 422 419 422  412 399  388 379


이런 식으로 데이터가 나올텐데, 만약


#387 396 410 419 421 422 419 422  412 399  388 379!

#387 396 410 419 421 422 419 422  412 399  388 379!

#387 396 410 419 421 422 419 422  412 399  388 379!


위와 같이 나온다면, 어디서부터 어디까지가 한번에 읽어들인 데이터인지 알 수 있다.


그럼 프로세싱에서도 위와같이 컴퓨터가 #이라는 데이터를 받아들인 순간부터 !를 읽어들일때 까지를 하나의 데이터로 인식하게끔 만들면 된다.


/*****************************************************/


// 시리얼 통신을 위한패키지 호출

import processing.serial.*;


// 시리얼 통신 및 콘솔 아우풋을 위한 설정

Serial  myPort;

PrintWriter output;


int     lf = 40;       

String  inString;      

float[] intensity = new float[8];


void setup() {

  size(288, 276);


  String portName = Serial.list()[2];

  // 위 함수에서 컴퓨터와 연결된 아두이노의 포트넘버를 확인하고 거기에 맞는 숫자를 입력해야한다. (여기선 2번째라 '2'가 들어갔다)

  //  println(Serial.list());


  myPort = new Serial(this, portName, 9600);

  myPort.clear();

  myPort.bufferUntil(lf);

}


void draw() {

  background(0);

}


void serialEvent(Serial p) {


  inString = (myPort.readString());

  try {

    String[] dataStrings = split(inString, ' ');


    if ('s' == dataStrings[0].charAt(0)) {

      // dataStrings.length = number of array elements seperated by '#'.

      for (int i = 1; i < dataStrings.length; i++) {   

        intensity[i-1] = Integer.parseInt(dataStrings[i].substring(0, 3));

output.print(intensity[i-1] + " ");

      }

    output.println();

    }

  }

  catch (Exception e) {

    println("Caught Exception");

    exit();

  }

}


// ESC키가 눌렸을 때 프로그램 종료

void keyPressed() {

  if (key == 27) { // 27 means ESC key

    exit(); // Stops the program

  }

}


/*****************************************************/



아마 사용하실 때 수정하셔야 할 부분은 serialEvent 함수 중에서 33 ~ 38번 줄만 수정하면 원하는 데이터 형태를 바로 정수로 변환하여 모니터링 할 수 있을거다.

만약 아두이노와 프로세싱간에 연동이 잘 된다면 아두이노의 시리얼 모니터에서 보는것과 같은 데이터가 프로세싱의 콘솔창에 나타날 것이다.

그 후 센서의 보정을 원한다면 프로세싱에서 작업을 해주면 된다 :)

사실 뒷부분은 예전에 센서를 제작한 터라 구체적인 설명이 부족합니다ㅠㅠ 
혹시나 프로젝트를 진행하시다가 궁금하거나 어려운점이 있으시면 댓글에 남겨주세요ㅎㅎ


Have a good time with Arduino :)



아두이노기반 압력센서 개발 [1]


이번엔 정전압 압력 센서를 제작해 봅시다.

먼저 센서를 만들기 전에 간단한 원리부터 살펴보면, 외부의 힘/압력에 대해 Capacitance의 값이 변하는 것을 정전압 압력센서라고 합니다.



물리에서 배웠다싶이 Capacitance는 면적에 비례하고 판과 판사이의 거리에 반비례합니다.

여기서 집중해야할 값은 판의 면적보다 판과 판의 거리입니다.

외부의 '힘(Force, F)' 이 가해지면 두 판 사이의 거리가 가까워지게되고, 이는 Capacitance를 증가시키게 되죠.


그리고 단위면적당 가해지는 힘을 '압력(Pressure, P)' 이라 표현하므로, 제작되는 센서는 압력을 측정할 수 있겠죠.

물론 구해진 압력에 센서의 '단면적(Area, A)' 을 곱하면 역으로 센서에 가해지는 힘 또한 알 수 있습니다ㅎㅎ....

(어려우시다면... 구글구글....!!)


또 다른 압력센서는 외부의 힘/압력에 대해 Resistance(저항)의 값이 변하는 센서인 Force Sensitive Resistor(FSR) Sensor 가 있습니다.



아마 아두이노를 조금 다뤄보신 분들은 위에처럼 생긴 센서를 사용해보신적이 있을거에요ㅎㅎ

저 센서가 바로 FSR 센서입니다. 

정전압 센서와는 달리 압력에 따라 저항이 바뀌는 형태기 때문에, 아두이노에 사용하기에는 좀 더 수월한 센서입니다.


원리는 위와 같은 여러 층의 필름들이 겹쳐져 있는것에서 보실수 있습니다.

중간 층은 윗층과 아랫층을 떨어뜨려주는 역할을 하고,
압력이 세질수록 아랫면의 Active dot들이 반도체에 닿이면서 저항이 변하게 된답니다.



자 지루한 원리는 이까지 설명하고!


Practical하게 FSR 압력센서 제작에 대해 배워봅시다.


우선 지난 포스팅에서 알려드린바와 같이 정전압 압력 시트 (Pressure-Sensitive Conductive Sheet)  <- (클릭!)

그리고 전도성 실만(?) 있으면 만들 수 있습니다.

물론 구하기 쉽지않은 재료이므로... 도전하실 분들만 한번 해보세요ㅎㅎ

(귀찮으신 분들은 나중에FSR, fouce sensitive resistor 을 구매해서 쓰세요!)


1. 먼저 100원짜리 동전을 시트위에 얹고 동그란 모양으로 시트를 오려줍니다.

2. 그 위에 전도성 실을 구불구불하게 모양을 잡고 테이프로 마무리 해줍니다.


3. 위 그림에서 보이듯, 전도성 실의 양쪽 끝 중 한쪽끝을 잘라내어 외부로 튀어나오지 않게 테이프 안으로 잘 넣어줍니다.

4. 시트를 뒤집어 뒷면도 전도성 실을 붙이는데, 앞면과 비교했을때 그물모양이 되도록 모양을 잡고 붙인뒤, 한쪽끝만 남기고 실을 정리합니다.

4. 이제 센서의 한쪽 끝을 GND에, 다른 한쪽 끝을 AI0핀에 꽂아줍니다.
  (실이라 잘 안될수도 있으니, 금속선에 묶어서 사용하시거나, 구리테이프를 이용하시면 수월할거에요ㅎㅎ)


5. 그리고 실 한쪽이 연결된 AI0 핀에 1Kohm 저항의 한쪽 다리를 연결해 주시고, 저항의 또 다른 한쪽 다리는 5V에 연결해주세요~!

  이렇게 연결하면 저절로 Voltage divider 회로가 구성이 된답니다.


AI0핀에 입력되는 전압(Vout)은 R2값이 변하면서 자동으로 변하게 됩니다!

Vout = 5V*( R2 / (R1+R2) ) 만큼 걸리게 됩니다. 


5. 그리고 코딩은 단순히 AI0핀의 값을 읽어오기만 하면 값의 변화를 확인 할 수 있답니다ㅎㅎ



그럼 다음포스팅에서는 여러개의 센서를 연결해서 어떻게 값을 받고, 센서값의 보정은 어떻게 하는지 한번 봅시다.

다음에 봬요~ 뿅!!


Have a good time with Arduino :)


+ Recent posts