다들 대학생이되면 사춘기처럼 겪는 일중 하나가 '대한민국으로부터의 일탈!' 이 아닐까 싶다.

물론 정치나, 사회적 부조리 등에 의한 일탈일수도 있겠지만, 그것 보다도 단순히 


'이제 자유로운 대학생이니 해외여행이나 가봐야지!' 


라는 생각이 드는 일탈 말이다.


그 중에 가장 가보고 싶은곳은 아마 유럽이 아닐까 싶다. 주변을 살펴보면 대학에 들어와서 알바를 통해 돈을 모아서 2학년~3학년 방학중에 해외여행을 가는 친구들이 꽤많았다. 그당시 내 심정을 더듬어보면, 친구들이 부럽기도 했지만, 그것보다 미래에 대한 불안함, 조바심때문에 해외여행을 가지 못했던것이 아닐까 싶다. 그렇게 어영부영 시간이 흘러 자연스레 대학원생이 되었고, 뒤돌아보니 이미 상당한 길을 걸어왔다는 생각이 들었다. 그러다 문득 


'이러다 시간이 더 흐르면, 해외에 갈 만큼의 자유로움이 있을까..?'


라는 생각이 들었다...

이런 고민이 계속 되던 2016년 늦은 가을, 대학원에 입학하고서 2학기째를 마치던 내게 룸메이트가 즉흥적으로 제안을 했다. "우리 유럽여행가자!"


이 말을 듣고 상당한 내적 갈등이 많았다. '금액이 만만찮을텐데, 어떻게 구하지...?', '막상 가면 정말 재밌겠다!', '그런데 지금 갈 상황이 되긴 할까...?', 등등등 수만가지 생각들이 몇일간 왔다갔다 하고나서 결정을 내렸다.


'지금이라도 안가면 언제 또 가보겠어!'


그렇게 비행기티켓도 알아보고, 숙소도 찾아보면서 경비를 최소한으로 줄여봤다. 그래도 족히 200만원은 넘을 돈이었다. 고민끝에 나는 생활비대출을 받아 여행자금을 만들었고, 실제로 여행 막바지에는 돈이 모자라 신용카드를 쓰면서 약 30만원정도 더 추가되었다.


여행기를 쓰기에 앞서 이렇게 길게 글을 쓴 이유는, '늦었다고 생각할 때야말로 시작할 때'라는 것! 온갖 걱정과 고민거리가 가득하더라도, 여행을 시작하는 동안은 엄청난 행복을 맛볼수 있다. 그러다 여행 막바지가되면 한국에 돌아갈때를 생각하며 다시 걱정, 고민들이 언제 그랬냐는듯 자연스레 밀려들어온다. 물론 한국에 들어와서 생각했던 걱정만큼은 아니지만 이런저런 수모를 겪기도 했다. 그래도 이상을 두고 쳐다보기만 하면서 자린고비와 같은 삶을 사는 것과, 이상을 두고 어려움이 있더라도 정복하려는 삶을 비교해볼 때, 후자가 내 삶에 있어 큰 동기부여가 되고, 조금더 밋밋하지 않은, 다이나믹한 인생을 선사하지 않을까 싶은 생각이 든다.


잔소리같은 여행후기는 이쯤으로 하고 그럼 본격적으로 어떻게 준비했는지, 어떤 경로로 다녀왔는지 다음 포스팅에서 알려드리겠습니다^^

이번 포스팅은 광학(Optics)에 대해 공부하면서 배운것들을 쭉 정리하려고 합니다^^


의생명과 관련되서 공부를 하다보니 아무래도 의학 이미징 장비의 이용과 개발을 위해 광학은 필수적인 학문이라는 생각이 드네요ㅎㅎ


우선 광학(Optics, 光學)은 말 그대로 빛의 특성을 연구하는 학문이라고 볼 수 있습니다.


광학은 시대에 따라 학문의 깊이가 조금씩 다릅니다. 고대에는 가장 단순한 기하광학부터, 최근에는 물리학계에서 큰 이슈를 부르고있는 양자광학까지 고급화(?) 되었다고 봐야겠지요ㅎㅎ



