2016년 8월 2일 화요일

빛 센서 다루기

빛 센서는 여러 종류가 있는데, 이 글에서는 포토 레지스터 혹은 포토 셀이라 불리는 센서를 아두니티에서 다루는 법에 대해 기술하겠습니다.

이 센서는 빛의 밝기에 따라 저항 값이 달라지는 특성을 가지고 있습니다. 이런 특성에 대한 자세한 정보는 해당 부품 제조사가 배포한 데이터 시트에 잘 나와있습니다.
이 센서를 아두이노에서 사용하려면 전압 분배 회로(Voltage Divider)를 꾸며야 합니다.

위 회로에서와 같이 R2를 센서로 대체하면 빛 밝기에 따라 저항 값이 달라지므로 Vout의 크기가 변하게 되어 아두이노 ADC 핀에 의해 숫자로 정보를 얻을 수 있습니다.
문제는 R1 저항의 크기를 어떻게 결정하느냐입니다.
R1의 크기가 너무 작거나 크다면 Vout의 변화가 미비하여 측정된 정보를 활용하기가 어렵습니다.
R1의 가장 적합한 크기는 측정할 빛 밝기 범위의 중간에 해당하는 R2 저항 크기가 될 것입니다. 이렇게 결정된 R1을 등가 저항(Equavalent Resistor)라 부릅니다.
구글에서 검색되는 포토 셀의 아두이노 회로는 이미 이런 것을 생각해 둔 검증된 회로입니다.
일반적으로 사용되는 포토 셀의 회로는 다음과 같습니다.

이 회로를 유니티에서 다룰려면 아두니티 Wire Editor에 다음과 같이 연결하면 됩니다.

위 정보를 아두이노 스케치로 Export하고 보드에 업로드하면 유니티에서 포토 셀을 다룰 수 있는 준비가 끝납니다.
실제로 보드와 유니티를 연결하여 실험을 해보면 빛 밝기에 따라 AnalogInput 값이 달라지는 것을 확인할 수 있지만, 그 변화 값이 제멋대로여서 쓰기가 쉽지 않음을 알 수 있습니다.

InputFilter
필터는 뭔가를 걸러낸다는 뜻이지만, 프로그래밍에서는 가공한다라는 의미로 사용합니다. 빛 센서 회로를 꾸미고, 유니티에서 AnalogInput을 통해 값을 얻었지만 바로 사용하기가 어렵기 때문에 정보 가공이 필요하고, 이런 경우 사용할 수 있는 것이 InputFilter라는 Bridge입니다.


InputFilter는 3가지 필터 기능을 보유하고 있습니다.

  • invert: 반전 필터
  • amplify: 증폭 필터
  • smooth: 노이즈 제거 필터
각 필터 기능은 따로 사용할 수도 있고, 동시에 사용도 가능합니다.

반전 필터는 값을 0을 1, 1을 0으로 뒤집는 것을 의미하며, 마치 사진에서 필름 효과와 비슷합니다.
증폭 필터는 값의 변화를 크게 만들 수 있는 기능으로 사용 여부를 체크 하면 세부 설정을 할 수 있습니다.



증폭시킬 값 범위의 최소 값과 최대 값을 지정하면 0 ~ 1 범위로 증폭시켜서 사용할 수 있습니다. 예를 들면, 원래 값이 0.3 ~ 0.5 범위를 가질 때 최소 값을 0.3, 최대 값을 0.5로 설정하면 0 ~ 1 범위로 변환되는 것입니다.

노이즈 제거 필터는 값이 심하게 흔들릴 때 잡아주는 역할을 합니다.

InputFilter에서 이 기능의 사용 여부를 체크하면 세부 설정을 할 수 있습니다.

sensitivity는 노이즈 제거 정도를 설정하는 항목인데, 다음과 같은 특성을 가지고 있습니다.
  • sensitivity값이 1에 가까울수록 노이즈 제거는 잘 안되지만, 반응 속도가 빨라집니다.
  • sensitivity값이 0에 가까울수록 노이즈 제거는 잘 되지만, 반응 속도는 느려집니다.

InputFilter는 유니티 Play상태에서는 마치 오실로스코프와 같이 신호를 파형으로 볼 수 있는 기능을 제공합니다.

InputFilter를 AnalogInput에 연결하면 가공된 결과를 사용할 수 있습니다.

실제 활용을 다음 영상을 통해 확인할 수 있습니다.


댓글 6개:

  1. 혹시 심박센서도 같은원리로 될까요?

    답글삭제
    답글
    1. 심박센서는 심장 박동에 따른 전기적 신호를 Analog 입력으로 활용하는 장치입니다.
      InputFilter는 입력되는 신호를 증폭시키거나 노이즈를 제거할 때 사용하는데, 심박 센서 입력이 좀 작다면 증폭 기능이 도움이 될 것입니다. 그러나, 노이즈 제거는 심장 박동을 상쇄시킬 수 있어서 별로 좋지 않을 것 같습니다.
      심박 센서와 빛 센서는 특성과 사용 용도가 달라 동일하게 사용하는 것은 무리가 있어 보입니다.
      어쨌든, 위 예제에서 사용한 기술은 심박 센서에도 적용될 수 있습니다.

      삭제
    2. 그럼 심박센서에서 받는 연속적인 심박 BPM값을 유니티신호로 받아와서 게임에 활용도 가능하겠죠?

      삭제
    3. AnalogInput을 사용하면 심박센서의 신호를 받아올 뿐입니다.
      그것을 바탕으로 BPM을 계산하면 질문하신 내용대로 가능합니다.
      BPM을 유니티 측에서 계산하려면 시리얼 연결인 경우 최대 60fps 갱신 속도가 나오므로 가능합니다.
      그러나, 무선 연결 등은 20fps 정도밖에 안되기때문에 BPM 계산이 정확하지 않을 수 있습니다.
      이런 경우 아두이노 보드단에서 BPM 계산을 완료한 후 결과만 유니티에 전송한다면 통신 지연과 상관없이 사용할 수 있습니다.
      아직 아두이노에서 BPM계산 기능은 아두니티에 들어있지 않습니다.
      곧 ArduinityController를 직접 만드는 글을 연재할 예정이니 그것을 보시고 도전하시거나 심박 센서 관련 기능을 아두니티에 넣을 때까지 기다리셔야 합니다.

      삭제
    4. 아 그렇군요 !! 기다리고있겠습니다 감사합니다!!

      삭제
  2. 아두이노 ide에서는 빛 센서에 대한 프로그램을 작성할 필요가 없나요?

    답글삭제