이번시간에는 파동광학과 기하광학을 위주로 공부할텐데, 대부분의 눈에 보이는 현상들은 충분히 설명할 수 있으니 간단하게 배워봅시다!


자, 가장먼저 배워야할 빛의 성질은 


(1) "빛은 광학거리가 최소가 되는 경로로 간다"


이 성질은 페르마의 원리(Fermat`s Principle)로도 잘 알려져있는데, 빛이 반사하든, 굴절하든 어떻게 되든 가장 최단경로로 움직인다는 뜻입니다.


그림으로 살펴보면 이해하기 쉬울겁니다.

파란색 경로를 경로1, 빨간색 경로를 경로2라 하고, 바닥에 거울이 있다고 가정하면(반사의 경우),

빛은 경로1이 아닌 경로2를 통해 움직인다는 뜻이지요.


왜냐하면 삼각형SP1O* 를 살펴봤을때, 선분SP1 + 선분P1O* > 선분SO* 의 조건을 만족하기 때문에 가장 단거리가 되는 S -> P2 -> O 를 통해 움직인다고 할 수 있지요^^


그럼 굴절의 경우는 어떻게 될까요?


이때도 페르마의 원리는 유효합니다.


눈으로 봤을때는 직선으로 가는게 짧아보이겠지만, 이는 선으로 그린 물리적인 거리이고, 실제로 빛이 느끼는 거리는 "광학거리(Optical Path length)" 를 살펴봐야합니다. 


실제로 광학거리는 물리적인 거리와도 연관이 있지만, 굴절률(Refractive Index)과도 큰 연관이 있습니다.

굴절률이란, 물질의 고유 특성으로, 진공중의 빛의 속도에 대한 물체내의 빛의 속도의 비 라고 보시면 됩니다.


즉, 

(c0 : 진공중에서 빛의 속도 , cx : 매질 x에서의 빛의 속도)


로 표현됩니다.


그렇다면 굴절률을 고려한 광학적 거리는 어떻게 표현될까요?


광학거리(l) = 물리적 거리(d) x 굴절률(n)


이란 관계가 있으므로, 최단거리를 구하면 직선이 아닌 꺾인 선이 나오게 되는것입니다.


자 여기서 발생하는 광학적 법칙은 스넬의 법칙(Snell`s Law)입니다.


(2)


위 식을 그림에 맞게 다시 써보면,



로 나타낼수 있습니다.


위 식을 말로 풀어쓰자면,  "빛은 굴절률이 높은쪽으로 꺾인다."

아직 이해가 안가신다면 증명을 통해서 한번 살펴봅시다.

위 사진에서 매질(n1)의 광원으로부터 경계면까지 거리를 a,

경계면부터 관측지점까지 거리를 b,

광원부터 법선까지 수직거리를 x,

관측지점부터 광원까지 수직 거리를 d

라고 하면


우리가 구해야하는 것은 페르마 법칙에 의해 빛의 이동거리가 최소가 되는 경로, 즉 관측점까지 도달하는 "시간"이 최소가 되는경로를 구해야하므로,


시간(t) 에 대해 수식을 먼저 나타내봅니다.


여기서, 시간이 최소가 되는지점에서는 미분값이 0이 되야하므로,



위 값이 0이 되는 조건은


이와 같이 되고, 속도 v 는 굴절률에 반비례하므로, 



이렇게 나타낼 수 있습니다.

결국엔 스넬의 법칙꼴로 수식이 나오게 되지요.


미분법을 이용하는것 말고 단순한 기하학으로도 풀 수 있으니 한번 해보시기 바랍니다^^





자 그럼 이러한 특성들이 자연현상에서는 어떻게 관측이 될까요?




- Flathead Lake 

엄청 깨끗한 호수로 잘 알려진 이곳은 겉으로 보기에는 수심이 얕아보이지만, 실제로는 상당히 수심이 깊다고 합니다.




- Coin under water glass

드디어 좋은 기회가 생겨 폰을 바꾸게되었네요ㅎㅎㅎㅎ


아이폰32G 로즈골드 색상으로 괜찮은 조건이 생겨서 KT로 갈아탔는데 맘에 쏙 듭니다^^

남자라고 로즈골드 쓰지마라는 법이 있나요....ㅋㅋㅋㅋ



뚜둥....!! 비닐도 뜯지 않은 이런 기기를 개통할때의 희열이란....

겪어본사람 말고는 모를거에요ㅎㅎㅎ 마치 택배기사님을 기다리다 받은 택배같은 



반짝반짝거리는 뜯지 않은 아이폰 포장ㅎㅎㅎㅎㅎ 다시봐도 기분좋네용ㅋㅋㅋ



이제 비닐을 뜯고 뚜껑을 열면....(하악....!!)

기스하나 없는, 보호필름이 붙어있는 저 고운 자태의 아이폰ㅋㅋㅋㅋ



이제 폰을 켜고 기본 세팅을 마칩니다ㅎㅎ

수많은 언어들이 스쳐지나가는데 한국어로 '안녕하세요'가 뜨는 순간을 기다리다 찰칵!!

지문도 등록하고 모든 설정을 마치고나니 비닐이 너무 갈구치네요....ㅠㅠㅠ


얼른 온라인으로 강화유리를 주문해야겠습니다...



라고 생각하다가 들린 다이소!! 

아이폰 7 강화유리를 찾았지만..없었습니다ㅠㅠ 대신에 아이폰6와 거의 동일하다는 말을 듣고 구매했는데, 왠걸 3천원의 행복이랄까ㅎㅎㅎㅎ


사진에서 보이는것 처럼 살짝 디스플레이 끝에 짤막하긴 하지만, 저렴한 가격에 쓰기에는 만족입니다^^

지문도 별로 안묻고 표면이 매끌매끌해서 사용하기 좋네요! 적극 추천입니다!!



폰 바꾸고 너무 행복해섷ㅎㅎㅎ

역시 개발자들에겐 아이폰이 뭔가 친숙하네요^^(라고 변명하지만 앱등이라 하지요...)


근데 맥북 유저로서 확실히 아이폰은 엄청 많은 장점이 있어요!


1. 자동 사진연동

2. 전화 맥북으로 받기

3. 검색 기록 동기화

4. Air Drop

...


기타등등 상당히 많은 장점이 있어서 편하답니당ㅋㅋㅋ


하지만 언제 또 보내야할지 모르기에 기스없이 깔끔하게 범퍼케이스에 잘 모셔다두고 써야지요...

몸값이 높으신 분인지라ㅎㅎ


아무튼 이제 이 폰으로 많은 작업 사진들을 촬영해서 블로그 포스팅을 할 예정이니 기대해주세요^^



- 본 포스팅은 그 어느 업체의 후원도 받지 못하고 주인장 본인의 자본으로 작성된 블로그입니다...

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

아이로드 i7 스탠드 STL 파일  (27) 2017.04.04
전동 킥보드 아이로드 i7  (0) 2017.04.03
Onion 5불짜리 리눅스 서버  (0) 2017.03.27
펜 플러스(ADP-611) 사용기  (1) 2017.03.18
인텔 리얼센스 (Real sense) 사용기  (7) 2016.10.11



이번 포스팅에서는 433MHz 무선통신 모듈 사용에 대해 전해드리겠습니다.


우선 보통 무선통신 모듈 하면 블루투스나 와이파이가 가장 흔히 사용이 되는데, 아무래도 통신거리에 제한이 많기때문에 원거리 조종이  필요한 경우에는 RF 모듈을 사용하죠.


이번에 사용할 모듈스펙을 볼까요? 

모듈명 : AS07-M1101S (중국 카피제품인듯 합니다ㅎㅎ 'CC1101 Module' 로 검색하시면 자료를 더 찾으실 수 있어요!)

RF주파수 : 420 ~ 450MHz

통신 거리 : ~ 1Km

인가 전압 : 1.8 ~ 3.6V

가동 온도 : -40 ~ 85 

데이터 전송 속도 : ~ 500Kb/s

소모 전류 : ~17mA(수신), ~30mA(송신)


이 모듈을 이용하면 최장 1km가 떨어진 거리에서도 데이터 송수신이 가능하다고 합니다...!!

(하지만 장애물이 있는 실내의 경우 테스트결과 100~200m 만 넘어가도 데이터 송수신이 원활하지가 않더라구요...ㅠㅠ)



이번엔 아두이노 보드 2개와 433MHz 통신모듈 2개로 각각 송신기기, 수신기기를 만들어보겠습니다.


우선 핀배치가 1.27pitch여서 기존 빵판(2.54 pitch)에 사용할수 없기때문에 손수 납땜을 통해 와이어링을 했습니다.


납땜에 자신이 없으신 분은 1.27pitch 에서 2.54pitch로 변환해주는 보드를 구매하시거나, 1.27pitch의 PCB 만능기판에 납땜하셔서 1칸씩 건너뛰어 와이어링 하시면 2.54pitch에 맞게 사용하실 수 있어요^^



자 이제 전선도 뽑아냈으니, 아두이노와 연결해볼까요~?


우선 본 무선통신 모듈은 아두이노와 연결되어 SPI통신을 통해 데이터를 주고받습니다.

SPI통신이란 Serial Peripheral Interface의 줄임말로, 모토로라에서 고안해낸 통신방식입니다.

이 통신은 하나의 Master 모듈과 여러개의 Slave 모듈이 연결되는 (Peripheral) 방식의 통신으로, 


MISO (Master Input Slave Output) : Master기준 입력신호

MOSI (Master Output Slave Input) : Master기준 출력신호

SCK (Serial Clock) : Master로부터 나오는 Clock (신호 동기화를 위한 Clock)

SS (Slave Select) : 여러개의 Slave모듈이 연결되었을때, 특정 모듈을 선택하여 통신할수 있게끔 해주는 신호 (Enable 핀과 비슷한 역할을 합니다)


위와 같은 총 네개의 핀으로 통신을 합니다.

더 구체적인 내용들은 통신에 대한 설명 포스팅에서 자세히 다루겠습니다^^


자 그럼 아두이노와 무선모듈을 어떻게 연결하면 될까요?


  <433MHz 모듈>    <아두이노>


GOD0    ------       2

GOD2    ------       9

CSN/SS  ------      10

MISO*    ------      11

MOSI     ------      12

SCK       ------      13

VCC       ------    3.3V

GND      ------    GND


(아무래도 GOD1핀에 대한 설명이 부족해서 찾질 못했지만, 테스트해보니 MISO핀이 맞습니다.)



송신모듈 (Transmitter)



#include <ELECHOUSE_CC1101.h>


#define size 11


byte TX_buffer[size]={0};

byte i;


void setup()

{

  Serial.begin(9600);

  ELECHOUSE_cc1101.Init();

  for(i=0;i<size;i++)

  {

     TX_buffer[i]=i;

  }

}


void loop()

{

  ELECHOUSE_cc1101.SendData(TX_buffer,size);

  delay(1);

}




수신모듈(Receiver)





#include <ELECHOUSE_CC1101.h>

 

 void setup()

{

  Serial.begin(9600);

  ELECHOUSE_cc1101.Init();

  ELECHOUSE_cc1101.SetReceive();

}


byte RX_buffer[11]={0};

byte size,i,flag;


void loop()

{

  if(ELECHOUSE_cc1101.CheckReceiveFlag())

  {

    size=ELECHOUSE_cc1101.ReceiveData(RX_buffer);

    for(i=0;i<size;i++)

    {

      Serial.print(RX_buffer[i],DEC);

      Serial.print("  ");

    }

    Serial.println("");

    ELECHOUSE_cc1101.SetReceive();

  }

}




각각의 모듈에 위 코드를 심어주고, Receiver모듈을 잡아서 시리얼 모니터를 보시게되면 아래와 같이 0~10까지 Transmitter 모듈에서 전송된 숫자가 나타나게 됩니다.




위 예제코드는 첨부파일로 올려두겠습니다^^

CC1101.zip

Panstamp.zip


위 코드는 CC1101에 해당하는 예제이고, Panstamp는 조금더 복잡한, RSSI, Data length, CRC 등등을 확인하는 함수들을 사용한답니다ㅎㅎ


Panstamp코드를 실행하면 아래와 같이 신호강도(RSSI), 데이터 길이, 패킷정보 등 다양하게 확인할 수 있고, 이 함수를 이용해 실질적으로 프로젝트에 사용할 수 있습니다.



이렇게 433mHz 무선통신 모듈의 사용법을 알아보았습니다^^


디테일한 설명들이 부족하긴 하지만, 궁금한점이 있으시면 댓글 남겨주세요~!


지난시간에 이어 이번시간에는 OLED모듈에 원하는 아이콘을 어떻게 그리는지에 대해 알아보도록 하겠습니다.


보통 한장의 사진을 컴퓨터에 저장할때 흔히들 사용하는 포멧이 .jpeg, .jpg, .png 등등 이러한 형태일텐데요~

대부분의 이미지들은 원본 데이터를 압축하여 저장을 하게 된답니다. 때문에 미세하게 보면 일그러지거나 왜곡되는 현상이 부분부분 나타나게 된답니다.


그렇다면 원본 데이터를 손상없이 저장하려면 어떻게 해야할까요? 바로 비트맵(Bitmap, ~.bmp) 형식의 파일입니다.


비트맵이란, 말 그대로 각각의 데이터(비트)를 일일이 매핑하여 나타내는 것으로, 압축되지않은, 픽셀단위의 데이터를 모두 보관하고 있는 이미지입니다.


왜 뜬금없이 비트맵을 설명했냐하면!!


보통의 LCD, LED 디스플레이의 경우, 하나 하나의 점(픽셀)을 이용해 글씨나 그림을 나타내는 방식으로, 이를 원하는 그림으로 바꾸기 위해서는 각각의 픽셀을 켜고, 끄는것을 통해 제어를 해야합니다.


간단히 예를 들어보면,


지난 포스팅의 마지막부분에 보여드렸던 

  B00000000, B11000000,

  B00000001, B11000000,

  B00000001, B11000000,

  B00000011, B11100000,

  B11110011, B11100000,

  B11111110, B11111000,

  B01111110, B11111111,

  B00110011, B10011111,

  B00011111, B11111100,

  B00001101, B01110000,

  B00011011, B10100000,

  B00111111, B11100000,

  B00111111, B11110000,

  B01111100, B11110000,

  B01110000, B01110000,

  B00000000, B00110000


이 데이터를 보면 대체 뭔가 싶기도 하시겠지만, 사실 이 자체가 하나의 그림을 나타내고 있답니다.


이를 좀더 그림같아 보이게 표에다가 넣어보면


위와 같이 나올텐데, 직관적으로 어떤 그림인지 감이 안오시죠?


그렇다면 1이된 부분만 색칠해보면(1이된 부분만 불이 켜지니깐요^^),



짜잔...! 엉성하긴 하지만 나름 별모양이지요? 

네 바로 Adafruit 회사의 로고모양입니다.


이번 시간에는 I2C 통신을 이용한 128x64 OLED 디스플레이 모듈 사용에 대해 배워보겠습니다.


먼저, I2C 통신을 하기 위해서는 장치의 Address를 알아야 하는데, 보통은 장치의 Spec sheet를 보면 나와있습니다.

만에 하나 Address를 모른다고 하면, 아래처럼 하드웨어를 연결하고 코드를 업로드 하시면 연결된 장치의 Address를 알 수 있습니다^^


 

 OLED모듈    아두이노

     VCC  ----  5V
     GND ---- GND

     SDA ---- SDA (A4)

     SCL  ---- SCL (A5)



  1. // --------------------------------------
  2. // i2c_scanner
  3. //
  4. // Version 1
  5. //    This program (or code that looks like it)
  6. //    can be found in many places.
  7. //    For example on the Arduino.cc forum.
  8. //    The original author is not know.
  9. // Version 2, Juni 2012, Using Arduino 1.0.1
  10. //     Adapted to be as simple as possible by Arduino.cc user Krodal
  11. // Version 3, Feb 26  2013
  12. //    V3 by louarnold
  13. // Version 4, March 3, 2013, Using Arduino 1.0.3
  14. //    by Arduino.cc user Krodal.
  15. //    Changes by louarnold removed.
  16. //    Scanning addresses changed from 0...127 to 1...119,
  17. //    according to the i2c scanner by Nick Gammon
  18. //    http://www.gammon.com.au/forum/?id=10896
  19. // Version 5, March 28, 2013
  20. //    As version 4, but address scans now to 127.
  21. //    A sensor seems to use address 120.
  22. // Version 6, November 27, 2015.
  23. //    Added waiting for the Leonardo serial communication.
  24. //
  25. //
  26. // This sketch tests the standard 7-bit addresses
  27. // Devices with higher bit address might not be seen properly.
  28. //
  29.  
  30. #include <Wire.h>
  31.  
  32.  
  33. void setup()
  34. {
  35.   Wire.begin();
  36.  
  37.   Serial.begin(9600);
  38.   while (!Serial);             // Leonardo: wait for serial monitor
  39.   Serial.println("\nI2C Scanner");
  40. }
  41.  
  42.  
  43. void loop()
  44. {
  45.   byte error, address;
  46.   int nDevices;
  47.  
  48.   Serial.println("Scanning...");
  49.  
  50.   nDevices = 0;
  51.   for(address = 1; address < 127; address++ )
  52.   {
  53.     // The i2c_scanner uses the return value of
  54.     // the Write.endTransmisstion to see if
  55.     // a device did acknowledge to the address.
  56.     Wire.beginTransmission(address);
  57.     error = Wire.endTransmission();
  58.  
  59.     if (error == 0)
  60.     {
  61.       Serial.print("I2C device found at address 0x");
  62.       if (address<16)
  63.         Serial.print("0");
  64.       Serial.print(address,HEX);
  65.       Serial.println("  !");
  66.  
  67.       nDevices++;
  68.     }
  69.     else if (error==4)
  70.     {
  71.       Serial.print("Unknow error at address 0x");
  72.       if (address<16)
  73.         Serial.print("0");
  74.       Serial.println(address,HEX);
  75.     }    
  76.   }
  77.   if (nDevices == 0)
  78.     Serial.println("No I2C devices found\n");
  79.   else
  80.     Serial.println("done\n");
  81.  
  82.   delay(5000);           // wait 5 seconds for next scan
  83. }



그리고 시리얼 모니터 창을 켜보시면 아래와 같이 Address가 나옵니다.



자 그럼 Address도 알았겠다, 본격적으로 시작을 해보겠습니다.


우선 필요한 라이브러리부터 다운받도록 하겠습니다.

1. https://github.com/adafruit/Adafruit_SSD1306 (Adafruit_SSD1306)

2. https://github.com/adafruit/Adafruit-GFX-Library (Adafruit-GFX-Library)


위 라이브러리들을 다운받으신 뒤, 아래 폴더에 압축을 푸시면 아두이노에서 라이브러리를 쓰실 수 있습니다.

C:\Users\(사용자 이름)\Documents\Arduino\libraries


자 이제 아두이노를 실행시켜서 예제를 먼저 업로드 해보겠습니다.



제대로 업로드가 되면 아래와 같은 영상이 OLED 디스플레이에 나타나게 됩니다^^






본 디스플레이 모듈에서 특정 이미지나 아이콘을 보여주고싶으시다면, 


static const unsigned char PROGMEM logo16_glcd_bmp[] =

{ B00000000, B11000000,

  B00000001, B11000000,

  B00000001, B11000000,

  B00000011, B11100000,

  B11110011, B11100000,

  B11111110, B11111000,

  B01111110, B11111111,

  B00110011, B10011111,

  B00011111, B11111100,

  B00001101, B01110000,

  B00011011, B10100000,

  B00111111, B11100000,

  B00111111, B11110000,

  B01111100, B11110000,

  B01110000, B01110000,

  B00000000, B00110000

};


위와같이 특정 변수들을 define해주셔야 합니다.


그럼 다음시간엔 어떻게 원하는 아이콘을 디스플레이 하는지 배워보도록 할게요ㅎㅎ

안녕하세요~!


이번에 새로 구매하게된 인텔 리얼센스(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 :)


아두이노와 정전압 터치센서를 활용한 센서 제작.


1. 준비물

- 아두이노 Leonardo (호환보드인 Pololu Atmega 32u4 보드 사용)

- 블루투스 HC-06 모듈                                                             

- Lipo 베터리                                                                             

- 정전압 압력 시트 (Adafruit에서 판매)                                       

- 전도성 실                                                                                

- 정전압 센서 모듈(Adafruit에서 판매)                                        



2.재료가 준비되었다면 한번 만들어 봅시다.


우선 오늘은

(1) 아두이노와 터치 모듈(MPR121) 의 I2C 통신


(2) 정전식 터치센서 제작


(3) 제작된 센서와 모듈을 이용한 센서값 읽기


세가지를 해보도록 하겠습니다.


(1)

아두이노와 터치모듈을 사용하기위해서는 I2C (Inter-Integrated Circuit) 통신을 해야한다.

디지털 통신에는 여려가지가 있지만, 주로 사용되는 통신은  Serial 통신, SPI통신, I2C통신,  CAN통신 등이다.

혹시나 다음에 포스팅할 기회가 된다면 통신에 대해 정리를 해보도록 하겠습니다 :)


아두이노와 보드의 연결은 아래와 같이 SCL (클럭핀) 과 SDA(데이터핀) 을 서로 연결하시고,

(아두이노 보드에 보시면 SCL, SDA핀이 있습니다. 실제로 이 핀은 아날로그인풋 4,5핀과 같은 핀이죠)



2번 핀에 연결되는 IRQ 핀은 터치가 입력되었을때 HIGH (1) 신호를 내보냅니다.

아두이노에서는 터치가 없을때 센서값을 읽어들일 이유가 없으므로, 인터럽트핀 (2번핀)에 연결하여 트리거 신호가 있을때만 센서를 읽어들이게 만들죠.


이제 아두이노 코딩을 해볼까요~?

우선 Adafruit 사이트에 가셔서 MPR121 보드에 대한 라이브러리를 다운받으시고,

아두이노 라이브러리 폴더에 저장해두세요! ( 내문서/Arduino/ )

그 다음 File -> Example -> Adafruit MPR121 -> MPR121 test  를 열고나서 업로드를 합니다.

(업로드 시에 board세팅과 USB 포트 세팅은 꼭 확인해보세요! pololu 보드의 경우 Leonardo 입니다!!)


센서가 제대로 동작하는지 확인하기위해서는 시리얼 모니터를 누르면 됩니다.

누르고 나면 아래와 같이 터치가 되었는지, 떨어졌는지를 알수 있죠.


하지만 본 예제에서는 터치가 됬는지, 안됬는지만 나오지만, 사실 우리가 사용해야하는것은 Capacitance의 값이므로, 코드를 손 볼 필요가 있다,


void loop()내의 코드를 자세히 보면 63번 줄에 " return; " 이 있다. 즉, return위까지 코드만 실행하고 그 아랫부분 코드는 실행하지 않은채 다시 루프를 시작한다는 소리다.


만약 이 부분을 지우거나 주석처리 ( //return;)를 하고, 기존의 47번줄 부터 57번줄 (touch release를 프린트하는 부분)도 주석처리를 하시면 아래와 같은 그림이 나옵니다.

 

Base 값은 터치의 유무를 판별하는 Thresh hold value 들이구요, 이 값은 MPR121모듈 자체적으로 적정값에 맞게 가변적으로 세팅이 됩니다.

그리고 저희가 사용해야될 중요한 값은 Filt 값들이에요. 실질적인 Capacitive값들인거죠. 이 값들은 나중에 센서를 제작하고나서 자체적으로 보정을 해줘야합니다.


이번 포스팅은 여기까지입니다.


다음 포스팅에서는 정전식 터치센서를 어떻게 제작하는지 한 번 배우도록 합시다.


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


Have a good time with Arduino :)

+ Recent posts